Este es mi primer desafío en ppcg!
Entrada
Una cadena que consta de dos caracteres ascii diferentes. Por ejemplo
ABAABBAAAAAABBAAABAABBAABA
Reto
La tarea es decodificar esta cadena siguiendo estas reglas:
- Salta los dos primeros caracteres
- Divida el resto de la cadena en grupos de 8 caracteres.
- En cada grupo, reemplace cada carácter con
0
si ese carácter es el mismo que el primer carácter de la cadena original, y1
si no - Ahora cada grupo representa un byte. Convierta cada grupo en carácter a partir del código de bytes
- Concatenar todos los personajes
Ejemplo
Decodifiquemos la cadena de arriba.
AB AABBAAAA AABBAAAB AABBAABA
^^ ^ ^ ^
| | | |
| \---------|---------/
| |
Skip Convert to binary
Observe que A
es el primer carácter de la cadena original y B
es el segundo. Por lo tanto, reemplace cada A
con 0
y cada uno B
con 1
. Ahora obtenemos:
00110000 00110001 00110010
que está [0x30, 0x31, 0x32]
en binario Estos valores representan caracteres ["0", "1", "2"]
respectivamente, por lo que la salida final debería ser 012
.
Tanteo
Esto es, por supuesto, code-golf , lo que significa hacer que su código sea lo más corto posible. La puntuación se mide en bytes.
Restricciones y formato IO
Aplican reglas estándar. Aquí hay algunas reglas adicionales:
- Puede asumir una entrada válida
- La cadena de entrada consta de exactamente dos caracteres diferentes
- Los dos primeros personajes son diferentes.
- La longitud mínima de la cadena de entrada es de 2 caracteres.
- La longitud siempre dará 2 módulo 8
- Puede suponer que la cadena siempre constará solo de caracteres ASCII imprimibles
- Tanto en la entrada como en la cadena decodificada
- Los espacios en blanco iniciales y finales están permitidos en la salida (todo lo que coincida
/\s*/
)
Respuestas:
brainfuck ,
76 7165 bytes-6 bytes gracias a Nitrodon!
Pruébalo en línea!
Se siente extraño golpear a Python ...
fuente
Stax ,
1511 bytes¡Ejecútelo y depúrelo en staxlang.xyz!
Enfoque rápido y sucio. Trabajando para mejorarlo.¡Lo mejoré!Desempaquetado (13 bytes) y explicación
fuente
JavaScript (Node.js) , 67 bytes
Pruébalo en línea!
¿Cómo?
Utilizamos dos sintaxis diferentes del
Buffer
constructor:Buffer([n])
genera un búfer que contiene el único byte n y se obliga al carácter ASCII correspondiente. Solo se consideran los 8 bits menos significativos de n .Buffer(n)
genera un búfer de n bytes. Por lo tanto,Buffer(0)
genera un búfer vacío, que se convierte en una cadena vacía.Nota: Ambos están en desuso en versiones recientes de Node.
Buffer.from([n])
yBuffer.alloc(n)
debe usarse en su lugar.Comentado
fuente
bash,
595852 bytesPruébalo en línea!
Gracias a Cows quack por guardar 6 bytes.
Este desafío funciona notablemente bien con una serie de coreutils (y
dc
para hacer la conversión y la salida al final). Primero, usamospara transcribir los dos caracteres en la entrada a ceros y unos. La
-t
bandera trunca el primer argumento a la longitud del segundo, por lo que esto se reduce a transcribir los primeros dos caracteres en la entrada a0
y1
, que es lo que queremos. Luego,elimina los dos primeros caracteres y
genera 8 de los caracteres por línea. Finalmente, el
sed
comando convierte cada línea en undc
fragmento que lee el número como binario y genera ese byte.fuente
cut -c
puede ser eliminado)Código de máquina Z80 en un Amstrad CPC,
32 3130 bytesEl código toma la instrucción de reemplazar cada carácter con
0
si ese carácter es el mismo que el primer carácter de la cadena original, y con lo1
contrario literalmente y nunca se molesta en verificar que un carácter coincida con el segundo carácter en la cadena de entrada. Simplemente comprueba el mismo como primer carácter y diferente del primer carácter.Salí corriendo de registros (el Z80 tiene solamente 7 fácilmente utilizables registros de 8 bits, las instrucciones al resto necesidad más largos) por lo que poner
&01
enH
, junto con el usoL
de construir el carácter ASCII (Me di cuenta de que es innecesaria para inicializarL
, el ahorro de un byte ) Cuando seH
desborda en la bandera Carry, el personajeL
está listo para salir. Afortunadamente, hay un 16 bitsADC
( Ad d con C arry) que hace el trabajo de una instrucción de desplazamiento a la izquierda.(DE)
solo se puede leer,A
aunque(HL)
se puede leer en cualquier registro de 8 bits, por lo que fue un compromiso cuál usar. No podía comparar(DE)
conC
directamente, así que tuve que cargar uno enA
primer lugar. Las etiquetas son solo palabras aleatorias que comienzan conL
(un requisito del ensamblador).A
el acumulador: el único registro que puede hacer comparacionesB
el contador se registrapara la instrucción. Al reorganizar el código, pude hacer el trabajoDJNZ
: D ecrement (B
) y J ump si N en Z eroDJNZ
con un byte menosC
el primer caracter en la cadena de entradaD
,E
comoDE
la dirección del carácter de entrada actualH
el gatillo de transporte (cada 8vo bucle)L
el carácter de salida que se está construyendofuente
05AB1E , 10 bytes
Pruébalo en línea!
-3 gracias a emigna.
fuente
01‡
lugar del bucle. EDITAR: o incluso mejor:¦¦Sk8ôJCçJ
J,
1713 bytes-4 gracias a FrownyFrog
Versión antigua:
Explicación:
Ejemplos:
fuente
2}.1{=
para guardar 4 bytes.[:
al principio :)Python 2 , 77 bytes
Pruébalo en línea!
fuente
R , 71 bytes
Pruébalo en línea!
Sorprendentemente golfístico!
Primero, convierte la cadena en puntos de código ASCII con
utf8ToInt
, guardándola comoy
. Eliminar los dos primeros caracteres con indexación negativa es más corto que usartail
.La matriz
y[-1:-2]==y[2]
es equivalente a los bits cuando%*%
se aplica (multiplicación de matriz), pero primero damos forma a esa matriz enmatrix
anrow=8
, convirtiéndola de una matriz lineal a agrupaciones de bytes. Afortunadamente, podemos convertir a los puntos de código ascii usando la multiplicación de matrices con las potencias apropiadas de 22^(7:0)
, y luego convertimos los puntos de código a una cadena conintToUtf8
.fuente
Python 3 , 77 bytes
Pruébalo en línea!
fuente
PHP,
7371 bytesEjecutar como tubería
-nR
o probarlo en línea .campos de golf:
-6
y pre-incremento por8
strtr
ignora los caracteres excesivos en el parámetro más largo (no essubstr
necesario)10
y luego invertir no necesita comillas -> -1 byte~
sirve como límite de palabra -> -1 byte.fuente
for(;$s=substr($argn,2+8*$i++,8);)echo~chr(bindec(strtr($s,$argn,10)));
Pyth,
209 bytesGuardado 11 bytes gracias a FryAmTheEggman.
Pruébalo aquí
Explicación
fuente
Ruby ,
8279 bytesPruébalo en línea!
fuente
.join
puede ser reemplazado por*''
, ys[0..1]
pors[0,2]
.Japt, 11 bytes
Intentalo
Explicación
fuente
s2
atajo, agradable.PHP + GNU Precisión múltiple,
6361Lamentablemente, la extensión GMP no está activada por defecto (sino que se envía).
Corre así:
fuente
<?=
ahorra 2 bytes y posiblemente el día. ;-)-R
(lo intenté).-F
lugarHaskell , 75 bytes
Pruébalo en línea!
fuente
Java 8,
143142141 bytes-1 byte gracias a @ OlivierGrégoire .
Pruébalo en línea.
Explicación:
fuente
Python 3 ,
9986 bytesPruébalo en línea!
Gracias a ASCII-only por básicamente todo el asunto realmente
fuente
APL + WIN, 30 bytes
Origen del índice 0. Solicita la entrada de una cadena
Explicación:
fuente
Rojo , 110 bytes
Pruébalo en línea!
Explicación:
Una solución simple y directa, sin componentes incorporados.
fuente
Hojas de cálculo de Google, 123 bytes
La entrada está en la celda
A1
. Google agregará automáticamente)))
al final de la fórmula.Explicación:
Mid(A1,3+8*(Row(A:A)-1),8)
agarra trozos de caracteres 8 a la vez, comenzando con el tercero.Substitute(Mid(~),Left(A1),0)
reemplaza cada instancia del primer carácter con 0.Substitute(Substitute(~),Mid(A1,2,1),1)
reemplaza el segundo personaje con 1.Char(Bin2Dec(Substitute(~)))
convierte el fragmento a decimal y luego a ASCII.IfError(Char(~,""))
corrige todos los errores que resultan del hecho de queRow(A:A)
devuelve muchos más valores que nosotros, por lo que nosBin2Dec
da muchos valores cero yChar
errores en cero.ArrayFormula(Join("",IfError(~)))
une todos losChar
resultados yArrayFormula
es lo que hace que elRow(A:A)
retorno sea una matriz de valores en lugar de solo el primer valor.fuente
Ruby ,
6142 bytes-19 bytes gracias a benj2240
Pruébalo en línea!
fuente
pack
es una elección inspirada, pero en este momento estás recorriendo un largo camino. Puede hacer aún más trabajo por usted.Perl 5
-lp
, 34 bytesPruébalo en línea!
fuente
REXX, 41 bytes
Pruébalo en línea!
fuente
Python 2 , 88 bytes
Pruébalo en línea!
No es el más corto, solo una forma alternativa.
La siguiente versión imprime el resultado en una línea para 98 bytes, aunque las reglas establecen que se permite el espacio en blanco final .:
Pruébalo en línea!
fuente
/\s*/
.C # (compilador de Visual C #) , 158 bytes
Pruébalo en línea!
fuente
Perl 5
-p
, 40 bytesPruébalo en línea!
fuente
Scala , 95 bytes
Pruébalo en línea!
fuente
Haskell ,
12410593 bytesPruébalo en línea!
f
convierte la cadena en una lista de bits comparando cada carácter con el primero, convirtiendo losBool
s en ceros y unos confromEnum
.g
divide esta lista en grupos de 8, los convierte a decimal y toma el valor del número resultante como anEnum
, queChar
es una instancia de.Cambios:
map
en la función)take
compresión con una lista más corta)fuente
toEnum
lugar dechr
y soltar la importación. Tambiénmap
se puede incluir eng
. El espacio entre8 s
se puede eliminar.Adelante (gforth) , 83 bytes
Pruébalo en línea!
La entrada es una cadena estándar de Forth (dirección y longitud) que se imprime en stdout
Explicación
fuente