Mini golf de lunes: una serie de desafíos de código corto de golf , publicados (¡con suerte!) Todos los lunes
(Lo siento, esto es un poco tarde).
Estoy seguro de que la mayoría de ustedes han oído hablar de la distancia de Levenshtein , un algoritmo para calcular la distancia entre dos cadenas. Bueno, este desafío se trata de implementar un algoritmo similar de mi propia invención *, llamado distancia de anagrama . La principal diferencia es que el orden de los personajes no importa; en cambio, solo se miden los caracteres que son únicos para una cadena u otra.
Reto
El objetivo del desafío es escribir un programa o función que tome dos cadenas y devuelva la distancia del anagrama entre ellas. La forma principal de hacer esto es usar la siguiente lógica:
- Convierta ambas cadenas a minúsculas y (opcionalmente) ordene alfabéticamente los caracteres de cada uno.
- Si bien las cadenas contienen al menos un carácter igual, elimine la primera instancia de este carácter de cada cadena.
- Agregue las longitudes de las cadenas restantes y devuelva / envíe el resultado.
Ejemplo
Si las entradas son:
Hello, world!
Code golf!
Luego, en minúsculas y ordenadas, se convierten en: (según la clasificación predeterminada de JS; tenga en cuenta los espacios iniciales)
!,dehllloorw
!cdefgloo
Eliminando todos los caracteres que están en ambas cadenas, terminamos con:
,hllrw
cfg
Por lo tanto, la distancia del anagrama entre las dos cadenas originales = 6 + 3 = 9.
Detalles
- Las cadenas pueden tomarse en cualquier formato sensible.
- Las cadenas consistirán solo en ASCII imprimible.
- Las cadenas en sí no contendrán ningún espacio en blanco que no sean espacios regulares. (Sin pestañas, líneas nuevas, etc.)
- No necesita usar este algoritmo exacto, siempre que los resultados sean los mismos.
Casos de prueba
Entrada 1:
Hello, world!
Code golf!
Salida 1:
9
Entrada 2:
12345 This is some text.
.txet emos si sihT 54321
Salida 2:
0
Entrada 3:
All unique characters here!
Bdfgjkmopvwxyz?
Salida 3:
42
Entrada 4:
This is not exactly like Levenshtein distance,
but you'll notice it is quite similar.
Salida 4:
30
Entrada 5:
all lowercase.
ALL UPPERCASE!
Salida 5:
8
Tanteo
Este es el código de golf , por lo que gana el código válido más corto en bytes. Tiebreaker va a la presentación que alcanzó su conteo final de bytes primero. El ganador será elegido el próximo lunes 12 de octubre. ¡Buena suerte!
Editar: ¡ Felicidades al ganador, @isaacg, usando Pyth (nuevamente) por unos asombrosos 12 bytes!
* Si este algoritmo se ha utilizado en otro lugar y / o se le ha dado otro nombre, ¡hágamelo saber! No pude encontrarlo con una búsqueda de 20 minutos.
Respuestas:
Pyth, 12 bytes
Banco de pruebas
La operación en cuestión es equivalente al operador de resta en bolsa de Pyth
.-
, aplicado en ambas direcciones. Podrías llamarlo bagwise xor, supongo.La solucion es:
.z
: obtener entrada como lista de 2 cadenas.rR0
: convierte ambos a minúsculas..p
: Forma todas las permutaciones, es decir, normales e invertidas..-M
: Mapea la.-
operación sobre cada pedido.s
: Concatenar los resultados.l
: Imprime la longitud.fuente
JavaScript (ES7), 92 bytes
Define una función anónima.
Para probar, ejecute el fragmento a continuación. Puede editar el código y hacer clic en 'Probar' para comparar su salida con el original. (¡Deja un comentario si encuentras una mejora!) La entrada es como
"Hello, world!", "Code golf!"
en el cuadro de entrada.¡Gracias a @ETHproductions por guardar 6 bytes!
Más sobre el conjunto de pruebas
Cómo funciona
fuente
.join("")+b
con.join``+b
sin efecto.CJam,
2319 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Rubí, 62
Tiene que haber una mejor manera.
Editar: 57 caracteres gracias a iamnotmaynard investigando un camino para el que era demasiado vago.
fuente
sub
puede tomar hilos. ¿No podrías usar enc.downcase
lugar de/#{Regexp.escape c}/i
?Python,
9087818079 bytesPython <versión 3.5, 80 bytes
Explicación
Para cada carácter en aob, cuente el número de ocurrencias en cada cadena y agregue la diferencia (positiva).
Editar: volver a leer las reglas, las funciones anónimas realizadas son aceptables, la respuesta mejorada al deshacerse de raw_input. ¡Primer golf, por favor sea gentil!
Gracias a sp3000 por la mejora de redefinir str.lower y hacerme darme cuenta de que la impresión era innecesaria. También espacios. Aún aprendiendo.
Usando python> = 3.5, hay una forma más corta de definir conjuntos, por lo que se puede guardar un byte sobre versiones anteriores.
fuente
Retina,
4020 bytes20 bytes guardados gracias a Martin Büttner.
Coloque cada línea en su propio archivo y reemplácela
\n
con una nueva línea literal.fuente
pb , 648 bytes
Toma entrada con un carácter de tabulación que separa las dos cadenas.
Este fue un doozy. En realidad, implementar el algoritmo no fue la parte difícil, eso fue relativamente fácil. Pero tuve que hacer dos cosas que son difíciles de hacer en pb: insensibilidad a mayúsculas y minúsculas. Tuve un programa para convertir a minúsculas simplemente por ahí (211 bytes de longitud) y todo lo demás fue agregado al final para hacer el trabajo específicamente para este desafío.
¡Puedes ver este programa en YouTube! Hay algunas cosas que debe tener en cuenta si lo hace:
chr(-1)
bloquea el intérprete cuando se ejecuta en modo de observación.Hello, world!
yCode golf.
. Esto es ligeramente diferente de una de las entradas de ejemplo en el desafío; Lo usé porque era corto pero lo modifiqué para que la salida correcta fuera 10 en lugar de 9. Esto es solo para mostrar que el número se imprime correctamente incluso si tiene varios dígitos, lo cual es difícil en pb.chr(10)
no se maneja adecuadamente hace que sean en gran medida inútiles aquí. Dicho todo esto, creo que es casi algo hermoso de ver. Es un gran lío de código horrible interpretando otro código horrible, partes de él rompiéndose ante tus ojos, y sin embargo, todo funciona lo suficiente como para obtener la respuesta correcta. Parece que se está imprimiendo basura, pero si observa con suficiente atención con el conocimiento de la fuente, puede ver lo que está haciendo y por qué en cualquier momento. Me siento como Cypher cuando veo este video:I... I don’t even see the code. All I see is blonde, brunette, red-head.
Sin más preámbulos, aquí está el código sin golf.
fuente
C ++ 199 bytes
Utiliza una matriz para almacenar el recuento de cada carácter en la primera cadena, minis el recuento en la segunda cadena. Luego encuentra la suma de los valores absolutos de los elementos de la matriz: esta es la distancia.
Golfizado:
Sin golf:
fuente
PowerShell, 79 bytes
Casi exactamente el mismo código que mi respuesta en Anagram Code Golf ... pero ... estoy obteniendo un comportamiento extraño si solo elimino la
-eq0
respuesta, así que terminé necesitando explícitamente.ToLower()
y refundir fuera de laparam
declaración. +La explicación también se copió (principalmente) de esa respuesta: toma las dos entradas de cadena, las pone en minúsculas y las vuelve a emitir como matrices de caracteres. La
diff
función (un alias paraCompare-Object
) toma las dos matrices y devuelve elementos que son diferentes entre las dos. Aprovechamos eso volviendo a emitir el retorno como una matriz con()
, y luego verificando su longitud.+ Por ejemplo, estaba obteniendo resultados falsos con
param([char[]]$a,[char[]]$b)(diff $a $b).length
elall lowercase.
/ALL UPPERCASE!
test. Si separé manualmente las matrices (p. Ej., Ejecuté(diff ('a','l','l'...
), funcionó bien, pero fallaba cada vez que había una superposición de mayúsculas / minúsculas con la conversión. Todo lo que puedo leer en la documentación indica quediff
no distingue entre mayúsculas y minúsculas por defecto, así que ... ¿encogerse de hombros?fuente
Bash,
6867 bytesCreo que esto funciona. Tenga en cuenta el espacio final en la segunda línea.
Casos de prueba
fuente
Perl,
5246 bytes + 3 conmutadores (a, F, n) =5549 bytesToma la entrada de STDIN con las cadenas de entrada en sus propias líneas, terminadas por EOF.
Interruptores:
Código:
fuente
Bash + GNU utils, 53
sed
se transforma en minúsculas y divide la cadena en líneas parasort
. Como tenemos que hacer esto dos veces, lo pongo en una función.comm3 -3
filtra las líneas relevantes ywc -l
produce el número.La entrada es a través de
STDIN
; Como dos comandos se leen secuencialmente, debe enviarEOF
(Ctrl-D) dos veces, entre las cadenas y al final. Sobrescribe el archivo1
, si está presente.fuente
Matlab, 91 bytes
Pruébalo en línea .
Esto funciona de la siguiente manera:
fuente
Jalea , 6 bytes
Pruébalo en línea!
fuente
F #,
134126 bytesExplicacion :
a
y porb
separado.Reduzca cada grupo con el
-
operador, que tiene el siguiente efecto:Suma el valor absoluto de los valores del paso anterior.
fuente
Scala ,
13481 bytesGracias @ ASCII-only por su trabajo.
Pruébalo en línea!
fuente