Introducción
Según la publicación de Rand Al'Thor en Puzzling SE, una palabra muy unida es cualquier palabra que contiene tres letras alfabéticamente consecutivas (en cualquier orden).
Palabras como educación , foghorn y cabaret se consideran palabras muy unidas, mientras que palabras como learning , klaxon y performance no son palabras muy unidas.
Reto
El desafío es codificar un programa capaz de tomar una sola palabra como entrada (se supone minúscula, para todos los efectos) y devolver la salida que (si está disponible) enumera todos los conjuntos de letras consecutivas (también en minúscula) si es una palabra unida y salida vacía si no es una palabra unida.
Ejemplos
Input: education
Output: cde
Input: foghorn
Output: fgh
Input: cabaret
Output: abc
Input: hijacking
Output: ghi, hij, ijk
Input: pneumonia
Output: mno, nop
Input: klaxon
Output: <<no output>>
Input: perform
Output: <<no output>>
Input: learning
Output: <<no output>>
Reglas
- Mientras que se supone que la entrada es una sola palabra en minúsculas y la salida debe ser en minúsculas, la naturaleza de la salida variará de acuerdo con la elección de su lenguaje de codificación. Seleccione una forma de salida que se adapte mejor a la naturaleza del desafío, ya sea STDOUT, salida de archivo, matriz, etc.
- Debido a que este es el código de golf, será el caso de que el número más bajo de bytes sea el claro ganador.
- No hay lagunas tontas .
- No aceptaré respuestas que tengan las letras consecutivas en orden no alfabético ... Por
cab
lo tanto , no se considerará una salida adecuada paracabaret
, por ejemplo. - Nota especial, mientras que los "trillizos" no necesariamente tienen que estar en orden alfabético, pero los caracteres dentro de los trillizos deben estar ... así que en el caso de la palabra "performance", por ejemplo, la salida
mno,nop
será aceptada, como voluntadnop,mno
. En el caso de la palabra "secuestro", hay seis formas en que la tripletes deghi
,hij
yijk
podrían estar dispuestos en una lista, y todas las seis permutaciones son aceptables como salida.
Aparte de eso, en tus marcas, prepárate, ¡golf!
!
Y con otra palabra, ya que el actual da el mismo resultado :-)pneumonia
puede ser[('m','n','o'),('n','o','p')])
?Respuestas:
05AB1E ,
765 bytesCódigo:
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
Python 3.5, 68 bytes
Imprime cadenas de salida y termina con un error cuando el valor del carácter es demasiado grande.
Genera todas las cadenas de tres consecutivas e imprime las que son un subconjunto de la palabra de entrada.
fuente
Pyth -
111087 bytesMétodo de fuerza súper bruta.
Test Suite .
fuente
Jalea , 7 bytes
Este es un enlace monádico. Pruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6),
9590 bytesLos valores faltantes se concatenan como
undefined
, por lo que la cadena resultante contiene más de 3 caracteres. Tomé prestado el!c[3]
truco de @ETHproductions para ahorrar 5 bytes.fuente
undefined
es una palabra muy unida;)parseInt(c,36)
lugar dec.charCodeAt()
?parseInt
en el golf de código.Python 3.5, 78 bytes
fuente
PHP, 100 bytes
toma la entrada como argumento de línea de comando; imprime una coma final. correr con
-r
.fuente
for($s=join(range(Z,z));$a=substr($s,++$i,3);)
es una forma más corta de crear $ a. Es cierto que verifica un montón de puntuación y también algunas series de 2 caracteres, pero como la entrada es solo letras minúsculas y requiere que encuentre 3 caracteres, eso está bien.for($a="
ab ", $ i = 98; $ i <123;)! strstr (count_chars ($ argv [1], 3), $ a = substr ($ a, 1) .chr (++ $ i))? print "$ a,"; `ahorra 2 Bytes. Muy bien, he intentado otras formas en PHP pero no puedo alcanzar los Bytes de su código. No estoy seguro si necesita un espacio después de la comaC,
175174 bytessangrado:
Mientras realiza la ordenación, reemplaza los valores duplicados con 0, estos 0 se ordenan al comienzo de la palabra. Buscar los valores consecutivos es trivial.
fuente
MATL , 13 bytes
Pruébalo en línea!
fuente
Haskell, 48 bytes
Genera todos los triples de tres caracteres consecutivos, toma aquellos que usan solo letras en la entrada.
53 bytes:
La lista
['c'..]
contiene todos los caracteres unicode de'c'
adelante en adelante. La comprensión de la lista los[[pred$pred c..c]|c<-['c'..]]
convierte en todas las cadenas de 3 caracteres consecutivos en"abc"
adelante. Retrocedemos en[pred$pred c..c]
lugar de avanzar[c..succ$succ c]
para evitar un error al tomar el sucesor del carácter unicode más alto.Estos triples se filtran para aquellos que solo usan letras en la entrada.
fuente
Perl, 36 bytes
Incluye +1 para
-n
Dar entrada en STDIN:
Solo el código:
fuente
T-SQL, 153 bytes
Tuve que reaccionar ante el comentario de WallyWest, sobre que pasó mucho tiempo desde la última respuesta de TSQL. La respuesta fue en parte inspirada por la respuesta de Brian J
Golfizado:
Violín
Sin golf:
fuente
Haskell,
636052 bytesEjemplo de uso:
f "hijacking"
->["ghi","hij","ijk"]
.scanr(:)"_"['a'..]
construye una lista con las colas de la lista de todos los caracteres unicode que comienzan con'a'
y deja que termine con un'_'
, es decir["abcde...\1114111_", "bcde...\1114111_", "cde...\1114111_", ..., "\1114109\1114110\1114111_", "\1114110\1114111_", "\1114111_", "_"]
. Luego tomamos hasta tres caracteres de cada cadena y lo unimosx
. Mantenga todox
donde está cada letra en el parámetro de entradaw
.Editar: @xnor guardó
37 bytes. ¡Gracias!fuente
a:b:c:_
con un @ -pattern?'z'
límite superior y dejar que pruebe todos los caracteres.take
y quitar la cadena vacía:f w=[x|x<-init$take 3<$>scanr(:)""['a'..],all(`elem`w)x]
scanr
con "." en lugar de""
y omita elinit$
.T-SQL (SQL Server 2014), 217 bytes
Golfed
Uso
Primero declare la variable @a como un carácter de algún tipo y asigne la entrada de esta manera
No conté la declaración como parte de mi código, pero no encontré un estándar sql para entrada, así que estoy dispuesto a cambiar mi conteo
La salida será una fila para cada triple o ninguna fila si la palabra no está muy unida
Sin golf
fuente
R, 220 bytes
Mi solución es bastante sencilla. Recorre las posibles combinaciones de tres letras, recorre y comprueba los caracteres de la cadena ingresada contra las tres letras consecutivas, y las agrega a una cadena. La cadena solo se imprime cuando se encuentran tres letras (c == 4).
de entrada y salida
fuente
Python 3.5,
114111888079 bytes:Una función lambda anónima. Toma la entrada como una cadena en mayúscula y genera una matriz de tuplas, con las que están llenas de tres caracteres en mayúscula que representan todos los conjuntos de
3
letras consecutivas que aparecen en la entrada. Por ejemplo,sería la salida de entrada
HIJACKING
. OP ha confirmado que este formato de salida está bien. Entonces tiene el único formato de entrada en mayúscula. Sin embargo, si desea ingresar solo en minúsculas, simplemente reemplacerange(65,91)
conrange(97,123)
, agregando un byte más.Repl.it con todos los casos de prueba!
Explicación:
Básicamente lo que está sucediendo aquí es:
Se
W
crea una lista,W=[*map(chr,range(65,91))]
que contiene todas las letras mayúsculas del alfabeto inglés. Debido a esto, siempre se requiere una entrada en mayúscula .Para cada tupla,
i
en una lista, que llamaremosU
, que contiene las tres tuplas de letras consecutivas, es decir:creado por
zip(W,W[1:],W[2:])
, cada unoi
se agrega completamente a la lista de salida siempre que todos los elementos en la versión establecida dei
({*i}
) estén en la versión establecida de inputX
({*X}
), es decir{*X}>={*i}
,X
es un superconjunto dei
. De lo contrario, la versión vacía dei
(()
) se agrega a la lista.Una vez que se han realizado todas las tuplas con las coincidencias completamente agregadas, la lista se devuelve como el resultado final.
fuente
Scala, 59 bytes
Sin golf:
Explicación:
fuente
En realidad, 13 bytes
Sugerencias de golf bienvenidas. Pruébalo en línea!
Ungolfing
fuente
Java 7, 230 bytes
Es muy probable que esto se pueda jugar al golf, pero el desafío fue mucho más difícil de lo que pensé originalmente en Java.
Sin golf y casos de prueba:
Pruébalo aquí
Salida:
fuente
PowerShell v2 +, 93 bytes
Se siente mucho más tiempo del requerido, pero parece que ya no puedo jugar más al golf.
Toma entrada
$n
. Bucles de97
que120
, la construcción de cadenas de tres letras contiguas - es decir, hasta el|?
, vamos a tenerabc
,bcd
,cde
, etc, sobre la tubería. Luego, se alimenta a través de unaWhere-Object
(la|?
) para extraer solo aquellos elementos donde la cláusula es verdadera. Aquí, la cláusula es 1) la cadena de entrada$n
, convertida como unachar
matriz,sort
ed yselect -u
nique'd, luego editada-join
nuevamente en una cadena, 2)-match
ed contra las cadenas de tres letras (es decir, coincidencia de expresiones regulares). Si es una coincidencia, entonces la cadena de tres letras está en la palabra, por lo que se filtra a través del|?
. Los resultados se dejan en la tubería y la salida es implícita.Ejemplos
(Tenga en cuenta que aquí la salida está separada por espacios, ya que estamos encadenando la salida por concatenación).
fuente
Retina,
10656 bytesDeduplicar, ordenar. Añadir
abc
. Encuentre si se encuentra la subcadena y agregue si es así. Traducir a la siguiente subcadena. Repetir. Luego quite las primeras dos líneas.Pruébalo en línea
Solución ingenua:
Deduplicar, ordenar y luego generar coincidencias superpuestas de 3 letras secuenciales.
Pruébalo en línea
fuente
JavaScript (Firefox 48), 93 bytes
Esto se presta a una versión ES6 de 96 bytes :
Cómo funciona
La primera parte importante de la función es esta:
new Set(string)
crea un objeto Set que contiene uno de cada carácter único en la cadena. Por ejemplo,new Set("foghorn")
volveremosSet ["f", "o", "g", "h", "r", "n"]
. Podemos convertir esto en una matriz con[... ]
, luego ordenarlo con el incorporado.sort()
. Esto se convierte"foghorn"
en["f", "g", "h", "n", "o", "r"]
.El siguiente paso es este:
Esto asigna cada
c
personaje en laa
matriz al personaje concatenado con los dos elementos después de él. Por ejemplo,["f", "g", "h", "n", "o", "r"] => ["fgh", "ghn", "hno", "nor", "orundefined", "rundefinedundefined"]
. (Losundefined
s aparecen cuando intenta acceder a un miembro inexistente de la matriz.El último paso es filtrar:
Primero,
!c[3]&
es descartar cualquier cadena que contengaundefined
. Esto es necesario porque un error hace que el siguiente algoritmo cuente, por ejemplo,gmundefined
como un triplete consecutivo.Todas las cadenas de tres caracteres consecutivos, cuando se interpretan como números de base 36, son 38 módulo 1333. Lo descubrí mediante el siguiente cálculo:
Por lo tanto, si una cadena de tres caracteres es 38 mod 1333 en base 36, los tres caracteres son consecutivos en el alfabeto.
Fragmento de prueba
Mostrar fragmento de código
fuente
gem
ymage
.!c[3]
truco que redujo mi respuesta ES6 a la longitud de su respuesta ES6 anterior, por lo que ahora incluso estoy superando su respuesta Firefox 30+. Lo siento por eso.Raqueta 237 bytes
Pruebas:
Salida:
Versión detallada:
fuente
Ruby , 50 bytes.
each_cons(3)
obtiene todas las sublistas consecutivas de longitud 3 del alfabeto?a..?z
, luego se usae&s.chars==e
para seleccionar solo las que tienen todos los caracteres en la cadena de destino mediante la intersección setwise. Devuelve una lista de listas.Pruébalo en línea!
fuente
[R], 110 bytes
Estoy seguro de que todavía es golfable
fuente
Japt ,
109 bytesPruébalo o ejecuta todos los casos de prueba
fuente