Tomado directamente del ACM Winter Programming Contest 2013. Eres una persona a la que le gusta tomar las cosas literalmente. Por lo tanto, para ti, el fin del mundo es ed; las últimas letras de "El" y "Mundo" se concatenaron.
Cree un programa que tome una oración y envíe la última letra de cada palabra en esa oración en el menor espacio posible (la menor cantidad de bytes). Las palabras se separan con cualquier cosa que no sean letras del alfabeto (65 - 90, 97 - 122 en la tabla ASCII). Eso significa que los subrayados, tildes, tumbas, llaves, etc. son separadores. Puede haber más de un separador entre cada palabra.
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
-> flvmrp
pigs, eat dogs; eat Bob: eat pigs
-> ststbts
looc si siht ,gnitirw esreveR
-> citwR
99_bottles_of_beer_on_the_wall
->sfrnel
Respuestas:
Perl 5, 18 bytes
Requiere un
-p
interruptor de línea de comando. La propiedad nombradaL
solo coincide con caracteres de letrasA-Za-z
. Hay varios cientos de propiedades con nombre, pero cuando se trata de texto ASCII, muy pocas de ellas son interesantes. Además\pL
, el único otro de cualquier nota real es\pP
, que coincide con la puntuación.Pruébalo en línea!
Perl 5, 17 bytes
Una mejora de un byte por Dom Hastings
Requiere
-n
(y-l
para admitir múltiples entradas).Pruébalo en línea!
Uso de la muestra
fuente
\w
también coincide con dígitos y guiones bajos.|.
no lo era (al menos para mí).-1
enprint/\pL*(\pL)/g
, parece salida de la misma para los casos de prueba!ed, 35 caracteres
Entonces, el mundo termina en ed. Como me gusta ser demasiado literal, decidí escribir para escribir la solución con ed, y aparentemente es en realidad un lenguaje de programación . Es sorprendentemente corto, incluso considerando que ya existen muchas soluciones más cortas en este hilo. Sería mejor si pudiera usar algo diferente
[a-zA-Z]
, pero teniendo en cuenta que ed no es un lenguaje de programación, en realidad es lo suficientemente bueno.Primero, me gustaría decir que esto solo analiza la última línea del archivo. Sería posible analizar más, simplemente escriba
,
al comienzo de las dos primeras líneas (esto especifica el rango "todo", en oposición al rango estándar de la última línea), pero eso aumentaría el tamaño del código a 37 caracteres.Ahora para explicaciones. La primera línea hace exactamente lo que hace la solución Perl (excepto sin soporte para caracteres Unicode). No he copiado la solución Perl, solo inventé algo similar por coincidencia.
La segunda línea imprime la última línea, para que pueda ver la salida. La tercera línea obliga a abandonar: tengo que hacerlo; de lo contrario
ed
, imprimiría?
para recordarle que no ha guardado el archivo.Ahora para saber cómo ejecutarlo. Bueno, es muy simple. Simplemente ejecute
ed
con el archivo que contiene el caso de prueba, mientras canalizo mi programa, así.-s
Es silencioso. Esto evita que seed
muestre un tamaño de archivo feo al principio. Después de todo, lo uso como un script, no como editor, por lo que no necesito metadatos. Si no hiciera eso, ed mostraría un tamaño de archivo que no podría evitar de otra manera.fuente
Javascript, 49
Utiliza una expresión regular para eliminar todos los caracteres que aparecen antes de una letra, así como todos los caracteres que no son letras. Luego nos queda la última letra de cada palabra.
Gracias a tomsmeding por una buena mejora.
fuente
alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
C, 78
Golfizado:
Con espacios en blanco:
Salida:
fuente
c
:main(c,s)char**s;{for
GNU Sed,
403837Pruebas
Ejecute sed:
Salida:
Explicación
La primera sustitución reemplaza todos los límites de palabras, precedidos por el grupo de coincidencia deseado, con una nueva línea. Esto facilita la eliminación de todos los caracteres extraños en la segunda sustitución.
Editar
fuente
sed
'ss
comando tienei
bandera para casos coincidencia insensible:s/[a-z]\b/&\n/gi
.\b
considera_
s como letras, por lo que si alguna de las palabras en la prueba TERMINA con_
, la última letra de esa palabra no se incluye en la salidaGrep and Paste,
363428Si se necesita una nueva línea final, reemplácela
tr -d \\n
conpaste -sd ''
.Editar
tr
lugar depaste
(-4), gracias manatwork .fuente
paste -sd ''
, perotr -d \\n
es más corto. En lo que respectagrep
, tiene-i
sentido interruptor de “ignorar el caso”, lo que puede hacer que sea más corto:grep -io '[a-z]\b'
.tr
también elimine la nueva línea final. El modo insensible a mayúsculas y minúsculas es, por supuesto, más corto, gracias.sed, 37 caracteres
Igual longitud a la respuesta de Thor , pero, creo, más simple.
La lógica es bastante trivial: reemplace las secuencias de letras con su última letra, luego elimine todas las que no sean letras.
fuente
Mathematica, 39
Prueba:
fuente
LetterQ
debería llamarseLettersQ
:) No lo he pensado para probar cadenas enteras.K, 49
.
fuente
Scala, 59 (o 43)
Suponiendo que la cadena ya está en
s
:Si es necesario leer desde una línea e imprimir en lugar de utilizar la salida REPL, convertido
s
areadLine
y envolver enprintln()
el 59.fuente
x86: 54 bytes
Asuma una rutina cdecl con la firma
void world_end(char *input, char *output)
:fuente
Xi, 32
Xi es un lenguaje aún en su fase beta, pero parece funcionar bien con el código de golf, así que pensé que podría mostrar otra solución corta y funcional (y anunciar el idioma un poco :-)).
fuente
Mathematica
625752Pruebas
fuente
Python3, 59 caracteres
Trata correctamente con letras mayúsculas y guiones bajos. El 2 es pasar
re.sub
lare.IGNORECASE
bandera sin tener que usarre.I
.fuente
Python, 76 caracteres
import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))
fuente
print
.import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Python 3.x, 64 bytes
fuente
for
.Lua, 42
Ejemplo de uso:
lua script.lua "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
fuente
Mathematica
71474561De vuelta al tablero de dibujo, después de que @belisarius encontró un error en el código.
Pruebas
fuente
\\w
coincide_
, por lo que no funciona (por ejemplo)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
me daflvmrp
, pero#~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
vuelvefvmrp
aquí. ¿Estamos obteniendo los mismos resultados?Pitón 2,
88 80 75 6968Entrada:
435_ASDC__uio;|d re;fG o55677jkl..f
Salida:
CodeGolf
Esta solución se puede acortar a 67 caracteres si permite que la salida incluya caracteres de retroceso (código ASCII 8) al principio. La salida será visualmente idéntica.
Misma entrada, (visualmente) la misma salida.
<BS>
está destinado a ser el carácter de retroceso.fuente
DO#
Método, 105 bytes: (asume usos para System, System.Text.RegularExpressions y System.Linq)
Programa, 211 bytes:
fuente
VBA,
147161fuente
Ruby 2.0, 25 (+1) caracteres
Debe ejecutarse con el
-p
interruptor:fuente
ruby
versión. 1.9.2 salidas "# <Enumerator: 0x9f65e10> # <Enumerator: 0x9f65d98> # <Enumerator: 0x9f65d34> # <Enumerator: 0x9f65cd0>".ruby 2.0.0p0 (2013-02-24 revision 39474
). ¡Al ejecutar el programa con la versión 1.8.7, genera un valor ASCII! No sabía que había tantas diferencias entre las versiones.gsub(/(\w+)\W*/){$1[-1]}
.Retina , 16 bytes
Pruébalo en línea!
Explicación
fuente
Retina , 20 bytes
Pruébalo en línea
Este programa es compatible con la versión 0.8.2
fuente
Java 8, 43 bytes
La respuesta de Retina del puerto de @ mbomb007 .
Explicación:
Pruébalo en línea.
Explicación adicional para la expresión regular:
fuente
(?i)
para la bandera.Smalltalk , Squeak / Pharo sabor
122 char con formato tradicional para este método agregado a String:
62 caracteres en Pharo 1.4, con expresiones regulares y formato extraño
fuente
J: 60 caracteres (o 38 caracteres para una versión menos correcta)
Si estamos dispuestos a dejar que el programa se interrumpa siempre que haya palabras que terminen en dos puntos o un guión bajo, entonces podemos simplificar esto a 38 caracteres.
Ejecución de muestra:
fuente
(#~[:2&|64 90 96 122&I.@(u:inv)){:&>;:
, o 43 bytes para una versión no explícita:(#~[:2&|64 90 96 122&I.@(u:inv))@:({:@>)@;:
. Utiliza el verbo de índice de intervaloI.
, que se interpreta64 90 96 122
como el conjunto de intervalos(__, 64] (64, 90], (90, 96], (96, 122], (122, _)
, y devuelve el índice del iterval al que pertenece su argumento, el código ascii del carácter. Si este índice es impar, no es alfabético.;:
interpretaabc_
como una palabra, ya que los nombres de las variables pueden contener guiones bajos. +10 bytes para agregar(#~~:&'_')
, probablemente una solución ineficiente'_'-.~
o algo similar.Está en PHP . 197 bytes :( Soy principiante
EDITADO Ahora son 171 bytes
fuente
foreach((' ',preg_replace('/(\W|_)+/',' ',$_GET['line'])) as $d){$a=substr($d,-1,1);$o=ORD();if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){echo $a;}}
es 149, si funciona.\W|_
excluye dígitos; por lo que debe agregar\d
a su expresión regular o uso/[^a-z]+/i
K 30
fuente
Japt v2, 16 bytes
Intentalo
fuente
f"%l(?!%l)" q
(no funciona en v2 porque al analizador no le gusta(?
)