Tarea
Codifique una cadena que consista completamente en alfabetos en mayúscula ( A-Z
) usando solo ceros y unos, usando su propio esquema favorito. ¡Pero la regla no es tan simple!
Reglas
- Su programa / función debe manejar correctamente cualquier cadena de entrada válida de longitud 8 .
- Los resultados deben tener la misma longitud para todas las entradas.
- Los resultados deben ser distintos para entradas distintas.
- Los resultados deben ser lo más cortos posible.
- Los resultados deben ser cero-uno equilibrado (tener un número similar a los de ceros). No tienen que ser iguales (es decir, perfectamente equilibrados), pero su puntaje será penalizado por eso.
No tiene que proporcionar un programa / función que decodifique su codificación.
Entrada y salida
- Puede decidir aceptar cualquier conjunto de 26 caracteres ASCII imprimibles distintos en lugar de
A-Z
. - Puede decidir generar cualquier par de caracteres ASCII imprimibles distintos en lugar de
0
y1
. - No puede generar un número entero en lugar de una cadena de bits, ya que puede tener ceros a la izquierda y no está claro si realmente cumplió con la regla 2.
- Si decide desviarse del valor predeterminado (
A-Z
entrada y01
salida), debe especificar los conjuntos de caracteres de entrada / salida en su envío.
Puntuación
- Puntaje base: tamaño del código, o 1 si su programa está vacío.
- Sanciones
- Penalidad por longitud: multiplicar
1.5 ** (encoded length - 42)
- No hay bonificación por ser más bajo; 42 es la longitud mínima para una codificación perfectamente equilibrada de cadenas de 8 longitudes con un tamaño de alfabeto 26.
- Penalización por estar desequilibrado: multiplica
2 ** max(abs(ones - zeros) for every valid input of length 8)
, dondeones
yzeros
son los recuentos de 1 y 0 en cada salida, respectivamente. - Su envío debe mostrar el peor de los casos (entrada / salida) o una explicación teórica sobre el valor de la penalización.
- Penalidad por longitud: multiplicar
- El puntaje más bajo gana.
Presentación de ejemplo
Esolang hipotético, 0 bytes, puntuación 74733.8906
Aquí hay un hipotético esolang, donde un programa vacío imprime todos los códigos ASCII de los caracteres de entrada en binario.
Por ejemplo, si da AAAAAAAA
como entrada, el programa imprimirá 1000001
8 veces seguidas, es decir 10000011000001100000110000011000001100000110000011000001
.
El alfabeto de entrada se elige para ser CEFGIJKLMNQRSTUVXYZabcdefh
. De esta manera, todos los caracteres se convierten a siete dígitos en binario, y los recuentos de cero uno difieren solo en uno por carácter (todos tienen tres 1 y cuatro 0 o viceversa cuando se convierten en binario).
La longitud de salida siempre es 56, y el desequilibrio en el peor de los casos ocurre en las entradas como CCCCCCCC
, donde los ceros aparecen 8 veces más que unos.
Por lo tanto, el puntaje de esta presentación es 1.5 ** (56 - 42) * 2 ** 8 == 74733.8906
.
fuente
Respuestas:
Stax , 11 bytes, 0 penalización, Puntuación 11
Este programa utiliza
[0-9A-P]
para entrada y[01]
salida.Ejecútelo y depúrelo en línea : haga clic en el botón Ejecutar para comenzar. Los primeros cuatro casos de prueba se ejecutan en milisegundos. El quinto en segundos. El sexto en milenios.
La representación ascii correspondiente de este programa es la siguiente.
Se apoya fuertemente en las
|N
instrucciones, que obtienen la permutación posterior de una matriz.Todas las salidas son permutaciones de la cadena inicial. Tiene 21 ceros y 21 unos. Por lo tanto, todas las salidas tienen 42 caracteres y están perfectamente equilibradas.
fuente
Jalea , 19 bytes
Pruébalo en línea!
Explicación
fuente
Pyth,
201914 bytes, Diferencia máxima: 0, Longitud: 64, Puntuación:149636.5528142154.7251104745.5869Pruébalo en línea!
Utiliza el alfabeto en minúsculas (
[a-z]
) en lugar de mayúsculas. Puede usar mayúsculas reemplazandoG
porrG1
, a un costo de 2 bytes.Podría haber traducido la respuesta Python 3 de HyperNeutrino para obtener una mejor puntuación, pero, francamente, quiero una respuesta que realmente funcione.
fuente
Python 2 ,
779645 bytes, Máx. (Dif.) = 0, Longitud = 48, Puntuación = 7346.95Pruébalo en línea!
El número mágico
4lnk28t9vtqgfrpfda9uyfrjhcjwjvno6aec2nwegi0g4mnublc05dher8fjm4s5gh55lu87a4itmc74t6tozcsfdbxkg82frwljy0wam1jht98g2j0bma021v5d48pwq0fklv0n1ltrxft1fpk5gt5mx5fj4p2mjqqpvcylt1xayxf1iwdmyoxgfvl7oui1oo6147bm9rqpqut9ns8hhjc77t3pqy48otovrsm1t4mmleumspkuef66ma1vi0l4mtkwaeeizuvvds9fro3vhc0mrn6ox17rdpk7xw747qf28934u5jci5q1qj81i7dyf7rf0x7hb19xm93xhxsgh4w8ifs6fhynsddbo9j938ewfvhjlbpiz50n5hanmno6c89blyx50e89z7vjq2ho2r2u2wwyu4q18kv4fi1nhmfbgjbnkdayr5kblaped4fo5u97bi9a67d89irxa0r9cinmnohfgjmh5fhkcr33
(en base 36), o su equivalente decimal382136276621246556626597379364678993894472503063952720559883124988542417847157286833446006767955087631166943136913765901237281892296575754126024183763829277879554548743231384272055945084065681774297483130020386641869860456147616177702938121538230311395513497506285733567467605871232294046704309941152721616618474501854355102646152223338484615876165254236449912858255665248186687952137487016925761633237335983620006273901509768720506129789443353730706676483647298576692613113269388239830925662977837917272690235355742330377154505179476767457756888107428475384947712227312747517748632498691058764154580934614231152483398774630508576533263098942260213967880819240793990219283490212843120923539516962682466148372296338428497778127570401190309339992457562121354271
, codifica las 252 permutaciones de 50
sy 51
s.Los primeros convertidos algoritmo
A-Z
en0-25
y tratan como un número en base 26, a continuación, añadir56*252**4
.Luego, el número se convierte en un número base-252 de 5 dígitos, y se sustituye con la permutación correspondiente de 5
0
sy 51
s.Después de eso, elimine los primeros 2 bits, lo que está garantizado
01
. Luego hemos codificado la cadena en una cadena de 48 bits, que consta de exactamente 240
sy 241
s.fuente
7346.953125
).JavaScript (ES8), puntaje 22186.623779296875
Para una entrada de longitud uniforme, siempre genera 3.5 * de ceros y unos, por lo que solo paga la penalización de 1.5 ** 14. Caracteres soportados:
'+-.3569:<GKMNSUVYZ\cefijlqrtx
.fuente
Jalea , 16 bytes
Utiliza
+,-./0123456789:;<=>?@ABCD
para entrada y devuelve una lista de unos y ceros.Esto intenta crear una lista de 538,257,874,440 combinaciones en la memoria, por lo que necesitará una gran cantidad de RAM para ejecutarla como está ...
Pruébalo en línea! (comprobable; longitud de entrada 3, longitud de salida 18)
Cómo funciona
fuente
Python 3 ,
985135bytes, Diferencia máxima 0, Longitud 42, puntaje 135Pruébalo en línea!
Cortesía de Bubbler.
Código sin golf:
Dado que otros enfoques parecen bastante ineficientes, he tratado de hacer un tiempo óptimo. Es claramente O (N) en N bits de codificación, lo cual es óptimo para Big-O.
Sugerencia: trate de pensar en el triángulo de Pascal para este ( este diagrama lo revela)
Resultados de muestra:
Tiempo de ejecución: <0.013 s (aproximadamente constante para todas las entradas)
fuente
Perl 5 , 55 bytes, diferencia máxima 0, longitud 42, puntaje
5655Esto funciona, pero tomará un tiempo largo pero factible (
ZZZZZZZZ
tomó 2.5 días en mi computadora). La memoria no es problema.Se usa
A-Z
como entrada1
yA
como caracteres de codificación. Siempre están perfectamente equilibrados. Omite las primeras26^7 = 8031810176
combinaciones equilibradas que representan cadenas de menos de 8 caracteres, pero está bien, ya que están538257874440
disponibles y uso208827064575
y208827064575 + 8031810176 < 538257874440
.Sin embargo, en realidad "cuenta" hasta la combinación objetivo, lo que llevará mucho tiempo. Es por eso que en el enlace TIO solo usé una cadena de entrada demasiado corta (que también son compatibles) para demostrar que la salida es correcta. Funcionará un poco más que
AAAAAA
antes del tiempo de espera de TIO.ZZZZZZZZ
debería ser aproximadamente26^3 = 17576
más lento.Pruébalo en línea!
El decodificador es casi el mismo:
Pruébalo en línea!
fuente
> <> , 75 bytes, Diferencia máxima 0, Longitud 42, puntaje 75
Pruébalo en línea!
Advertencia justa, esto llevará mucho, mucho, mucho tiempo en completarse incluso para el
AAAAAAAA
caso trivial . Corre a través de cada representación binaria de un contador hasta que1
se alcanza el número binario (base 26 de la entrada) con 21 s. Si quiere probar el programa de alguna manera, puede reemplazar elab+
en la tercera línea con la1
que devolverá el enésimo número binario con solo uno1
, ¡ Pruébelo en línea!fuente
Python 3 , 75 bytes, Diferencia máxima 0, Longitud 42, Puntuación 112
Pruébalo en línea!
Esto solo funciona en teoría debido a restricciones de memoria. Existen
538257874440
distintas cadenas equilibradas de cero uno de longitud 42 y208827064575
posibles entradas, por lo que algunas de las posibles salidas no se utilizarán.-37 bytes gracias a @recursive
fuente
int(s,26)
para su valor de índice en lugar desum(...)
si cambia su conjunto de caracteres de entrada.[0-9A-P]
, ¿no? En mi máquina,int("123ABC",26) == 12855114
C ++, 146 bytes, longitud máxima 42, 0 desequilibrio, puntaje 146
Funciona para cualquier char 26 continuo, pero advirtiendo que se ejecuta un tiempo inaceptable
fuente
#include<algorithm>
por#import<regex>
.