Inspirado en esta cadena de comentarios ...
Quiero
enklact
salir de este desafío pero no puedo ...@ETHproductions to enklact (v): para implementar una tabla de búsqueda utilizando una subsección que consta de elementos únicos.
Enklacting es una forma muy útil de comprimir una tabla de búsqueda. Por ejemplo, supongamos que tenía la siguiente lista de colores:
red
green
blue
yellow
purple
orange
Si desea poder tomar un color como entrada y devolver su índice en esta lista, obviamente hay una forma sencilla:
["red", "green", "blue", "yellow", "purple", "orange"].index(input())
Pero hay una forma en que podríamos hacer esto de una manera menos bytes:
"rgbypo".index(input()[0])
Esto funciona porque el primer (o 0º) índice de cada cadena es único. Este ejemplo es obvio, pero a veces es un poco más difícil. ¿Qué pasaría si quisiéramos hacer una tabla de búsqueda para esta lista?
Sweet Onion Chicken Teriyaki
Oven Roasted Chicken
Turkey Breast
Italian BMT
Tuna
Black Forest Ham
Meatball Marinara
En este caso, no podemos hacer esto:
"SOTITBM".index(input()[0])
porque hay dos entradas diferentes que comienzan con a 'T'
, a saber, "Atún" y "Turquía". Debemos mirar un índice diferente. Si observa el cuarto índice de cada cadena, notará que todas son únicas. Entonces podemos hacer esto ...
"enklact".index(input()[3])
En este caso, la "cadena de enklaction" es "enklact".
Eso nos lleva al desafío de hoy ...
Dada una lista de cadenas, devuelve cualquier cadena de enklaction válida. O, en otras palabras, dada una lista de cadenas, devuelve cualquier cadena nueva donde cada letra sea única, y la cadena se forma uniendo la iésima letra de cada cadena.
Si no hay una cadena de enklaction válida, su envío debe devolver una cadena vacía o un valor falso falso en su lugar. Como de costumbre, se permiten funciones o programas completos, y los formatos de entrada / salida son permisivos (dentro de lo razonable).
Cada cadena solo contendrá ASCII imprimible, y este desafío distingue entre mayúsculas y minúsculas.
Este es el código de golf , ¡así que trate de escribir el programa más corto posible en el idioma que elija!
Casos de prueba
Input:
Programming
Puzzles
Code
Golf
Output (any one of these):
"ozdl"
"gzef"
Input:
the quick
brown fox
jumped over
lazy dogs
Output:
"tbjl"
"hrua"
"eomz"
" wpy"
"qne "
"if o"
"kxvs"
Note that "u dd" and "coog" are not valid.
Input:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Output:
""
Input:
AbC
aBc
bbC
Output:
"Aab"
Input:
@#$%^_
Hello_World
How are you?
Output:
"#eo"
"$lw"
"%l "
"^oa"
Input:
a
ab
ac
Output:
""
Respuestas:
Python3, 59 bytes
Devuelve una cadena con el enklact, Ninguno de lo contrario
fuente
Python 2 ,
686761 bytesPruébalo en línea!
Mejoras
Si la salida no tuviera que ser una cadena:
Python 3 , 49 bytes
Pruébalo en línea!
fuente
max(`j`[2::5]for j in[""]+zip(*a)if len(set(j))==len(j))
funciona, para guardar un byte.Retina ,
4332 bytesPruébalo en línea! Editar: Guardado 11 bytes gracias a @MartinEnder. Explicación:
Repita mientras la entrada cambia ...
... solo si una línea está vacía o dos líneas comienzan con el mismo carácter ...
... borra el primer caracter de cada línea. Por lo tanto, la repetición se detiene si a) todas las líneas comienzan con caracteres diferentes, en cuyo caso la condición falla y la entrada no cambia, o b) al menos una línea se vacía, en cuyo caso todos los caracteres eventualmente se eliminan, en ese punto la entrada deja de cambiar.
Recoge el primer personaje de cada línea. (Si no hubo solución, el bucle anterior habrá eliminado todo y no habrá nada que recopilar).
fuente
m
con un grupo aquí, parece que la etapa condicional no propaga la opción).Haskell , 71 bytes
Pruébalo en línea!
BMO ha guardado 3 bytes con
any null x
→elem""x
.Ørjan Johansen guardó un byte con
sum[1|b<-y,a==b]<2
→filter(==a)[y]==[a]
.Explicación
Si arrojar un error (
Prelude.head: empty list
) cuando no hay solución está bien,|elem""x=""
se puede borrar por 61 bytes .fuente
filter(==a)y==[a]
Ruby , 38 bytes.
Pruébalo en línea!
Gracias a GB por señalar un error.
fuente
Pyth , 6 bytes
Banco de pruebas.
El resultado es una lista singleton, según lo permitido por defecto ; la lista [] (lista vacía, falsedad) se devuelve en caso de que la cadena no se pueda enclactificar .
Explicación
Pyth , 5 bytes
Esto habría sido válido si el bloqueo hubiera contado como un valor falso.
Banco de pruebas.
fuente
Haskell ,
7674 bytesPruébalo en línea! Devuelve la última cadena de búsqueda válida o una cadena vacía si no existe dicha cadena.
7169 bytesSi arrojar una excepción consistente como valor falso está permitido:
Pruébalo en línea! Lanza una
empty list
excepción si no se encuentra una cadena, de lo contrario devuelve la primera cadena válida.-2 bytes gracias a Ørjan Johansen
fuente
notElem x
se puede acortar aall(/=x)
.Jalea , 7 bytes
Devuelve el entero 0 si las cadenas no se pueden enklactificar.
Pruébalo en línea!
Cómo funciona
fuente
Perl 5 , 61 bytes
Pruébalo en línea!
fuente
Stax ,
98 bytesEjecutar y depurarlo
Explicación (sin embalaje):
fuente
R , 127 bytes
Pruébalo en línea!
sapply
normalmente devuelve amatrix
cuando todoslength(FUN(X[[i]]))
son iguales, excepto cuandolength(FUN(X[[i]]))==1
, en cuyo caso devuelve avector
. Para utilizar las operaciones matriciales, entonces, tenemos que irsubstring
más allá de lo que necesitamos para garantizar amatrix
, razón por la cual sex
extiende amax(nchar(S)+1)
.Luego filtramos las filas que no tienen duplicados ni cadenas vacías. Como solo podemos devolver una sola cadena, tomamos la primera, excepto que cuando no hay filas que cumplan con los criterios, arrojaríamos un error, por lo que agregamos una fila adicional
""
al final.Luego imprimimos la
enklact
cadena ified o la cadena vacía.fuente
R ,
11610795 bytesR + pryr
Pruébalo en línea!
base R
Pruébalo en línea!
Estas dos variantes ahorran 9 bytes gracias a Giuseppe .
Explicación:
Esto efectivamente trunca todas las picaduras en el vector
v
a la longitud del más corto e itera a través de los índices posteriores. Luego verifica si hay duplicados dentro de las letras elegidas y si no, las pega e imprime concat
. Si todos los índices devuelven resultados duplicados, esto imprime una cadena vacía.Todos se envuelven en una
pryr
función anónimabreak
para detener el ciclo, o la función base R pone a cero el vector para romper el ciclo.fuente
R+pryr
o 107 bytes en la base R.Japt, 9 bytes
Toma la entrada como una matriz de matrices de caracteres, devuelve una matriz de caracteres o
undefined
Pruébelo (agregue una nueva línea al comienzo del programa con el código
qR mq
para tomar la entrada como una cadena separada de nueva línea, para ahorrarle la molestia de crear las matrices).Explicación
fuente
z æ_¬eZ¬â
05AB1E , 7 bytes
Pruébalo en línea!
Explicación
fuente
Python 3 , 75 bytes
Opera en listas de caracteres en lugar de cadenas. Devuelve False si no existe una cadena de enklaction válida.
Pruébalo en línea!
fuente
f=
se incluya en el recuento de bytes.C (gcc) , 161 bytes
Pruébalo en línea!
Se prueba la duplicación de cada posición de personaje y se omite si se detecta un duplicado; esto continúa hasta que finalice la cadena más corta. Solo es ASCII, lamentablemente: ¡las cadenas DBCS / UTF-8 rompen esta función mal!
fuente
Japt , 12 bytes
Devoluciones
undefined
para cadenas no enklactic.Pruébalo en línea!
Explicación:
fuente
split
s.Wolfram Language (Mathematica) , 54 bytes
Pruébalo en línea!
Toma una lista de la lista de caracteres como entrada, devuelve una lista de caracteres. Contiene U + F3C7, correspondiente al operador "Transposición".
Devuelve
#1
y arroja un montón de errores ignorables cuando no hay una cadena adecuada.Explicación:
Rellene la entrada para que cada "cadena" (lista de caracteres) tenga la misma longitud. Esto agrega enteros
0
s (no cadenas"0"
). Luego transponer.Seleccione las cadenas que no tienen enteros
0
y tienen todos los caracteres únicos.Consigue el primero.
fuente
JavaScript (ES6), 66 bytes
Devuelve una cadena o
undefined
si no existe una solución.Pruébalo en línea!
Comentado
fuente
Carbón ,
2321 bytes-2 bytes gracias a @Neil !
Pruébalo en línea!
fuente
q
dejó de ser siempre una cadena b) StringMap comenzó a trabajar en no cadenas? De todos modos, tuRange
es innecesario, ahorrándote 2 bytes.Casco , 9 bytes
Pruébalo en línea!
Explicación
fuente
←ġLT
overḞz:∞ø
debería guardar un byte.Retina ,
8156 bytesPruébalo en línea!
-25 bytes gracias a @Neil
Transponer texto rectangular en Retina es sorprendentemente difícil.
fuente
Perl 6 , 27 bytes
Pruébalo en línea!
Después de ver que la versión ruby ha sido votada, he copiado el enfoque y he usado listas de caracteres, en lugar de cadenas. No me gusta
Mi envío más antiguo y más correcto es el siguiente:
Perl 6 , 38 bytes
Dividir, comprimir, verificar la unicidad, unirse.
Pruébalo en línea!
fuente
C (gcc) ,
121113110 bytesPruébalo en línea!
Sin golf
-3 gracias a ceilingcat
Esto abusa de la capacidad de agregar 1 a un puntero de cadena en C para obtener la 'cola' de la cadena. Los principales ahorradores de bytes son:
d+=x[y[i++]=*(*_)++]++
que agrega el primer carácter de la primera cadena de_
ay
, avanza la primera cadena de_
para eliminar su primer carácter, agrega lax
entrada en ese carácterd
e incrementa dichax
entradaq=d?*x:puts(y)
que imprimey
sid
no es cero mientras se estableceq
en un valor distinto de cero, o se estableceq
en no cero si el primer elemento dex
no es cero (si estuviéramos al final de una de las cadenas, entonces dicho elemento sería no cero)Editar: bytes afeitados cambiando del ciclo while a la llamada de cola recursiva y eliminando los corchetes del ciclo for.
fuente
for(d=i=0;*_;)
lugar defor(d=0,i=0;*_;++_)
y en*(*_++)++]++;d=d?!*x*f(s)
lugar de*(*_)++]++;d=d?*x?0:f(s)
Pyth, 13 bytes
Pruébalo aquí
fuente
Rojo , 139 bytes
Pruébalo en línea!
Explicación:
Toma la entrada como un bloque (lista) de cadenas. Devuelve la cadena de enklaction o de
none
otro modo.fuente
Röda ,
8077 bytesPruébalo en línea!
-1 byte gracias a Cows quack
Explicación:
La
try
palabra clave se usa para descartar los errores que ocurren sii
es mayor que la longitud de la cadena más pequeñaa
o si no hay respuesta yhead
causa un error.fuente
seq
para guardar un byteJava 10, 106 bytes
Dará un error en lugar de devolver una cadena vacía si no se puede encontrar una solución. La entrada es una matriz de caracteres.
Pruébalo en línea.
Explicación:
fuente
Clojure, 59 bytes
Devuelve una lista de listas de caracteres.
fuente
APL + WIN,
3533 bytes2 bytes guardados gracias a Adám
Solicita las líneas de texto como una matriz de caracteres:
Pruébalo en línea! Cortesía de Dyalog Classic.
Explicación:
fuente
⊂[1]
→,⌿