Este desafío es esencialmente idéntico a este con solo una diferencia: ahora está permitido mezclar letras en cualquier lugar de la cadena.
Guión
John tiene un número importante y no quiere que otros lo vean.
Decidió encriptar el número, siguiendo los siguientes pasos:
Su número siempre es una secuencia no decreciente (es decir "1123"
) .
Convirtió cada dígito en palabras en inglés. (es decir "123" -> "ONETWOTHREE"
)
Y luego, reorganiza las letras al azar. (es decir "ONETWOTHREE" -> "EEWOOHRNTET"
)
John sintió que su número estaba seguro al hacerlo. De hecho, dicho cifrado se puede descifrar fácilmente :(
Tarea
Dadas las cadenas cifradas, su tarea es descifrarla y devolver el número original.
Reglas
- Este es el código de golf, por lo que gana la respuesta más corta en bytes
- Puede suponer que la cadena de entrada siempre es válida
- La cadena de entrada solo contiene letras mayúsculas
- Los números originales siempre están ordenados en orden ascendente.
- Puede devolver el número en formato de cadena o entero
Las letras solo se mezclarán entre una palabra, no entre la cadena completa.Las letras se pueden mezclar en cualquier parte de la cadena.- Los números solo serán del 1 al 9 inclusive (
ONE
aNINE
)
Posible cadena descifrada
Aquí hay una lista de las cadenas justo después de que se hayan convertido a cadenas de los números:
1 -> ONE
2 -> TWO
3 -> THREE
4 -> FOUR
5 -> FIVE
6 -> SIX
7 -> SEVEN
8 -> EIGHT
9 -> NINE
Ejemplos
"NEO" -> 1
"NWEOOT" -> 12
"TOEERWNEHOT" -> 123
"IHNEVGENNEISTE" -> 789
"WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" -> 123456789
"EWHEWROETOTTON" -> 1223
"ONEWESTV" -> 27
(gracias, ETHproductions!)
fuente
"ONEWESTV" -> 27
(incluye un número que en realidad no aparece)Respuestas:
Python 2 , 123 bytes
Un programa completo que toma la entrada citada e imprime el número de John.
Pruébalo en línea! o ver un conjunto de pruebas
¿Cómo?
Trabajemos con el ejemplo "NEONSEXTOWNII" (para obtener 1269, y ser algo así como Leisure Suite Larry -esque!)
Primero
c=map(input().count,"OWHUFXSGIQ")
toma datos y cuenta el número de cada uno deOWHUFXSGIQ
ellos: estas son letras que aparecen en cada número en orden ascendente, con 2,4,6 y 8 con sus letras "propias" (WUXG
), más una letra adicional,Q
para agregar un cero hasta el final y haga que la longitud de la lista resultante sea uniforme. Por el ejemplo:Las entradas para 1, 3, 5, 7 y 9 deben ajustarse para corregir la abundancia de las otras letras. Esto se realiza mediante el siguiente ciclo:
Tenga en cuenta que las entradas para ajustar son alternativas (1,3,5,7,9,1,3,5, ...), por lo que podemos agregar dos a una variable de índice en cada paso y módulo por 10 para permanecer en rango si necesitamos atravesar más de una vez (lo que hacemos). Para guardar algunos bytes, podemos incrementar en uno y módulo en 5 y usar el doble del índice.
Dado que los ajustes para 9 requieren la mayor parte del trabajo, comenzamos allí; reside en el índice 8, así que comenzamos en
i=4
. La cadena"71735539994"
luego proporciona los índices,j
de los valores a eliminar en cada etapa (donde nos hemos asegurado de que el noveno índice contendrá cero al usarlo"Q"
al crearc
);c[i*2]-=c[int(j)]
realiza cada ajuste individual yi=-~i%5
pasai
al siguiente índice (donde-~i
está-(-1-i)
oi+1
guarda paréntesis(i+1)%5
) manteniendoi*2
dentro de los límites dec
.Por lo tanto, primero restamos el número en el índice
j=7
de ese en el índicei*2=8
, restando el número de "G" contadas del número de "I", ajustando la cuenta regresiva "NUEVE" por el número (correcto) de "OCHO" que también tiene un "yo"). Luego nos movemos haciai=0
(-~4%5 = (4+1)%5 = 0
), haciendo referencia al índicei*2 = 0
que es para "UNO" y restamos el valor encontrado en el índice dej=1
la entrada que cuenta "W" y, por lo tanto, "DOS", ajustando la cuenta de "O" s hacia abajo. Al final del ciclo tenemos los conteos corregidos:así que todo lo que queda es imprimir lo que
c
ahora representa (1269
).i
ahora está de vuelta en0
, así que lo incrementamos al comienzo del ciclo y lo usamos como nuestro dígito:Los ticks posteriores
`i`
son una abreviatura de Python2 para larepr(i)
cual se obtiene una representación de cadena de un objeto (el carácter de dígito en cuestión como una cadena) y la multiplicación de una cadena por un número crea una nueva cadena de tantas repeticiones (aquí solo mostramos eln=0
giro`i`
desde decir"5"
hacia""
yn=1
girando manteniendo decir"6"
como"6"
, pero también funciona para enteros positivos más grandes, por lo que se"3"*4
convierte"3333"
por ejemplofuente
05AB1E , 31 bytes
Pruébalo en línea!
Explicación
Muy ineficiente para grandes aportaciones.
fuente
‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']
: puedes explicar un poco, me cuesta entender cómo se puede generar cualquier cadena.‘
delimita una cadena comprimida en mayúsculas de palabras separadas por espacios.Z
significaZ
. Todos los otros pares de 2 símbolos denotan una palabra comprimida del diccionario 05AB1E . Entonces, por ejemplo, se€µ
traduce comoONE
.2419
. Los símbolos que necesitamos son los símbolos seguidos por24
y19
en los documentos . En nuestro caso esto es24=Ÿ
y19=™
asíHELLO
sería‘Ÿ™‘
Retina ,
11297 bytesPruébalo en línea!
-12 bytes gracias a @Neil
-3 bytes mediante el uso de clases de caracteres L en la transposición
Cómo funciona
Básicamente, esto se basa en el hecho de que las letras solo se usan en ciertos nombres de números. Por ejemplo,
SIX
es el único nombre que contiene unX
. Esto se vuelve más complicado con el hecho de que algunas palabras se superponen en letras, como ambasFIVE
y elSEVEN
usoV
. Esto podría corregirse identificándoseFIVE
conF(.*)V
.fuente
GH
yNO
sería adyacente, a excepción de cualquier sustitución anterior8
o1
de una sustitución anterior ...}`GH
8
funcionaría8
, ya}
que provocaría que los personajes se ordenaran nuevamente, colocando así los restantesG
yH
juntos.NO -> 1
, lo cual fue conveniente.Kotlin 1.1 ,
359352331327325 bytesSumisión
No funciona en TryItOnline debido a que Kotlin 1.1 no es compatible
Prueba
Lógica
Utilicé la hoja anterior para resolver la forma más simple de resolver cada letra
Ediciones
fuente
var s=""
yreturn s
ar=""
yreturn r
mediante la reutilización de la entrada-String, necesidad que ya no en ese momento? Nunca antes había programado en Kotlin, por lo que podría ser que hable tonterías aquí. ; pfinal
por defecto. Hmm, otra cosa que podrías jugar al golf: coloca elvar s=""
como la primera cosa en el método y reemplazaval f=r.split("").
conval f=r.split(s).
. De nuevo, no tengo idea si funciona. Lástima que TIO aún no sea compatible con v1.1, de lo contrario, probaría estas sugerencias yo mismo antes de hacermeJalea , 37 bytes
Pruébalo en línea!
-1 gracias a Jonathan Allan .
fuente
NINEFIVE
,THREEFIVE
). ¿Es un error o el código es simplemente ineficiente?Œ!
significa "permutaciones")...“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»...
Java 8,
248234 bytesExplicación del código:
-14 Gracias a Olivier Grégoire
fuente
Java 8,
346345344336327 bytesPruébalo aquí
Explicación general:
He visto las ocurrencias de cada personaje en el alfabeto:
G=8; U=4; W=2; X=6
.F=5; H=3
.V=7
(restandoF=5
).O=1; N=9
.N
tiene dos ocurrenciasNINE
, tuve que hacer una adicional-1
por cada ocurrenciaN
, por lo que he usado en suI=9
lugar (restando tres coincidencias anteriores en lugar de dos).Explicación del código:
fuente
Perl 5 , 100 bytes
Código de 99 bytes + 1 byte para el
-n
conmutador.Pruébalo en línea!
fuente
Python 3 , 225 bytes
Pruébalo en línea!
Directo: elimina primero los dígitos identificados por una letra específica.
fuente
Python 3 , 125 bytes
Pruébalo en línea!
Después de leer el desafío vinculado, me di cuenta de que esta es una variación de la solución Python de mdahmoune , que se basa en la solución ES6 de Draco18s , pero bueno, al menos jugamos dos bytes.
Al igual que esa solución, calculamos la respuesta a través de una combinación lineal del número de ocurrencias de ciertas letras. Codificamos brevemente las combinaciones lineales escribiéndolas como palabras en las que se agregarán las dos primeras letras y se restará todo lo siguiente. A veces se necesita un personaje para rellenar los dos primeros caracteres; usamos esto para ocultar el dígito que queremos generar (que nunca ocurrirá en la entrada, por lo que no afectará nuestro algoritmo), con el que extraemos
min
.fuente
R, 154
Pruébalo en línea!
fuente
Axioma, 351 bytes
resultados no comentados
fuente