Muchos lenguajes de programación se escriben utilizando únicamente ASCII imprimible, pestañas y líneas nuevas. Estos 97 caracteres se almacenan en bytes de 8 bits (que en realidad son capaces de contener 256 caracteres diferentes), lo cual es terriblemente ineficiente, especialmente en el golf de código, ¡donde cada byte cuenta! En este desafío, podrá reducir su puntaje utilizando la conversión de base.
Desafío
Su programa / función toma una cadena o matriz de caracteres como entrada, que luego interpreta como un número base-97 . Luego convierte esto en un número base-256 y cuenta el número de símbolos (es decir, bytes) necesarios para representar este número. Este conteo será el valor de salida / retorno de su programa / función.
Un ejemplo simple usando base-2 y base-10 (binario y decimal): si la entrada es 10110
, la salida sería 2, ya que 10110 2 = 22 10 (dos dígitos necesarios para representar la salida). Del mismo modo, 1101 2 se convierte en 13 10 , dando una salida de 2 también, y 110 2 se convierte en 6 10 , por lo que la salida sería 1.
La cadena de entrada puede contener los 95 caracteres ASCII imprimibles, así como la nueva línea \n
y la pestaña literal \t
, que crea un alfabeto fuente de 97 símbolos para su conversión base. El alfabeto exacto será (sustituyendo el \t
y \n
con la pestaña literal real y la nueva línea; tenga en cuenta el espacio literal que sigue a la nueva línea) :
\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Tenga en cuenta que el orden de este alfabeto es importante: por ejemplo, base-97 \t
corresponde a decimal 0
y !
corresponde a decimal 3
.
Algunos casos de prueba: (no necesita manejar una cadena vacía)
Input Output
'[email protected]' 15
'All your base are belong to us!' 26
' abcd' 9
'~ abcd' 10
'ABCDEFGHIJK' 9
'zyxwvutsrpq' 10
'{".~"}.~' 7
'\t\t\t\t\t\t\t\t' 1 (with \t a literal tab; the result is 0, which can be represented with 1 byte)
'!\t\t\t\t\t\t\t\t' 7 (with \t a literal tab)
Puntuación
Si su entrada usa solo ASCII imprimible, nueva línea y / o pestaña: La puntuación de su programa será la salida de su programa, cuando se le dé su propio código fuente como entrada.
Si su entrada usa caracteres que no son imprimibles ASCII, nueva línea o tabulación: La puntuación de su programa es simplemente el número de bytes, como en code-golf .
fuente
Respuestas:
Python 2 , puntaje
737271Editar: -1 gracias a @Jonathan Allan
Pruébalo en línea!
fuente
/
debería estar bien, creoor 1
puede ser reemplazado con|1
en este caso.Japt , puntaje 19 (23 bytes)
¡Pruébalo en línea!
Por coincidencia, no creo que esto pueda jugarse mucho incluso con personajes no ASCII ...
Explicación
fuente
Jelly ,
1817 bytes - puntaje1817-1 byte gracias a Erik the Outgolfer (no es necesario tener una lista de listas para la traducción)
Pruébalo en línea!
¿Cómo?
- Lo mejor que tengo con ASCII solo es un puntaje de 29 :
- Esto también es extremadamente ineficiente. Traduce los ordinales como arriba, pero la conversión de la base 97 se logra repitiendo los valores y sumando, en lugar de usar la multiplicación directa; es decir, al convertir
{".~"}.~
, obtiene los índices ajustados,[93,4,16,96,4,95,16,96]
luego los invierte (U
) y los repite para hacer[[96,96,..., 97⁷ times ...,96],[16,16,... 97⁶ times ...16],[95,95,... 97⁵ times ...95],[4,4,... 97⁴ times ...4],[96,96,... 97³ times ...96],,[16,16,... 97² times ...,16],[4,4,... 97 times ...4],[93]]
y luego sumas, se convierte en base 256 y obtiene la longitud (si no se ha quedado sin memoria: p).fuente
J , 36 bytes, puntaje = 30
Pruébalo en línea!
J usa solo los caracteres ASCII de 7 bits para sus primitivas.
Explicación
fuente
Gaia , 14 bytes, puntaje 14
Pruébalo en línea!
Explicación
Solo ASCII
Esto es lo mejor que se me ocurre usando solo ASCII, dando una puntuación de 19:
La dificultad está en la conversión de entrada. La única forma razonable de convertir desde el sistema base-97 es usar
B
, ya que la asignación requiere el no ASCII¦
. Además, actualmente no hay una manera de hacer un rango de caracteres sin mapearc
en un rango de números, que sufre el mismo problema. La mejor solución que pude ver fue construir la cadena₵R
y evaluarla.fuente
₵R
y₵r
no es fácil de reemplazar, aunque₸
obviamente lo es), pero puede ser interesante ver cómo se compara.₵
es el punto de código 8373 y tampoco puedo hacer rangos de caracteres en ASCII, lo cual es un poco frustrante ya que la mayoría de este programa es ASCII.c
pero aplicado a cada personaje,$
solo muestra todos los números)c
sobre la lista, que seríac¦
₵r
es fácil de reemplazar, ya que podría usarlo256
en su lugar, solo lo usé porque es 1 byte más corto y el programa no era ASCII solo de todos modos.Python 2 , puntaje 60
Pruébalo en línea!
Asignación a base-97
El valor de un carácter se obtiene mediante
ord(c)-[30,9][c<' ']
: su código ASCII, menos 9 para pestañas y líneas nuevas (que preceden' '
lexicográficamente), o menos 30 para todo lo demás.Convertir a un número
Usamos
reduce
para convertir la cadena en un número. Esto es equivalente a la computaciónBase de cómputo de longitud 256
El valor de retorno de
bin
es una cadena, que se parece a esto:Llama a su longitud
L
. Un valor con unan
representación binaria -bit tiene una representaciónceil(n/8)
-bit base-256. Podemos calcularn
comoL-2
; también,ceil(n/8)
se puede escribir comofloor((n+7)/8)
=n+7>>3
, entonces nuestra respuesta esL-2+7>>3
=L+5>>3
.El caso en el que la cadena de entrada tiene el valor 0 se maneja correctamente, como
bin
retornos"0b0"
, por lo que retornamos3+5>>3
= 1.fuente
c>=' '
o de lo contrario mapearía el espacio a 23 en lugar de 2. En el código ordinario, el golfc>'\x1f'
(un byte sin procesar) me habría ayudado, pero eso no es ASCII imprimible ...APL, puntaje 24 (bytes *)
Asume el valor predeterminado
⎕IO←1
, de lo contrario simplemente cambie ¯31 a ¯30.Explicación:
Ejemplos:
________________
*: APL se puede escribir en su propio juego de caracteres heredado (definido por
⎕AV
) en lugar de Unicode; por lo tanto, un programa APL que solo usa caracteres ASCII y símbolos APL puede puntuarse como 1 char = 1 byte.fuente
⎕AV
(al menos para Dyalog), como⍸
. Sin embargo, todos sus símbolos cuentan como un byte cada uno. Por lo tanto, no todos los símbolos APL = 1 byte como dice en la nota al pie. (Solo pensé que te lo haría saber.) Además, ¿qué dialecto APL estás usando?Perl 5 , 76 + 1 (-F) = 77 bytes
Pruébalo en línea!
¿Cómo?
Implícitamente, separe los caracteres de la entrada (
-F
), almacenando todo eso en @F. Cierre elwhile
bucle implícito y comience un nuevo bloque (}{
) (¡ Gracias, @Dom Hastings! ). Para cada personaje, multiplique su valor por 97 al poder apropiado. Calcule el número de caracteres encontrando el tamaño de la suma en base 256 usando logaritmos.fuente
Jalea , puntaje: 18 (bytes)
Pruébalo en línea!
fuente
Ruby , 70 bytes, puntaje 58
Pruébalo en línea!
fuente
MATL (19 bytes), puntaje 16
Los caracteres no imprimibles (tabulación, nueva línea) en la cadena de entrada se ingresan contactando sus códigos ASCII (
9
,10
) con el resto de la cadena.La parte inicial
9=?1}G
solo es necesaria debido a un error en la funciónZa
(conversión de base), que hace que falle cuando la entrada solo consta de "ceros" (pestañas aquí). Se solucionará en la próxima versión del idioma.Explicación
fuente
Befunge-93,
8379 bytes, puntaje7465Pruébalo aquí!
El programa primero convierte la entrada a un número base-97, y luego cuenta cuántos dígitos se requieren para un número base-256. Como tal, el número base-97 es enorme, tan grande que TIO generará un valor máximo de 8 para valores grandes; sin embargo, al intérprete JS no le importa y generará el valor correcto.
fuente