Encontré esta pregunta en SO y pensé que sería un buen desafío de golf. Asi que aqui esta:
Desafío:
Escriba un programa que lea una secuencia de cadenas de caracteres, una por línea, y genere una lista de todas las posiciones donde cada cadena tiene el mismo carácter.
Entrada y salida:
La entrada consta de una o más líneas de caracteres ASCII imprimibles sin espacios en blanco, cada uno seguido de una nueva línea. Usted puede asumir que todas las líneas de entrada tienen la misma longitud. La nueva línea no debe considerarse parte de la entrada (es decir, no debe salir como un carácter coincidente).
Ejemplo de entrada (descaradamente robado de la pregunta SO):
abcdefg
avcddeg
acbdeeg
Después de leer la entrada, su programa debe imprimir las posiciones de cada columna coincidente y los caracteres que contienen. (Su programa puede, pero no necesariamente, dejar de leer más entradas si puede determinar antes que no hay columnas coincidentes). Se permite cualquier formato de salida razonable; en particular, puede usar indexación basada en 0 o en 1 para las posiciones.
Ejemplo de salida para la entrada anterior (usando indexación basada en 0):
0: a
3: d
6: g
Puntuación:
Este es el código de golf, por lo que gana la respuesta más corta. En caso de empate, se pueden otorgar caracteres fraccionarios de desempate por características adicionales:
- −½ caracteres para manejar correctamente las líneas de entrada de longitud desigual. (La salida no debe contener posiciones más allá del final de la línea de entrada más corta).
- −¼ caracteres para manejar correctamente la entrada que consiste en caracteres Unicode codificados UTF-8 arbitrarios.
Para inspirarte, puedes encontrar algunas soluciones no protegidas en la pregunta SO (ver arriba).
Aclaraciones:
Simplemente concatenar las posiciones y los caracteres, como en
0a3d6g
, no cuenta como "salida razonable". Debe proporcionar algún tipo de separador (como un espacio) entre cada elemento de la salida para que pueda analizarse sin ambigüedades.La entrada se proporcionará en la secuencia de entrada estándar (
stdin
), o utilizando cualquier mecanismo de entrada de archivo de texto que sea más natural para el idioma que elija. (Si el idioma elegido no tiene un mecanismo natural para la entrada de archivos, haga lo que parezca más cercano en espíritu).La entrada finaliza cuando no hay más datos para leer (es decir, cuando se produce una condición de fin de archivo). Si lo desea, puede requerir que la entrada se termine con una línea en blanco (que luego no debe contar como parte de la entrada, obviamente). Si lo hace, menciónelo en su respuesta para que otros puedan proporcionar información correcta para la prueba.
Cada línea de entrada, incluida la última, termina con un carácter de nueva línea. Su respuesta no debe informar esta nueva línea como una columna coincidente. (Está bien si su solución también puede manejar la entrada donde la última línea no termina en una nueva línea, pero eso no es necesario).
Respuestas:
APL, 25 caracteres
Usé Dyalog APL (versión 13) como mi intérprete. Maneja entradas de longitud desigual y caracteres Unicode (UTF-8).
Ejemplos:
Explicación, algo de derecha a izquierda:
⍵
.0=⍴⍵:⍬
es nuestra primera expresión, y verifica si hemos obtenido una línea vacía (es decir, hemos terminado). Utiliza un protector (una construcción familiar para muchos programadores funcionales) para ejecutar condicionalmente la expresión a la derecha del colon. En este caso, si 0 es igual a la forma / longitud (⍴
) del argumento correcto, devolvemos el conjunto vacío (⍬
).⋄
separa las dos expresiones dentro de la función. Si la expresión anterior no fue evaluada (y por lo tanto no devolvió nada), pasamos a la siguiente expresión.∇
). El argumento de la función es una línea de entrada del usuario no evaluada, dada por quote-quad (⍞
).⊂⍵,⍨¨⍳⍴⍵
crea pares para cada carácter en la cadena, donde el primer elemento de cada par es su posición en la cadena, y su segundo elemento es el carácter.⍳⍴⍵
da un vector de 1 a⍴⍵
, o la longitud de la cadena de entrada.⍵,⍨¨
aplica la función de concatenación conmutada (,⍨
) a cada¨
elemento ( ) a su izquierda (⍵
, en este caso, la entrada del usuario) y derecha. Al conmutar la función de concatenación, se intercambian sus argumentos izquierdo y derecho.⊂
, para que podamos diferenciar entre líneas de entrada.⍞
)./
) nuestro vector resultante de vectores de pares usando la función de intersección (∩
), produciendo los pares que se encuentran en todos los sub-vectores.fuente
Golfscript (28 caracteres)
Hay problemas con el juego de caracteres al pasar Unicode, por lo que no hay bonificación de cuarto de punto.
fuente
J,
57514440 caracteresLlego allí lenta pero seguramente. Esto todavía está lejos de ser ideal, aunque creo.
Estaba seguro de que usar un gancho sería la respuesta, pero desafortunadamente no (44 caracteres):
Es posible que necesite un método completamente diferente para acortarme.
fuente
Haskell, 64 personajes
Maneja líneas de longitud desigual. El soporte Unicode depende de la configuración regional actual.
Salida de ejemplo:
fuente
Python 2, puntaje 81.5 (
11694868382 bytes menos bono)fuente
[:-1]
no es necesario a menos que elimine una nueva línea extraña al final de la entrada (que ni siquiera parece estar allí en la pregunta).zip(*sys.stdin)
es[('a', 'a', 'a'), ('b', 'v', 'c'), ('c', 'c', 'b'), ('d', 'd', 'd'), ('e', 'd', 'e'), ('f', 'e', 'e'), ('g', 'g', 'g'), ('\n', '\n', '\n')]
. No veo una forma de evitar evitar quitar esa última tupla de nuevas líneas. Por favor corrígeme si he entendido mal. Gracias por el voto a favor.[:-1]
. Por ejemplozip([1,2,3,4],[1,2,3])=> [(1, 1), (2, 2), (3, 3)]
(Bash) Shell Scripting, 105 caracteres
Si alguien tiene más trucos para esto, ¡no dudes en comentar!
Resultado:
fuente
/tmp/cols.sh: line 2: [1: command not found
y nada más.[
; y $ {y: 3} hará que solo funcione con exactamente 3 líneas de entrada. Arreglar y optimizar los rendimientos (100 caracteres)while((++i%`tail -1 $1|wc -c`));do x=`cut -c$i $1`;((`uniq|wc -l`==1))<<<"$x"&&echo $i ${x: -1};done
y usar valores predeterminados debería permitir guardar uno más confor((;++i<`tail -1 $1|wc -c`;))do
pero hay un error no corregido en bash.Perl, 87 caracteres (−½ char bonus de desempate)
Aquí hay una versión de golf de mi propia solución del hilo SO :
A diferencia de la versión SO, esta utiliza índices basados en 1 para la salida. Utiliza la función Perl 5.10
say
, por lo que debe ejecutarse conperl -M5.010
(o conperl -E
).Al igual que la versión es así, esto manijas de código de líneas de longitud variable, y se manejan de entrada Unicode arbitraria si la entrada y la salida estándar eran en modo UTF-8. Lamentablemente, por defecto no lo son, a menos que uno especifique el cambio de línea de comando no libre
-CS
. Por lo tanto, gana el bono de ½ ½ char, pero no el −¼.Editar: +1 char para corregir un error: solo porque las cadenas de entrada no contienen saltos de línea no significa que no puedan terminar en
$a
(por ejemplo"+" & "J" eq "\n"
).fuente
chop
lugar dechomp
.m
por ahora, no es que haga ninguna diferencia en el ranking en este momento. :)T-SQL
fuente
Scala
115107: (−¼ para manejar UTF-8)sin golf, y en
Source.fromFile ("f")
lugar destdin
una mejor capacidad de prueba :Resultado:
Gracias a Gareth por la reducción del tamaño 8 por usar
stdin
.fuente
stdin
lugar defromFile("f")
guardar 8 caracteres?VBA (
307.25284 - 0.75 bonus = 283.25)Sé que esto ya se ganó, pero aquí está mi oportunidad (no leer un archivo, solo una cadena, necesita tener el io agregado). Me gusta que tengo que usar
l()
recursivamente. Por lo general, no tengo necesidad de recurrencia en mi programación de la vida real. Solo hice muchas pruebas, pero creo que esto cubre la estipulación de puntos de bonificación Unicode. También supone quevbCr
es el terminador de línea. Esto puede no traducirse a todos los sistemas por eso.Código:
Ejemplo de entrada / salida:
fuente
Q, 32
uso
K, 22
La solución anterior se puede reducir a 22 escribiéndola completamente en K en lugar de pasar las funciones de K a un intérprete de Q, reduciendo el número de paréntesis requeridos.
fuente
PHP,
123127 :(No estoy contento con eso (seguramente habrá mejoras), pero aquí va:
Prueba de que funciona.
Si alguien puede pensar en una forma más inteligente de inicializar $ ay $ b, hágamelo saber. Originalmente tenía
$a=$b=$n=''
y $ b finalmente fue correcto, pero[empty] & [anything] == [empty]
$ a nunca tuvo contenido.Editar: Tuve que arreglar el manejo de nueva línea (+6) pero se cayó la etiqueta de cierre (-2).
fuente
?>
. Sin embargo, acabo de notar que su código tiene un error: imprime una coincidencia adicional si todas las líneas contienen una nueva línea final como se especifica.JavaScript (
125134140)Demostración: http://jsfiddle.net/Fv7kY/4/
Edición 1 : reorganice los bucles para evitar llaves. Inicialice i con
[]
para combinar cons
. Mueve elw
incremento a la expresión.Editar 2 : Permite
S=I
capturar la última palabra ingresada y guardar usandos[1]
. Combinarr=1
y++c<S.length
. EstablezcaC=s[c]
en el bucle interno y compare enC
lugar de las palabras anteriores y siguientes para acortar la expresións[w][c]==s[w++][c]
a solos[w++][c]==C
. Guardado un total de 9 caracteres. También se establecew=r=...
porque cuando eso es cierto,w=1
es con lo que necesitamos inicializarw
.fuente
Rubí (71)
salida:
fuente
t[i]
cont[i,1]
.Lisp común,
183165 caracteresFormato legible:
Ingrese esto directamente en REPL e ingrese las líneas, terminando con una línea vacía.
fuente
C, 126 caracteres
He estado mirando esto, pero no puedo hacerlo más pequeño. Puede ser necesario un nuevo enfoque.
(Sin puntos de bonificación; solo maneja líneas de diferente tamaño si la primera línea es la más corta).
fuente
C # con .NET 4 (280)
Versión legible
Respuesta original
usando c = System.Console; clase P {static void Main () {char [] a; var b = c.ReadLine (); a = b.ToCharArray (); while (b! = "") {for (int i = 0; iVersión legible:
fuente
0: a 1: b 2: c 3: d 4: e 5: f 6: g 0: a 2: c 3: d 6: g 0: a 3: d 6: g
. El resultado esperado sería0: a 3: d 6: g
.Python 122 caracteres :
fuente
)
yfor
. Entonces, en lugar de…str(x[0]) for i,x…
, puedes hacerlo…str(x[0])for i,x…
. También aparece entuple(x) for
y.split()])) if
Rubí (242)
fuente
STDIN
(ARGF
o simplementegets
).C#
fuente