Muitas linguagens de programação são escritas usando apenas ASCII, guias e novas linhas imprimíveis. Esses 97 caracteres são armazenados em bytes de 8 bits (que são realmente capazes de conter 256 caracteres diferentes!), O que é terrivelmente ineficiente - especialmente no golfe de código, onde cada byte conta! Nesse desafio, você poderá reduzir sua pontuação usando a conversão base.
Desafio
Seu programa / função usa uma seqüência de caracteres ou matriz de caracteres como entrada, que depois interpreta como um número de base 97 . Em seguida, ele converte isso em um número de base 256 e conta o número de símbolos (ou seja, bytes) necessários para representar esse número. Essa contagem será o valor de saída / retorno do seu programa / função.
Um exemplo simples usando base-2 e base-10 (binário e decimal): se a entrada for 10110
, a saída será 2, pois 10110 2 = 22 10 (dois dígitos necessários para representar a saída). Da mesma forma, 1101 2 se torna 13 10 , dando uma saída de 2 também, e 110 2 se torna 6 10 , então a saída seria 1.
A sequência de entrada pode conter todos os 95 caracteres imprimíveis ASCII, bem como a nova linha \n
e a guia literal \t
, que cria um alfabeto de origem de 97 símbolos para sua conversão base. O alfabeto exacta será, assim, (substituindo a \t
e \n
com separador literal real e nova linha; nota o espaço literal seguinte a nova linha) :
\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Observe que a ordem desse alfabeto é importante: por exemplo, a base-97 \t
corresponde ao decimal 0
e !
ao decimal 3
.
Alguns casos de teste: (você não precisa manipular uma string vazia)
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)
Pontuação
Se sua entrada usar apenas ASCII imprimível, nova linha e / ou guia: A pontuação do seu programa será a saída do seu programa, quando for fornecido seu próprio código-fonte como entrada.
Se a sua entrada usar caracteres que não sejam ASCII, nova linha ou guia imprimíveis: A pontuação do seu programa é simplesmente o número de bytes, como no código-golfe .
fonte
Respostas:
Python 2 , pontuação
737271Edit: -1 graças a @ Jonathan Allan
Experimente online!
fonte
/
deve ser OK eu achoor 1
pode ser substituído por|1
nesta instância.Japt , pontuação 19 (23 bytes)
Teste online!
Por coincidência, não acho que isso possa ser praticado, mesmo com caracteres não ASCII ...
Explicação
fonte
Gelatina ,
1817 bytes - pontuação1817-1 byte graças a Erik the Outgolfer (não há necessidade de uma lista de listas para a tradução)
Experimente online!
Quão?
--O melhor que eu tenho apenas com ASCII é uma pontuação de 29 :
- isso também é extremamente ineficiente. Ele converte os ordinais como acima, mas a conversão da base 97 é alcançada repetindo os valores e somando, em vez de usar a multiplicação direta - ou seja, para converter
{".~"}.~
, obtém os índices ajustados e[93,4,16,96,4,95,16,96]
depois inverte (U
) e os repete para fazer[[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]]
e depois soma, converte na base 256 e obtém o comprimento (se não houver memória insuficiente: p).fonte
J , 36 bytes, pontuação = 30
Experimente online!
J usa apenas os caracteres ASCII de 7 bits para suas primitivas.
Explicação
fonte
Gaia , 14 bytes, pontuação 14
Experimente online!
Explicação
Apenas ASCII
Este é o melhor que eu poderia usar apenas ASCII, com uma pontuação de 19:
A dificuldade está na conversão de entrada. A única maneira razoável de converter do sistema base-97 é usar
B
, pois o mapeamento requer o não-ASCII¦
. Além disso, não existe atualmente uma maneira de criar um intervalo de caracteres sem mapearc
um intervalo numérico, que sofre o mesmo problema. A melhor solução que pude ver foi construir₵R
e avaliar a string .fonte
₵R
e₵r
não são fáceis de substituir, embora₸
, obviamente, é), mas pode ser interessante ver como ele se compara.₵
é o código 8373 e também não posso fazer intervalos de caracteres apenas em ASCII, o que é um pouco frustrante, pois a maior parte desse programa é ASCII.c
, mas aplicada a cada personagem,$
apenas mostra todos os números)c
a lista, o que seria #c¦
₵r
é fácil substituir, já que eu poderia usá-lo256
, apenas o usei porque é 1 byte menor e o programa não era apenas ASCII.Python 2 , pontuação 60
Experimente online!
Mapeando para base-97
O valor de um caractere é obtido por
ord(c)-[30,9][c<' ']
: seu código ASCII, menos 9 para tabulações e novas linhas (que precedem' '
lexicograficamente) ou menos 30 para todo o resto.Convertendo para um número
Usamos
reduce
para converter a string em um número. Isso é equivalente à computaçãoComprimento base 256 da computação
O valor de retorno de
bin
é uma string, que se parece com isso:Chame seu comprimento
L
. Um valor com uman
representação binária de -bit possui uma representação deceil(n/8)
-bit base-256. Nós podemos calcularn
comoL-2
; Além disso,ceil(n/8)
pode ser escrito comofloor((n+7)/8)
=n+7>>3
, então nossa resposta éL-2+7>>3
=L+5>>3
.O caso em que a string de entrada tem o valor 0 é tratada corretamente, como
bin
retornos"0b0"
, portanto retornamos3+5>>3
= 1.fonte
c>=' '
, ou então você mapear o espaço para 23 em vez de 2. No golfe código comumc>'\x1f'
(um byte raw) teria me ajudado, mas que não é ASCII imprimíveis ...APL, pontuação 24 (bytes *)
Assume o padrão
⎕IO←1
, caso contrário, basta alterar ¯31 para ¯30.Explicação:
Exemplos:
________________
*: APL pode ser gravado em seu próprio conjunto de caracteres herdado (definido por
⎕AV
) em vez de Unicode; portanto, um programa APL que usa apenas caracteres ASCII e símbolos APL pode ser pontuado como 1 char = 1 byte.fonte
⎕AV
(pelo menos para o Dyalog), como⍸
. Todos os seus símbolos contam como um byte cada. Portanto, nem todo símbolo de APL = 1 byte como você indica na nota de rodapé. (Apenas pensei em informar isso.) Além disso, qual dialeto da APL você está usando?Perl 5 , 76 + 1 (-F) = 77 bytes
Experimente online!
Quão?
Implicitamente, separe os caracteres da entrada (
-F
), armazenando tudo isso em @F. Feche owhile
loop implícito e inicie um novo bloco (}{
) ( Obrigado, @Dom Hastings! ). Para cada personagem, multiplique seu valor por 97 para a potência apropriada. Calcule o número de caracteres localizando o tamanho da soma na base 256 usando logaritmos.fonte
Geléia , pontuação: 18 (bytes)
Experimente online!
fonte
Ruby , 70 bytes, pontuação 58
Experimente online!
fonte
MATL (19 bytes), pontuação 16
Caracteres não imprimíveis (guia, nova linha) na sequência de entrada são inseridos contatenando seus códigos ASCII (
9
,10
) com o restante da sequência.A parte inicial
9=?1}G
é necessária apenas devido a um erro na funçãoZa
(conversão de base), que causa falha quando a entrada consiste apenas em "zeros" (tabs aqui). Isso será corrigido na próxima versão do idioma.Explicação
fonte
Befunge-93,
8379 bytes, pontuação7465Experimente aqui!
O programa primeiro converte a entrada em um número de base 97 e depois conta quantos dígitos são necessários para um número de base 256. Como tal, o número da base 97 é enorme, tão grande que o TIO produzirá um valor máximo de 8 para valores grandes; no entanto, o interpretador JS não se importa e produzirá o valor correto.
fonte