Problema:
Debe hacer un programa que haga lo siguiente:
- toma una cadena grande de texto en minúsculas y cuenta todas las apariciones de cada letra.
- luego pones las letras en orden de mayor a menor ocurrencia.
- luego toma esa lista y la convierte en un codificador / decodificador para el texto.
- luego codifica el texto con ese cifrado.
¿Difícil de entender? Ver este ejemplo:
Ejemplo:
Texto de entrada:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc sed dui en nisi euismod pellentesque ac sed enim. Nullam auctor justo quis diam faucibus, eu fringilla est porttitor. Pellentesque vel pharetra nisl. Vestibulum congue ultrices magna a fringilla. Quisque porttitor, risus suscipit pellentesque tristique, orci lorem accumsan nisi, scelerisque viverra turpis metus sit amet sapien. Fusce facilisis diam turpis, nec lobortis dui blandit nec. Vestibulum ac urna ut lacus commodo sollicitudin nec non velit. Nulla cursus urna sem, en tincidunt sem molestie vel. Nullam fringilla ante eu dolor bibendum, posuere iaculis nunc lacinia. Sed ac pretium est, vel scelerisque nisl. Phasellus lobortis dolor sodales sapien mollis hendrerit. Entero scelerisque tempor tellus, viverra varius neque mattis in. Entero porta vestibulum nisl, et feugiat tortor tincidunt vel. Aenean dignissim eleifend faucibus. Morbi nec neque vel ante pulvinar mollis eu in ipsum.
Convierte a minúsculas.
Recuento de caracteres (por letra. Espacios y puntuación ignorados):
[('a', 49), ('b', 11), ('c', 34), ('d', 22), ('e', 93), ('f', 9), ( 'g', 10), ('h', 3), ('i', 89), ('j', 1), ('k', 0), ('l', 61), ('m ', 31), (' n ', 56), (' o ', 37), (' p ', 20), (' q ', 12), (' r ', 47), (' s ', 71), ('t', 59), ('u', 65), ('v', 15), ('w', 0), ('x', 0), ('y', 0) , ('z', 0)]
Recuento de char pedido:
[('e', 93), ('i', 89), ('s', 71), ('u', 65), ('l', 61), ('t', 59), ( 'n', 56), ('a', 49), ('r', 47), ('o', 37), ('c', 34), ('m', 31), ('d ', 22), (' p ', 20), (' v ', 15), (' q ', 12), (' b ', 11), (' g ', 10), (' f ', 9), ('h', 3), ('j', 1), ('k', 0), ('w', 0), ('x', 0), ('y', 0) , ('z', 0)]
Luego cree una tabla de búsqueda utilizando las listas originales y ordenadas:
abcdefghijklmnopqrstuvwxyz
||||||||||||||||||||||||||
eisultnarocmdpvqbgfhjkwxyz
Diccionario de Python:
{'o': 'v', 'n': 'p', 'm': 'd', 'l': 'm', 'k': 'c', 'j': 'o', 'i': 'r', 'h': 'a', 'g': 'n', 'f': 't', 'e': 'l', 'd': 'u', 'c': 's', 'b': 'i', 'a': 'e', 'z': 'z', 'y': 'y', 'x': 'x', 'w': 'w', 'v': 'k', 'u': 'j', 't': 'h', 's': 'f', 'r': 'g', 'q': 'b', 'p': 'q'}
Y ahora codifique el texto original con esta tabla de búsqueda:
'Lvgld rqfjd uvmvg frh edlh, svpflshlhjg eurqrfsrpn lmrh. Njps flu ujr eh prfr ljrfdvu qlmmlphlfbjl es flu lprd. Njmmed ejshvg ojfhv bjrf ured tejsrijf, lj tgrpnrmme lfh qvghhrhvg. Plmmlphlfbjl klm qaeglhge prfm. Vlfhrijmjd svpnjl jmhgrslf denpe e tgrpnrmme. Qjrfbjl qvghhrhvg, grfjf fjfsrqrh qlmmlphlfbjl hgrfhrbjl, vgsr mvgld essjdfep prfr, fslmlgrfbjl krklgge hjgqrf dlhjf frh edlh feqrlp. Fjfsl tesrmrfrf ured hjgqrf, pls mvivghrf ujr imepurh pls. Vlfhrijmjd es jgpe jh mesjf svddvuv fvmmrsrhjurp pls pvp klmrh. Njmme sjgfjf jgpe fld, eh hrpsrujph fld dvmlfhrl klm. Njmmed tgrpnrmme ephl lj uvmvg irilpujd, qvfjlgl resjmrf pjps mesrpre. Slu es qglhrjd lfh, klm fslmlgrfbjl prfm. Paeflmmjf mvivghrf uvmvg fvuemlf feqrlp dvmmrf alpuglgrh. Iphlnlg fslmlgrfbjl hldqvg hlmmjf, krklgge kegrjf plbjl dehhrf rp. Iphlnlg qvghe klfhrijmjd prfm, lh tljnreh hvghvg hrpsrujph klm. Alplep urnprffrd lmlrtlpu tejsrijf. Mvgir pls plbjl klm ephl qjmkrpeg dvmmrf lj rp rqfjd.
¡Amo python!
Reglas:
- Su programa aceptará una cadena y generará una.
- Convierta todas las entradas a minúsculas antes de hacer algo
- No me importa cómo clasificas la lista, pero solo cuento letras minúsculas
- Puntos de bonificación (-30) para hacer un descifrador (sin copiar la lista de descifrado, hágalo desde cero
- Esto es código-golf, ¡entonces gana el código más corto!
- ¡Que te diviertas!
Bonus points (-30) for making a decryptor (no copying the decryption list, do it from scratch
? ¡ESO ES IMPOSIBLE! Necesitaría tener la clave (su "lista de descifrado" también conocida como "tabla de búsqueda") para poder hacer eso. Simplemente tomar un texto cifrado y esperar que alguien proporcione un descifrador que lo transforme nuevamente en texto simple sin el uso de ninguna tecla es como si nos pidiera que publiquemos una pregunta en StackOverflow sin escribir letras o números. La teoría de la información ya nos dice que no puede obtener información de la nada ... por lo que su cifrado de sustitución necesita esa tabla de búsqueda (también conocida como clave).Respuestas:
GolfScript, 39 caracteres
Versión en línea para pruebas. Tenga en cuenta que la clasificación no se define si varios caracteres tienen el mismo recuento en la cadena de entrada.
Salida de ejemplo
fuente
Bash / coreutils, 91 caracteres
Guardar como
cipher.sh
, chmod + x it y ejecutar:fuente
Rubí,
1049291 caracteresSalvé bastantes personajes gracias a @Chron
Versión en línea aquí. La clasificación de caracteres con el mismo recuento no está definida, como se menciona en otra respuesta. Con la entrada "asdf", cada respuesta tiene otra salida hasta ahora.
En otras palabras: todas las respuestas tienen el mismo comportamiento (por lo tanto, representan una codificación decodificable) cuando la entrada contiene el alfabeto completo con cada letra con un recuento único.
fuente
("a".."z").to_a
puede ser[*?a..?z]
,m.join
puede serm*''
ydef f(s)...end
puede serf=->s{...}
Mathematica 171
Asumiendo
t
es el texto Lorem ipsum.Las reglas de reemplazo generadas por
Thread…-> l
fueron:fuente
K, 43
fuente
C # 386
Sin comprimir
fuente
e93i89s71u65l61t59n56a49r47o37c34m31d22p20v15q12b11g10f9h3j1k0w0x0y0z0
. Y ni siquiera se acerca al desafío.PHP, 151
(con ajuste
short_open_tag = On
)Esto espera que el texto sea el primer argumento del guión. Al igual que:
fuente
R, 137
Salida (basada en el ejemplo en cuestión):
fuente
Smalltalk, 138
entrada en s:
el decodificador es:
pero como (si entiendo correctamente) no puedo reutilizar "i" y "m", jugaré golf sin él. El código anterior tiene dos CR adicionales insertados para facilitar la lectura, que no se contaron en el recuento de caracteres.
fuente
Clojure, 135
(Suponiendo que el texto de entrada está contenido en la var
s
)fuente
Python 2.7 (147)
No es el código más corto en absoluto, pero como Python aún no está representado y como veo "¡Amo a Python!" en la configuración del problema, aquí voy,
Espera que la cadena de entrada se pase a través de la línea de comando. (el número de caracteres se reduce a 122 si la cadena de entrada se insertó mágicamente en la variable "s")
Ouput
fuente
Perl, 84
.
PD: ¿Fue una broma sobre descifrar? ¿O debería reclamar 30 bonos por demostrar que es imposible? ¿Está
aab
descifradoaab
obba
? Obabaca
, ¿eracacaba
oababcb
en el original, obabaca
sí, literalmente?fuente
C # - 393 bytes
La versión extendida de la respuesta de @ PauloHDSousa ...
fuente