El mundo termina en ed.

21

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

beary605
fuente
¿Podría agregar un caso de prueba que incluya dígitos y guiones bajos?
grc
10
El mundo termina en ed? ¡ Sabía que Vim y Emacs no podían estar a la altura!
Joe Z.
Bueno, el ensayo "los hombres de verdad usan la educación" ha sido parte de la distribución de Emacs desde que tengo memoria.
JB
¿Las entradas serán solo ASCII?
Phil H

Respuestas:

16

Perl 5, 18 bytes

s/\pL*(\pL)|./$1/g

Requiere un -pinterruptor de línea de comando. La propiedad nombrada Lsolo coincide con caracteres de letras A-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

print/\pL*(\pL)/g

Requiere -n(y -lpara admitir múltiples entradas).

Pruébalo en línea!


Uso de la muestra

$ more in.dat
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
pigs, eat dogs; eat Bob: eat pigs
looc si siht ,gnitirw esreveR
99_bottles_of_beer_on_the_wall

$ perl -p ends-in-ed.pl < in.dat
flvmrp
ststbts
citwR
sfrnel
primo
fuente
Creo que \wtambién coincide con dígitos y guiones bajos.
grc
Hmm, de hecho. Eso tendrá que ser actualizado.
primo
2
Brillante. Regex era una solución obvia, pero |.no lo era (al menos para mí).
Peter Taylor
1
Sólo notado una -1en print/\pL*(\pL)/g, parece salida de la misma para los casos de prueba!
Dom Hastings
18

ed, 35 caracteres

s/[a-zA-Z]*\([a-zA-Z]\)\|./\1/g
p
Q

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 edcon el archivo que contiene el caso de prueba, mientras canalizo mi programa, así.

ed -s testcase < program

-sEs silencioso. Esto evita que se edmuestre 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.

Konrad Borowski
fuente
Instalé ed solo para probar esto.
primo
6

Javascript, 49

alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))

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.

grc
fuente
3
Probablemente pueda mejorar esto haciendo que la expresión regular no distinga entre mayúsculas y minúsculas, como en:alert(prompt().replace(/.(?=[a-z])|[^a-z]/gi,''))
tomsmeding
6

C, 78

Golfizado:

main(int c,char**s){for(;c=*s[1]++;)isalpha(c)&&!isalpha(*s[1])?putchar(c):0;}

Con espacios en blanco:

main(int c,char**s)
{
  for(;c=*s[1]++;)
    isalpha(c)&&!isalpha(*s[1])?putchar(c):0;
}

Salida:

ingrese la descripción de la imagen aquí

JoeFish
fuente
1
Puede guardar 4 bytes utilizando la declaración K&R y el valor predeterminado c:main(c,s)char**s;{for
Toby Speight
5

GNU Sed, 40 38 37

s/[a-z]\b/&\n/g; s/[^\n]*\(.\)\n/\1/g

Pruebas

cat << EOF > data.txt
asdf jkl;__zxcv~< vbnm,.qwer| |uiop
pigs, eat dogs; eat Bob: eat pigs
looc si siht ,gnitirw esreveR
EOF

Ejecute sed:

sed 's/[A-Za-z]\b/&\n/gi; s/[^\n]*\(.\)\n/\1/g' data.txt

Salida:

flvmrp
ststbts
citwR

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

  • Use una marca que no distinga entre mayúsculas y minúsculas (-2), gracias por su trabajo .
  • No cuente los espacios en blanco (-1).
Thor
fuente
sed's scomando tiene ibandera para casos coincidencia insensible: s/[a-z]\b/&\n/gi.
manatwork
@manatwork: buen punto, esto lo haría solo GNU sed, pero parece que ya lo es, gracias.
Thor
\bconsidera _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 salida
Marty Neal
3

Grep and Paste, 36 34 28

> echo 'asdf jkl;__zxcv~< vbnm,.qwer| |uiop' | grep -io '[a-z]\b' | tr -d \\n
flvmrp

> echo 'pigs, eat dogs; eat Bob: eat pigs'   | grep -io '[a-z]\b' | tr -d \\n
ststbts

echo 'looc si siht ,gnitirw esreveR'         | grep -io '[a-z]\b' | tr -d \\n
citwR

Si se necesita una nueva línea final, reemplácela tr -d \\ncon paste -sd ''.

Editar

  • Utilice grep que no distinga entre mayúsculas y minúsculas (-2), gracias manatwork .
  • Use en trlugar de paste(-4), gracias manatwork .
  • No cuente los espacios en blanco alrededor de la tubería (-2).
Thor
fuente
Muy creativo con eso paste -sd '', pero tr -d \\nes más corto. En lo que respecta grep, tiene -isentido interruptor de “ignorar el caso”, lo que puede hacer que sea más corto: grep -io '[a-z]\b'.
manatwork
@manatwork, trtambién elimine la nueva línea final. El modo insensible a mayúsculas y minúsculas es, por supuesto, más corto, gracias.
Thor
no hay una regla que requiera una nueva línea final.
manatwork
@manatwork: Estoy de acuerdo con eso, respuesta actualizada.
Thor
3

sed, 37 caracteres

Igual longitud a la respuesta de Thor , pero, creo, más simple.

s/[a-z]*\([a-z]\)/\1/ig;s/[^a-z]*//ig

La lógica es bastante trivial: reemplace las secuencias de letras con su última letra, luego elimine todas las que no sean letras.

Ugoren
fuente
3

Mathematica, 39

""<>StringCases[#,(__~~x_)?LetterQ:>x]&

Prueba:

""<>StringCases[#,(__~~x_)?LetterQ:>x]& /@
 {"asdf jkl;__zxcv~< vbnm,.qwer| |uiop",
  "pigs, eat dogs; eat Bob: eat pigs",
  "looc si siht ,gnitirw esreveR",
  "99_bottles_of_beer_on_the_wall"}
{"flvmrp", "ststbts", "citwR", "sfrnel"}
Señor mago
fuente
Bueno LetterQdebería llamarse LettersQ:) No lo he pensado para probar cadenas enteras.
Dr. belisario
@belisarius En realidad, con esta construcción se aplica en términos de caracteres, por lo que podría ser una literal "LetterQ" y seguir funcionando.
Mr.Wizard
2

K, 49

{last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}

.

k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
"flvmrp"
k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"pigs, eat dogs; eat Bob: eat pigs"
"ststbts"
k){last'f@&"b"$#:'f:"|"\:@[x;&~x in,/.Q`a`A;:;"|"]}"looc si siht ,gnitirw esreveR"
"citwR"
tmartin
fuente
2

Scala, 59 (o 43)

Suponiendo que la cadena ya está en s:

s.split("[^a-zA-Z]+").map(_.last).mkString

Si es necesario leer desde una línea e imprimir en lugar de utilizar la salida REPL, convertido sa readLiney envolver en println()el 59.

Rex Kerr
fuente
2

x86: 54 bytes

Asuma una rutina cdecl con la firma void world_end(char *input, char *output):

60 8b 74 24 24 8b 7c 24 28 33 d2 8a 0e 8a c1 24
df 3c 41 72 08 3c 5a 77 04 8a d1 eb 09 84 d2 74
05 88 17 47 33 d2 46 84 c9 75 e0 84 d2 74 03 88
17 47 88 0f 61 c3
usuario1354557
fuente
1
Por cierto, me doy cuenta de que la pregunta pide un programa y no una rutina , pero quería hacer algo diferente. Al contrario de lo que dice el problema, creo que no soy una "persona a la que le gusta tomar las cosas literalmente" después de todo. : P
user1354557
2

Xi, 32

println$ @{=>.-1}<>input re"\W+"

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 :-)).

arshajii
fuente
2

Mathematica 62 57 52

Row@StringTake[StringCases[#,LetterCharacter..],-1]&

Pruebas

l = {"asdf jkl;__zxcv~<vbnm,.qwer| |uiop", 
     "pigs,eat dogs;eat Bob:eat pigs", 
     "looc si siht,gnitirw esreveR"}

Row@StringTake[StringCases[#,LetterCharacter..],-1]&/@ l
(*{flvmrp,ststbts,citwR}*)
Dr. belisario
fuente
Edité el suyo por error, pero luego lo volví a tirar. Ooops
DavidC
2

Python3, 59 caracteres

import re;print(re.sub('.(?=[a-z])|[^a-z]','',input(),0,2))

Trata correctamente con letras mayúsculas y guiones bajos. El 2 es pasar re.subla re.IGNORECASEbandera sin tener que usar re.I.

Nolen Royalty
fuente
2

Python, 76 caracteres

import re;print "".join(re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",raw_input()))

indrajeet
fuente
Puede eliminar el espacio después print.
flornquake
Acortar portando a Python 3:import re;print(*re.findall("([a-zA-Z])(?=$|[^a-zA-Z])",input()),sep='')
Steven Rumbalski
1

Python 3.x, 64 bytes

import re;print(''.join(a[-1] for a in re.split('\W+',input())))
Michael0x2a
fuente
2
El último ejemplo no está funcionando. Además, se produce un error si la línea comienza o termina con un separador
AMK
Puedes eliminar el espacio antes for.
Bakuriu
1

Lua, 42

print(((...):gsub('.-(.)%f[%A]%A*','%1')))

Ejemplo de uso: lua script.lua "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"

Egor Skriptunoff
fuente
1

Mathematica 71 47 45 61

De vuelta al tablero de dibujo, después de que @belisarius encontró un error en el código.

StringCases[#, RegularExpression["[A-Za-z](?![A-Za-z])"]] <> "" &

Pruebas

l = {"asdf jkl;__zxcv~<vbnm,.qwer| |uiop", "asdf jkl__zxcv~<vbnm,.qwer| |uiop", 
"pigs,eat dogs;eat Bob:eat pigs", "looc si siht,gnitirw esreveR"};

StringCases[#, RegularExpression["[A-Za-z](?![A-Za-z])"]] <> "" & /@ l

{"flvmrp", "flvmrp", "ststbts", "citwR"}

DavidC
fuente
\\wcoincide _, por lo que no funciona (por ejemplo)"asdf jkl__zxcv~<vbnm,.qwer| |uiop"
Dr. belisarius
Espera Row@StringTake[ StringCases[#, LetterCharacter ..], -1] &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"me da flvmrp, pero #~StringCases~RegularExpression@"\\w\\b" <> "" &@"asdf jkl__zxcv~<vbnm,.qwer| |uiop"vuelve fvmrpaquí. ¿Estamos obteniendo los mismos resultados?
Dr. belisario
@belisarius Tenías razón sobre el error en mi versión anterior. ¡Lo estaba probando con la cadena incorrecta!
DavidC
Jeje, +1 otra vez
Dr. belisario
@belisarius chicos, por favor vean la respuesta que publiqué. Si es correcto, es más corto.
Mr.Wizard
1

Pitón 2, 88 80 75 69 68

s=p=''
for c in raw_input()+' ':a=c.isalpha();s+=p[a:];p=c*a
print s

Entrada: 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.

s=p='<BS>'
for c in raw_input()+p:a=c.isalpha();s+=p[a:];p=c*a
print s

Misma entrada, (visualmente) la misma salida. <BS>está destinado a ser el carácter de retroceso.

flornquake
fuente
1

DO#

Método, 105 bytes: (asume usos para System, System.Text.RegularExpressions y System.Linq)

string R(string i){return string.Concat(Regex.Split(i,"[^a-zA-Z]").Where(x=>x!="").Select(n=>n.Last()));}

Programa, 211 bytes:

using System;using System.Text.RegularExpressions;using System.Linq;class A{static void Main(){Console.WriteLine(string.Concat(Regex.Split(Console.ReadLine(),"[^a-zA-Z]").Where(x=>x!="").Select(n=>n.Last())));}}
Es notalie.
fuente
1

VBA, 147161

Sub a(s)
For n=0 To 255:m=Chr(n):s=Replace(s,IIf(m Like"[A-Za-z]","",m)," "):Next
For Each r In Split(s," "):t=t & Right(r,1):Next
MsgBox t
End Sub
Gaffi
fuente
1

Ruby 2.0, 25 (+1) caracteres

gsub(/(\w+)\W*/){$1[-1]}

Debe ejecutarse con el -pinterruptor:

 $ ruby -p ed.rb <<< "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
flvmrp
daniero
fuente
Por favor especifique la rubyversión. 1.9.2 salidas "# <Enumerator: 0x9f65e10> # <Enumerator: 0x9f65d98> # <Enumerator: 0x9f65d34> # <Enumerator: 0x9f65cd0>".
manatwork
Tienes razón. Había olvidado por completo que lo instalé, pero mi versión actual de Ruby es 2.0 ( 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.
daniero
Gracias, definitivamente tendré que actualizar mi Ruby. (. Tanto el intérprete y el conocimiento) El segundo grupo de captura no es necesario: gsub(/(\w+)\W*/){$1[-1]}.
manatwork
Oh, por supuesto que no. Gracias, actualizado :)
daniero
1

Retina , 16 bytes

Li, -1|""`[a-z]+

Pruébalo en línea!

Explicación

Li, -1|""`[a-z]+
L         [a-z]+        List all the sequences of letters in the input
 i                      case insensitive
  ,                     Keep all the results
    -1                  but only the last character for each of them
      |""               Use the empty string as separator
León
fuente
1

Java 8, 43 bytes

s->s.replaceAll("(?i).(?=[a-z])|[^a-z]","")

La respuesta de Retina del puerto de @ mbomb007 .

Explicación:

Pruébalo en línea.

s->  // Method with String as both parameter and return-type
  s.replaceAll("(?i).(?=[a-z])|[^a-z]","")
     //  Remove every match of this regex, and return as result

Explicación adicional para la expresión regular:

"(?i).(?=[a-z])|[^a-z]"  // Main regex to match
 (?i)                    //  Case insensitive
     .                   //   Any character
      (?=[a-z])          //   Followed by a letter (as positive look-ahead)
               |[^a-z]   //   or a non-letter

""                       // Replace it with: nothing
Kevin Cruijssen
fuente
1
Eso es en realidad (?i)para la bandera.
Jakob
0

Smalltalk , Squeak / Pharo sabor
122 char con formato tradicional para este método agregado a String:

endOfWords
    ^(self subStrings: (CharacterSet allCharacters select: #isLetter) complement) collect: #last as: String

62 caracteres en Pharo 1.4, con expresiones regulares y formato extraño

endOfWords^''join:(self regex:'[a-zA-Z]+'matchesCollect:#last)
aka.nice
fuente
0

J: 60 caracteres (o 38 caracteres para una versión menos correcta)

(#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0

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.

(#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:

Ejecución de muestra:

    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'asdf jkl;__zxcv~< vbnm,.qwer| |uiop'
flvmrp
    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'pigs, eat dogs; eat Bob: eat pigs'
ststbts
    (#~e.&(,26&{.&(}.&a.)"0(97 65))){:&>;:]`(' '"_)@.(e.&'_:')"0'99_bottles_of_beer_on_the_wall'
sfrnel
SL2
fuente
1
38 Bytes (para una versión correcta): (#~[: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 intervalo I., que se interpreta 64 90 96 122como 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.
Bolce Bussiere
@BolceBussiere no funciona con guiones bajos por alguna razón (último caso de prueba).
FrownyFrog
@FrownyFrog ah, ya veo por qué, ;:interpreta abc_como una palabra, ya que los nombres de las variables pueden contener guiones bajos. +10 bytes para agregar (#~~:&'_'), probablemente una solución ineficiente
Bolce Bussiere
@BolceBussiere eso es justo '_'-.~o algo similar.
FrownyFrog
0

Está en PHP . 197 bytes :( Soy principiante

$l=$_GET['line'];
$l=preg_replace('/(\W|_)+/',' ',$l);
$s=explode(' ',$l);
foreach($s as $d){
$a=substr($d,-1,1);
$o=ORD($a);
if(($o>=97 && $o<=122) || ($o>=65 && $o<=90)){
echo $a;
  }
}

EDITADO Ahora son 171 bytes

<?$l=$_GET['l'];$l=preg_replace('/(\W|_)+/',' ',$l);$s=explode(' ',$l);foreach($s as $d){$a=substr($d,-1,1);$o=ORD($a);if(($o>=97&&$o<=122)||($o>=65&&$o<=90)){echo$a;}}
Sasori
fuente
1
Para el golf, debe reducir lo más posible sus nombres de variables a caracteres individuales como mínimo.
Gaffi
1
editado. Gracias por decírmelo. Soy nuevo aquí.
Sasori
Seguro. Es posible que también desee buscar aquí ayuda adicional específica de PHP.
Gaffi
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.
Urna de pulpo mágico
\W|_excluye dígitos; por lo que debe agregar \da su expresión regular o uso/[^a-z]+/i
Titus
0

K 30

q)k)f:{x@&-1=-':(1_x," ")in,/.Q`a`A}
q)f "asdf jkl;__zxcv~< vbnm,.qwer| |uiop"
"flvmrp"
q)f "pigs, eat dogs; eat Bob: eat pigs"
"ststbts"
q)f "looc si siht ,gnitirw esreveR"
"citwR"
q)f "99_bottles_of_beer_on_the_wall"
"sfrnel"
rrr
fuente
0

Japt v2, 16 bytes

r/\L*\l+)\L*/@YÌ

Intentalo

Lanudo
fuente
Creo que puedes hacerlo f"%l(?!%l)" q(no funciona en v2 porque al analizador no le gusta (?)
ETHproductions