Este é o meu primeiro desafio no ppcg!
Entrada
Uma sequência que consiste em dois caracteres ascii diferentes. Por exemplo
ABAABBAAAAAABBAAABAABBAABA
Desafio
A tarefa é decodificar essa sequência seguindo estas regras:
- Pule os dois primeiros caracteres
- Divida o restante da sequência em grupos de 8 caracteres
- Em cada grupo, substitua cada caractere por
0
se esse caractere for igual ao primeiro caractere da sequência original e por1
outro - Agora cada grupo representa um byte. Converter cada grupo em caractere a partir do código de bytes
- Concatene todos os caracteres
Exemplo
Vamos decodificar a string acima.
AB AABBAAAA AABBAAAB AABBAABA
^^ ^ ^ ^
| | | |
| \---------|---------/
| |
Skip Convert to binary
Observe que esse A
é o primeiro caractere da string original e B
o segundo. Portanto, substitua cada um A
por 0
e cada um B
por 1
. Agora obtemos:
00110000 00110001 00110010
que está [0x30, 0x31, 0x32]
em binário. Esses valores representam caracteres ["0", "1", "2"]
respectivamente, portanto a saída final deve ser 012
.
Pontuação
Isso é, é claro, código-golfe , o que significa tornar seu código o mais curto possível. A pontuação é medida em bytes.
Restrições e formato IO
Aplicam-se regras padrão. Aqui estão algumas regras adicionais:
- Você pode assumir uma entrada válida
- A sequência de entrada consiste em exatamente dois caracteres diferentes
- Os dois primeiros caracteres são diferentes
- O comprimento mínimo da sequência de entrada é de 2 caracteres
- O comprimento sempre dará 2 módulos 8
- Você pode assumir que a string sempre consistirá apenas em caracteres ASCII imprimíveis
- Tanto na entrada quanto na string decodificada
- Os espaços em branco à esquerda e à direita são permitidos na saída (tudo o que corresponde
/\s*/
)
Respostas:
brainfuck ,
76 7165 bytes-6 bytes graças ao Nitrodon!
Experimente online!
Parece estranho bater Python ...
fonte
Stax ,
1511 bytesExecute e depure-o em staxlang.xyz!
Abordagem rápida e suja. Trabalhando para melhorá-lo.Melhorou!Descompactado (13 bytes) e explicação
fonte
JavaScript (Node.js) , 67 bytes
Experimente online!
Quão?
Usamos duas sintaxes diferentes do
Buffer
construtor:Buffer([n])
gera um buffer que contém o único byte n e é coagido ao caractere ASCII correspondente. Apenas os 8 bits menos significativos de n são considerados.Buffer(n)
gera um buffer de n bytes. Portanto,Buffer(0)
gera um buffer vazio, que é coagido a uma cadeia vazia.Nota: Ambos foram descontinuados nas versões recentes do Nó.
Buffer.from([n])
eBuffer.alloc(n)
deve ser usado em seu lugar.Comentado
fonte
bash,
595852 bytesExperimente online!
Agradecimentos ao vacas charlatão por economizar 6 bytes.
Esse desafio funciona muito bem com uma série de coreutils (e
dc
para fazer a conversão e a saída no final). Primeiro, usamostransliterar os dois caracteres na entrada para zeros e uns. O
-t
sinalizador trunca o primeiro argumento para o comprimento do segundo, então isso reduz a transliteração dos dois primeiros caracteres da entrada para0
e1
, que é o que queremos. Então,remove os dois primeiros caracteres e
produz 8 dos caracteres por linha. Por fim, o
sed
comando transforma cada linha em umdc
trecho que lê o número como binário e gera esse byte.fonte
cut -c
pode ser removida)Código de máquina Z80 em um CPC da Amstrad,
32 3130 bytesO código leva a instrução substituir cada caractere
0
se esse caractere for o mesmo que o primeiro caractere da string original e por1
outro literalmente e nunca se incomodará em verificar se um caractere corresponde ao segundo caractere na string de entrada. Apenas verifica o mesmo que o primeiro caractere e o diferente do primeiro caractere.Eu corri para fora de registros (o Z80 tem apenas 7 registros de 8 bits facilmente utilizáveis, instruções a necessidade de descanso mais longos) por isso eu coloquei
&01
emH
, juntamente com o usoL
para construir o caráter ASCII (Eu só percebi que é desnecessário para inicializarL
, salvando um byte ) QuandoH
transborda para o sinalizador Carry, o caractereL
está pronto para a saída. Felizmente, há um 16-bitADC
( Ad d with C arry) que faz o trabalho de uma instrução de turno à esquerda.(DE)
só pode ser lido,A
embora(HL)
possa ser lido em qualquer registrador de 8 bits; portanto, era um compromisso qual deles usar. Eu não poderia comparar(DE)
comC
diretamente, então eu tive que carregar um emA
primeiro lugar. Os rótulos são apenas palavras aleatórias que começam comL
(um requisito do montador).A
o acumulador - o único registro que pode fazer comparaçõesB
o contador de registopara a instrução. Reorganizando o código, consegui fazer o trabalhoDJNZ
: D ecrement (B
) e J ump se N em Z eroDJNZ
com menos um byteC
o primeiro caractere na sequência de entradaD
,E
comoDE
o endereço do caractere de entrada atualH
o gatilho de transporte (a cada 8º loop)L
o caractere de saída que está sendo construídofonte
05AB1E , 10 bytes
Experimente online!
-3 graças a emigna.
fonte
01‡
vez do loop. Edição: ou ainda melhor:¦¦Sk8ôJCçJ
J,
1713 bytes-4 graças a FrownyFrog
Versão antiga:
Explicação:
Exemplos:
fonte
2}.1{=
para salvar 4 bytes.[:
no início :)Python 2 , 77 bytes
Experimente online!
fonte
R , 71 bytes
Experimente online!
Surpreendentemente golfe!
Primeiro, converte a string em pontos de código ascii com
utf8ToInt
, salvando-a comoy
. A remoção dos dois primeiros caracteres com indexação negativa é mais curta que a utilizaçãotail
.A matriz
y[-1:-2]==y[2]
é equivalente aos bits quando%*%
(multiplicação de matrizes) é aplicada, mas primeiro remodelamos essa matriz em ummatrix
comnrow=8
, convertendo de uma matriz linear em agrupamentos de bytes. Felizmente, podemos converter para os pontos de código ascii usando a multiplicação de matrizes com os poderes apropriados de 2 e2^(7:0)
, em seguida, convertemos os pontos de código novamente em uma string comintToUtf8
.fonte
Python 3 , 77 bytes
Experimente online!
fonte
PHP,
7371 bytesExecute como pipe
-nR
ou experimente on-line .golfe:
-6
e pré-incremento em8
strtr
ignora caracteres excessivos no parâmetro mais longosubstr
necessário)10
e depois inverter não precisa de aspas -> -1 byte~
serve como limite da palavra -> -1 byte.fonte
for(;$s=substr($argn,2+8*$i++,8);)echo~chr(bindec(strtr($s,$argn,10)));
Pitão,
209 bytesEconomizou 11 bytes graças a FryAmTheEggman.
Experimente aqui
Explicação
fonte
Ruby ,
8279 bytesExperimente online!
fonte
.join
pode ser substituído por*''
es[0..1]
pors[0,2]
.Japonês, 11 bytes
Tente
Explicação
fonte
s2
atalho, legal.Precisão múltipla PHP + GNU,
6361infelizmente, a extensão GMP não é ativada por padrão (mas é enviada).
Execute assim:
fonte
<?=
economiza 2 bytes e possivelmente o dia. ;-)-R
(tentei).-F
vez dissoHaskell , 75 bytes
Experimente online!
fonte
Java 8,
143142141 bytes-1 byte graças a @ OlivierGrégoire .
Experimente online.
Explicação:
fonte
Python 3 ,
9986 bytesExperimente online!
Graças ao ASCII-only, basicamente, a coisa toda realmente
fonte
APL + WIN, 30 bytes
Origem do índice 0. Solicita a entrada da sequência
Explicação:
fonte
Vermelho , 110 bytes
Experimente online!
Explicação:
Uma solução simples e direta, sem recursos internos.
fonte
Planilhas Google, 123 bytes
A entrada está na célula
A1
. O Google adicionará automaticamente)))
ao final da fórmula.Explicação:
Mid(A1,3+8*(Row(A:A)-1),8)
pega pedaços de caracteres 8 de cada vez, começando com o terceiro.Substitute(Mid(~),Left(A1),0)
substitui cada instância do primeiro caractere por 0.Substitute(Substitute(~),Mid(A1,2,1),1)
substitui o segundo caractere por 1.Char(Bin2Dec(Substitute(~)))
converte o pedaço em decimal e depois em ASCII.IfError(Char(~,""))
corrige todos os erros que resultam do fato deRow(A:A)
retornar muito mais valores do que nós,Bin2Dec
fornecendo muitos valores zero eChar
erros no zero.ArrayFormula(Join("",IfError(~)))
une todos osChar
resultados eArrayFormula
é o que torna oRow(A:A)
retorno uma matriz de valores em vez de apenas o primeiro valor.fonte
Ruby ,
6142 bytes-19 bytes graças a benj2240
Experimente online!
fonte
pack
é uma escolha inspirada, mas, no momento, você está percorrendo um longo caminho. Pode fazer ainda mais trabalho para você.Perl 5
-lp
, 34 bytesExperimente online!
fonte
REXX, 41 bytes
Experimente online!
fonte
Python 2 , 88 bytes
Experimente online!
Não é o mais curto - apenas uma maneira alternativa.
A versão a seguir imprime a saída em uma linha por 98 bytes, embora as regras determinem que espaço em branco à direita é permitido:
Experimente online!
fonte
/\s*/
.C # (compilador Visual C #) , 158 bytes
Experimente online!
fonte
Perl 5
-p
, 40 bytesExperimente online!
fonte
Scala , 95 bytes
Experimente online!
fonte
Haskell ,
12410593 bytesExperimente online!
f
converte a string em uma lista de bits comparando cada caractere com o primeiro, transformandoBool
s em zeros e uns comfromEnum
.g
divide esta lista em grupos de 8, converte-os em decimal e assume o valor do número resultante como umEnum
, queChar
é uma instância de.Alterar:
map
à função)take
fechar com uma lista mais curta)fonte
toEnum
vez dechr
e soltar a importação. Tambémmap
pode ser incluído nog
. O espaço entre eles8 s
pode ser removido.Quarto (gforth) , 83 bytes
Experimente online!
A entrada é uma saída padrão de string (endereço e comprimento) impressa em stdout
Explicação
fonte