Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

292
Vistas
¿Código de Ruby corto y eficiente para transformar una matriz de palabras en cadenas aleatorias y separadas por comas, con un "y" antes de la última palabra?

Me gustaría transformar dicha matriz:

 ["apple","banana","pineapple","plum","pear"]

para

 I like plum, pineapple, banana, pear *and* apple.

Mi código actual es como:

 %Q{ I like #{%w[apple banana pineapple plum pear].shuffle.yield_self{|q| [q[0..-2].join(", "),q[-1]].join(" and ") }} }

¿Hay algún enfoque más %w[limpio inteligente, más corto, eficiente, rubyesco].mágico()?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

No sé si esto es más inteligente o más limpio, pero aquí vamos:

 def to_sentence(ary) ary = ary.dup.shuffle [ary.pop, ary.join(', ')].reverse.join(' and ') end
over 4 years ago · Santiago Trujillo Denunciar

0

Me gustaría ofrecer dos soluciones. Ninguno muta la matriz que se pasa al método como argumento.

 arr = ["apple", "banana", "pineapple", "plum", "pear"]

#1

 def to_sentence(arr) *all_but_last, last = arr.shuffle all_but_last.join(', ') << ' and ' << last end
 to_sentence(arr) #=> "pear, plum, pineapple, apple and banana" to_sentence(arr) #=> "banana, pear, pineapple, plum and apple" to_sentence(arr) #=> "banana, plum, apple, pineapple and pear" to_sentence(arr) #=> "banana, pineapple, pear, apple and plum"

#2

 def to_sentence(arr) arr.shuffle.join(', ').sub(/,(?!.*,)/, ' and') end
 to_sentence(arr) #=> "banana, plum, pear, apple and pineapple" to_sentence(arr) #=> "pear, plum, pineapple, banana and apple" to_sentence(arr) #=> "apple, pineapple, plum, pear and banana" to_sentence(arr) #=> "apple, plum, pear, pineapple and banana"

La expresión regular coincide con una coma que no va seguida de otra coma en la cadena (es decir, coincide con la última coma de la cadena). (?!.*,) es una anticipación negativa .

La expresión regular también podría escribirse

 /.*\K,/

.* coincide con cualquier carácter que no sea un terminador de línea, tantos como sea posible (incluidas las comas), porque * es por defecto codicioso . \K luego restablece el inicio de la coincidencia a la ubicación actual en la cadena (justo antes de la última coma) y descarta los caracteres consumidos previamente de la coincidencia que se devuelve. Luego se empareja una coma, que necesariamente es la última coma de la cadena.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda