Pautas
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" -> "ENOWTOHEETR"
)
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 toda 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
"ENOWOT" -> 12
"EONOTWHTERE" -> 123
"SNVEEGHEITNEIN" -> 789
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN" -> 123456789
"NOEWOTTOWHEERT" -> 1223
fuente
Respuestas:
Gelatina ,
3837 bytesUn enlace monádico que toma una lista de caracteres (la cadena) y devuelve un entero.
Pruébalo en línea!
Utiliza un muy diferente método para la respuesta de la jalea Pietu1998 ,
sin embargo, tiene el mismo número de bytes(Me pareció que puedeque no terminar como menos)!No se basa en la monotonicidad del número original (por lo que una entrada de
HTREEWTONOE
funcionaría, por ejemplo).¿Cómo?
Primero tenga en cuenta que las palabras mismas (y, por lo tanto, cualquier anagrama de las mismas) se pueden cambiar a las de longitud 4 eliminando cualquier Rs, Gs y Ss y reemplazando cualquier Os con dos caracteres (digamos "12") y cualquier X con tres caracteres ( decir "345").
Luego, podemos mapear el producto de los ordinales de esos caracteres a los números del 1 al 9 utilizando la aritmética del módulo, dependiendo de nuestra elección (el "12345"), luego buscarlos en una lista reordenada de los dígitos. El código se convierte en caracteres primero y luego reemplaza los ordinales, pero también es posible en 37 bytes con caracteres, por ejemplo, "DIAAE" ( pruébelo ).
fuente
NINEONENIENOENNNIENOENNEINEONEINEONNENIENOINNEINENINNEINENIENNIENNNNIENNEININENIENNENINEINENINENNIEINNEINNENNIENIN
.Python 2,
121117115 bytes-4 bytes: después de todo ese golf, olvidé incluir una variable de un solo uso. Pedo cerebral.
-2 bytes: sangría a doble espacio → sangría de una sola pestaña (gracias a Coty Johnathan Saxman); tenga en cuenta que esto no se muestra correctamente en la respuesta.
Sin golf (compatible con python 3):
Buscador de números mágicos:
Explicación:
Tenía la sensación de que podía romper los bits ASCII y resumirlos de alguna manera para determinar cuándo tenía una palabra completa. Originalmente intenté jugar
3**ord(letter)
y comparar los resultados esperados, pero resultó en algunos números muy grandes. Pensé que sería apropiado forzar un poco algunos parámetros, a saber, el módulo (para garantizar que los números sean pequeños) y un multiplicador para dispersar los números de manera diferente alrededor del rango del módulo.Terminé cambiando la variable multiplicadora en una variable que afecta la potencia en sí porque (de prueba y error) que de alguna manera logró darme una respuesta ligeramente más corta.
Y arriba puedes ver los resultados de esa fuerza bruta y un poco de golf manual.
La razón para elegir
3**x
originalmente es porque sabía que podía representar cada número allí. Los dígitos más repetidos que haya tenido cualquier número son dos (tres, sEvEn, NiNe, etc.), así que decidí pensar en cada entrada como un número de base 3. De esa manera podría (mentalmente) representarlos como algo así como10100000000010020000
(tres; un 1 en lat
ranura, un 1 en lar
ranura, un 1 en lah
ranura y un 2 en lae
ranura). Cada número de esta manera obtiene una representación única que se puede reconstruir fácilmente iterando la cadena y sumando algunos números, y termina independientemente del orden real de las letras. Por supuesto, esto no resultó ser la solución ideal, pero la solución actual todavía está escrita con esta idea en mente.fuente
\x83
,\x8e
y\x92
en la cadena.SyntaxError: Non-ASCII character '\xc2' in file <stdin> on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
. Funciona si pongo elcoding
comentario allí arriba, pero eso gana 15 bytes adicionales.Python 2 ,
131127bytesPruébalo en línea!
Basado en una versión corregida de la solución JavaScript Draco18s .
fuente
vars
!PHP , 164 bytes
Pruébalo en línea!
PHP , 179 bytes
basado en el enfoque anterior, verifique primero los números pares y luego los números impares en orden creciente
Pruébalo en línea!
PHP , 201 bytes
Pruébalo en línea!
fuente
ENOOWTWTOWOT
$i++<9
y en$i
lugar de$i<10
y++$i
(-1 byte);_405162738[$i]
en lugar de$i%2?$i/2+4:$i/2-1
(-4 bytes) ($i/2+~($i%2*-5)
también funcionaría, pero eso es un byte más).Javascript (ES6),
288150144 bytesMás largo que
los otros dos,una de las otras entradas de JS, pero pensé que abandonaría un enfoque interesante que podría funcionar para alguien en otro idioma.Esencialmente podemos determinar lo siguiente:
Cualquier aparición de estas letras implica que ese dígito existe en el número original. Desde aquí podemos deducir el resto de los dígitos:
Incluyendo los dos casos complicados:
Ambos
1
y9
área dura comparativamente. Para ONE,E
aparece más de una vez en algunas palabras (SEVEN
tiene dos) como haceN
(NINE
), por lo que estamos atascados con la verificación de loO
que ocurre en otros dos lugares, afortunadamente, ambos son simples.Para NUEVE, nueve es difícil, no importa cómo lo corte.
Así terminamos con este mapa:
9 es capaz de hacer referencia a siX, eiGht y Five (con 5 referencias hacia atrás) con las asignaciones variables, ahorrando bytes. Gracias a Neil por esto, utiliza varias características de JS con las que no estoy muy familiarizado (
('
por ejemplo, los ticks de fondo para la eliminación ) y en realidad se acerca mucho más a la idea que había escrito en papel antes de intentar codificarlo. (Dejé 9 como "lo que sobra", pensando en ello como "si veoX
que puedo eliminarlo y anS
yI
de la cadena, entonces ..." para que después de los cuatro casos simples los siguientes 3 se conviertan simple).La razón por la que esta entrada es interesante es porque puede manejar cualquier cadena aleatoria como entrada. es decir, en lugar de barajar las palabras individuales, podemos barajar la cadena completa, que es lo que pensé que John estaba haciendo originalmente:
fuente
s.split(t).length-1
2 bytes usandos.repeat(n>0&&n)
(¿por qué es n menor que cero de todos modos? Ahorra 7 bytes). Ahorre un montón de bytes declarandog
el alcance des
modo que no tenga que seguir pasándolo todo el tiempo, y mejor aún, puede convertirlo en una plantilla etiquetada, lo que ahorra 55 bytes en total (antes de 9 correcciones). Ahorre más bytes guardando valores repetidos en temporarios, y eliminé algunos más usandomap
:s=>[,(l=t=>s.split(t).length-1)`O`-l`W`-l`U`,w=l`W`,l`R`-w,u=l`U`,l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g].map((n,i)=>`${i}`.repeat(n)).join``
.Mathematica, 133 bytes
entrada
salida
fuente
c@#[[i]]
lugar dec[#[[i]]]
? Es posible que pueda guardar otro byte utilizando la sintaxis infija~
enTable
.C #, 218 bytes
Version corta:
Versión ampliada:
Prueba en línea!
Siendo mi primera entrada, no estoy seguro acerca de las reglas ... Solo estoy contando el tamaño de la clase utilizada para descifrar, no el código que lo prueba, ¿verdad?
Editar
Y por diversión, esto es lo que comencé a hacer, no leer las reglas completas: S - Véalo en IdeOne . Se descifra incluso cuando los caracteres de un dígito se pueden codificar en cualquier lugar de la cadena.
Editar 2
Acortado según los consejos de TheLethalCoder. ¡Gracias!
Editar 3
Y ahora Titus se afeitó unos pocos bytes más. ¡Gracias!
fuente
public static
. Puede convertir a un método anónimo comos=>{<do stuff>return"";}
. Puede usarvar
algunas veces, declarar variables juntas ahorra bytes, es decirint i=1,j;
. Crear una matriz a partir de una cadena y dividirla generalmente es más corta (aunque no lo he verificado en este caso), es decir"ONE|TWO".Split('|')
. Puede usar en<0
lugar de==-1
s=>{var n="ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE".Split('|');for(int i=0,j;++i<= 9;)for(j=0;n[i-1].IndexOf(s[j])<0;){if(++j==n[i-1].Length){var r=i+"";while(j<s.Length){j+=n[i].Length;r+=++i;}return r;}}return "";}
JavaScript (ES6),
142139 BytesGuardado 3 Bytes gracias a Neil .
Actualmente no aprovecha los números, siempre están ordenados en orden ascendente
fuente
"axbxc".split`x`.join``
. ¿Cómo se llama esto? Parece que no puedo encontrar nada en Google.split
yjoin
x=`foo${5+5}bar`
), que están etiquetados cuando se llama a una función de usarlos sin parens:foo`foo${5+5}bar`
lo que es lo mismo quefoo(['foo','bar'], 10)
f(s.slice(y))
siempre es una cadena, por lo que no necesita el''+
anterior.Jalea , 38 bytes
Pruébalo en línea!
Explicación
fuente
"EIGHTNINE"
:)3
con2.2
para usar un límite superior más pequeño, que le permite calcular fácilmente 789 sin cambiar el principio de funcionamiento.2
sería bueno, pero apenas fallaría para ciertas entradas con muchos seises.Javascript (ES6), 221 bytes
Fragmento de código de ejemplo:
fuente
Retina , 160 bytes
Pruébalo en línea! Basada en la respuesta de PowerShell de @TessellatingHeckler.
fuente
Retina , 88 bytes
Pruébalo en línea!
Explicación
fuente
PowerShell , 182 bytes
Pruébalo en línea!
Sin codificar pero no funciona el código:
por ejemplo,
(?<3>[THRE]{5})
coincide con la clase de caracteresTHRE
, por lo que puede coincidir con ellos fuera de orden, y tiene que coincidir con cualquiera de estos caracteres cinco veces uno al lado del otro, y el grupo de captura se llama '3' para asignar nombres con números.Compresión rudimentaria intercambiando el texto repetido
})|(?<
por az
.fuente
C ++,
296, 288 bytesVersion corta:
Versión completa:
Prueba en línea!
Edit:
1) 200->296 bytes, for including namespace and definition of N in the count, as suggested by orlp 2) 296->288, for using macro, thanks to Zacharý
fuente
N
andusing namespace std;
into your byte count.Q
right after it without any other additions.Ruby,
138114110 bytesByte count includes 1 byte for the
-p
option.What?
This:
is a regex literal which, through string interpolation, evaluates to:
If we assign that to
regex
, the rest of the code is somewhat easy to grasp: Each match in the input is substituted with the number of the capturing group, extracted from the magical variable$~
which contains the current match data:Try it online!
fuente
Java 8,
198256 bytes+58 bytes.. due to regex of the previous version not working properly (it was also matching "EEE";"EEN";etc.)
Explanation:
Try it here.
fuente
"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN"
:([ONE]{3}
is that it also matchesEEN
at the end of that test case with parts of EIGHT and NINE.. And I doubt there is a regex to match all these:ENO|EON|NEO|NOE|OEN|ONE
without also matchingEEE;EEN;EEO;...
for all numbers that is shorter than 40 bytes.. Maybe I can do something usingsubstring
and reverse checking the numbers, but I don't really have the time to figure it out now..Java (OpenJDK 8), 181 bytes
Try it online!
I took the liberty to reuse Kevin Cruyssen's TIO template. Hope you don't mind ;)
fuente
s.substring
. The worst part is, is that I am usings.substring
in my current answer, lol.. Ah well, +1 from me. Glad it's almost weekend..05AB1E,
3631 bytesTry it online!
View it ran with debug: TIO With Debug
fuente
FURONESEV
returnsFUR1SEV
:(Perl 5, 102 + 1 (-n) = 103 bytes
Try it online!
fuente
map{...}
can often be replaced withmap...,
,length
andy///c
are usually interchangeable too (not always smaller when not working on$_
though!), instead of thewhile
,++$,x s/^$i//
is shorter, and if you change-n
to-p
you can append to ` $\ ` instead of callingprint
! Try it online!Python 3,
238236 bytesTry it online!
Brute-force solution, doesn't take advantage non-decreasingness of digits.
Thanks to @Mr. Xcoder for saving 2 bytes!
fuente
def f(s):
in your byte count, this is not an anonymouos functionwhile len(s)>0
withwhile len(s)
e
into the function header for -1 byte. Also,exec
and list comprehensions might save bytes on indentation.PHP, 141 bytes
older version, 151 bytes:
loops through the digits from 1 to 9, counting unique characters in the word and subtracting non-unique characters´ counts, printing the digit on the go.
Although it is printing on the go, the digit counts must be stored for the
9
case to work.Run as pipe with
-nR
or try it online.It would save 4 more bytes to store the digit counts in
$a[$i]
instead of$a[$i+48]
and use ASCII1
and7
(in quotes) instead of the digit characters themselves.breakdown
ONE
is not the only word with anO
, so it needs to subtract the counts forW
(only appearing inTWO
) andU
(only appearing inFOUR
) and so on.NINE
is special, because there is no way to just subtract if I used the letters (that would requireI-X-G-F+U
orN-O-S+W+U+X
), so I use the digit counts instead.PHP, 160 bytes
assumes all upper case input; characters may be scrambled all over.
Run as pipe with
-nR
or try it online.explanation
loops through the digit words, counting their unique characters´ occurences in the input and in the process reducing the count of other characters. "Other characters" could mean all other characters in the word; but only considering those that will be needed later saved 19 bytes.
Transforming the
str_repeat
loop to a combined loop saved 5 bytes.And using variable variables for the digit count saved another 8.
breakdown
fuente