Frequentemente, enquanto pratico golfe com código, quero saber qual é o valor ASCII de um determinado caractere. Um dos meus recursos favoritos para pesquisar rapidamente todos os caracteres ASCII imprimíveis é o ASCIItable.com . Isso tem uma imagem muito boa que não apenas mostra os caracteres ASCII imprimíveis e seus valores, mas também os caracteres não imprimíveis e estendidos e os valores em hexadecimal, octal e HTML:
O desafio de hoje é recriar essa tabela ASCII como uma tabela ASCII em vez de uma imagem. Para simplificar, não usaremos caracteres de controle (caracteres abaixo de 32) e apenas mostraremos o valor decimal e o caractere. Em outras palavras, seu desafio é escrever um programa completo ou uma função que imprima ou retorne o seguinte texto:
Dec Chr | Dec Chr | Dec Chr
----------------------------------
32 Space | 64 @ | 96 `
33 ! | 65 A | 97 a
34 " | 66 B | 98 b
35 # | 67 C | 99 c
36 $ | 68 D | 100 d
37 % | 69 E | 101 e
38 & | 70 F | 102 f
39 ' | 71 G | 103 g
40 ( | 72 H | 104 h
41 ) | 73 I | 105 i
42 * | 74 J | 106 j
43 + | 75 K | 107 k
44 , | 76 L | 108 l
45 - | 77 M | 109 m
46 . | 78 N | 110 n
47 / | 79 O | 111 o
48 0 | 80 P | 112 p
49 1 | 81 Q | 113 q
50 2 | 82 R | 114 r
51 3 | 83 S | 115 s
52 4 | 84 T | 116 t
53 5 | 85 U | 117 u
54 6 | 86 V | 118 v
55 7 | 87 W | 119 w
56 8 | 88 X | 120 x
57 9 | 89 Y | 121 y
58 : | 90 Z | 122 z
59 ; | 91 [ | 123 {
60 < | 92 \ | 124 |
61 = | 93 ] | 125 }
62 > | 94 ^ | 126 ~
63 ? | 95 _ | 127 DEL
Espaços à direita em cada linha e uma nova linha à direita são permitidos. Como esse é um desafio à complexidade do kolmogorov , seu envio pode não receber nenhuma entrada ou acessar recursos externos (como um arquivo ou a web), e seu objetivo é compactar o código para gerar o máximo possível de texto.
As brechas padrão se aplicam e a resposta mais curta em bytes vence. Feliz golfe!
fonte
Respostas:
Python 2,
185183175159 bytesEconomizou 8 bytes graças ao FlipTack!
Ainda bastante novo para jogar golfe em Python.
Usa uma compreensão de lista aninhada para gerar o corpo da tabela.
Ungolfed:
Tentativa antiga,
185183175 bytesUngolfed:
fonte
Anterior,
176172 bytesExperimente online!
fonte
Pitão,
89857977 bytesExperimente online!
fonte
JavaScript (ES6),
179173 bytesfonte
`${x='Dec Chr '}| ${x}| ${x}
no final da linha 2 por(x='Dec Chr ')+(' |'+x)*2+`
*
operador. Ou de alguma forma estou entendendo mal sua sugestão?V ,
98, 96, 94 bytesExperimente online!
Apenas mal rangendo em menos de uma centena. Vou ver se consigo vencer Pyth, mas não prometo.
Aqui está um hexdump:
E aqui está como isso funciona:
Aqui é onde fica interessante. Primeiro, deixe-me explicar um truque de vim. No modo de inserção, determinados caracteres são inseridos (todos os caracteres ASCII imprimíveis, a maioria dos caracteres não mapeados acima
0x7f
e alguns outros), mas outros caracteres têm um efeito colateral. Por exemplo,0x1b
(<esc>
) escapará para o modo normal.0x01
(<C-a>
) reinserirá o último texto inserido, etc. Às vezes, queremos inserir esses caracteres literalmente. Portanto, para inserir um caractere de escape literal, você deve digitar<C-v><esc>
. Isso funciona para todos os caracteres que têm um efeito colateral. Então, basicamente,<C-v>
é o equivalente a uma barra invertida em idiomas com literais de string que permitem que você escape de certos caracteres em uma string.O outro truque útil
<C-v>
no modo de inserção é que ele pode ser usado para inserir caracteres por ponto de código , em Unicode Decimal, Hexadecimal, Octal ou Hexadecimal. Como já temos os números que correspondem a determinados valores ASCII, basta colocar um<C-v>
antes desses caracteres e executar o texto correspondente como pressionamentos de tecla vim. Isso pode ser alcançado com um comando regex e um comando "Faça 'x' em todas as linhas". Então nós:Nesse ponto, o buffer fica assim
Agora, precisamos apenas de uma limpeza geral, responsável pela maioria dos bytes nesta resposta
fonte
F #, 222 bytes
Experimente online!
fonte
["ab"; "cd"] |> c |> p
isso, concatena com "|" caracteres e os imprime, como "ab | cd", que é a idéia básica para imprimir a tabela. O resto é bastante direto, evitando espaços em branco sempre que possível.dc , 167 bytes
Experimente online!
Como funciona:
fonte
Perl, 120 bytes
Corra com a
-E
bandeira:-2 bytes graças a @GB .
fonte
C, 179 bytes
Experimente online!
Semi-sem golfe:
fonte
Ruby, 124 bytes
fonte
V ,
151150148136135130129125 bytes12 bytes salvos graças a @ nmjcman101 por usar
<C-v>g<C-a>
os números em vez deline('.')
Economize 2 bytes graças ao @DJMcMayhem por remover linhas com espaços à esquerda usando
ÇÓ/d
e usandodê
para remover espaços extras e reorganizar coisasEsta resposta está em concorrência com a resposta V de @ nmjcman101 (que usa
:set ve=all
).Mas agora, encontrei uma maneira de remover essesA ^[
s e salvei alguns bytes e estamos em um bytecountExperimente online!
Hexdump:
Explicação (incompleta e desatualizada)
A estratégia aqui é que eu estou usando os números de linha para gerar os pontos de código ASCII.
Nota:
^[
é0x1b
,^V
éC-v
Primeiro, geramos todos os caracteres.
O buffer atual se parece com
Agora, inserimos uma nova linha entre esses caracteres
fonte
32 SPACE ... 127 DEL
parte do seu código: Experimente online! Ele usa aquela coisa pura, onde você pode destacar um monte de números, e, em seguida,g^A
faz com que seja uma sequência crescente (novo no Vim 8?):set ve=all
e depois o cursor vai mudar para lugares que não há nenhum texto, permitindo que você inserir os tubos mais fácil e copiar / colar nos lugares que você precisa, sem aspersãoA <esc>
em todos os lugaresg^A
graças, ele me salvou 12 bytes :)V ,
13012099 bytesClube Sub 100. Não estou mais convencido de que
:se ve=all
é a melhor maneira de fazer isso. É um extra ... 11 bytes apenas para escrever os|
's! Mas é isso que eu tenho.Estou postando isso quase em concorrência com a resposta @KritixiLuthos usando
:se ve=all
para evitar algumasA <esc>
. Não estou convencido de que qualquer um dos métodos seja melhor ainda, por isso espero que isso possa inspirar alguns jogadores de golfe em ambas as partes e ver qual método leva o bolo.Eu também estou meio que esperando @DJMcMayhem para chutar nossas calças
Experimente online!
Hexdump para os curiosos (se houver interesse, vou mudar isso para um bloco de caracteres ocultos no estilo vim)
fonte
dd
está implícito se você apenas fazd
. Você também pode fazer o<M-s>
que é sempre equivalente a\s
em regex. Então, você poderia reduzi-lo a:ç^ó*/d
. Mas se você alternar o comando global para o inverso,:g!
poderá procurar todas as linhas que não correspondam a um caractere que não seja um espaço em branco.ÇÓ/d
que é equivalente a:g!/\S/normal dd
AWK , 200 bytes
Formatado:
Experimente online!
fonte
C 188 bytes
Normalmente se parece com isso:
fonte
C (249 bytes)
Novas linhas adicionadas para maior clareza.
fonte
P
beprintf(
, como mostrado aqui: repl.it/JBRDJava,
434422321 bytesProvavelmente, Java não é a melhor linguagem para isso, pois há sobrecarga de classes e método principal ...
Você pode eliminar o método principal usando uma declaração estática, reduzindo ainda mais a contagem de bytes:
mas isso resulta em um erro (após a execução com êxito):
A contagem de bytes int inclui novas linhas ou recuo.
fonte
void main(){
, e nem entrewhile(s.length()<5)
es+=" "
. (A menos que você não tenha contado isso na contagem de bytes). E você pode economizar alguns bytes mudandod="Dec",c="Chr"
parad=p("Dec"),c=p("Chr")
e alterando suas chamadasp(d)
ep(c)
parad
ec
.Tcl , 233 bytes
Experimente online!
fonte
32
por exemplo (a '' em vez deSpace
) e33!
(sem espaço entre33
e!
).R ,
235 228 221212 bytesExperimente online!
Eu tentei muito para obter menos de 200 bytes, mas estes
paste
ecollapse
estão me matando. Retorna uma lista de linhas.fonte
JavaScript (ES6), 258 bytes
fonte
PowerShell , 159 bytes
Experimente online!
As duas primeiras linhas estão apenas criando cadeias literais e deixando-as no pipeline. O primeiro usa o operador de vírgula
,
para criar uma matriz e, em seguida,-join
essa matriz juntos para criar os cabeçalhos. O segundo é apenas uma multiplicação de cordas retas.A terceira linha loop sobre
32..63
e cada iteração envia três valores$_
,($_+32)
e($_+64)
em um loop interno. O loop interno executa umPadRight
valor (adiciona os espaços apropriados para preencher os5
caracteres). Essa é a sequência concatenada+
com o resultado de um pseudo-ternário aninhado( )[ ]
. O pseudo-ternário seleciona achar
representação desse número, ou então,Space
ouDEL
se é o valor apropriado. Mais uma vez, nósPadRight
os caracteres apropriados.Estas três cordas (por exemplo,
32 Space
,64 @
,96 `
) são encapsulados em parênteses e-join
ed com os marcadores de coluna em uma única cadeia. Cada uma dessas 32 strings é deixada no pipeline. No final da execução, um implícitoWrite-Output
insere uma nova linha entre os elementos no pipeline, para obtê-lo gratuitamente.fonte
Perl,
165155 bytesfonte
Python 2,
1564218 bytesMeu primeiro golfe, desculpe por erros óbvios
Experimente online!
Caso você esteja se perguntando, a primeira versão foi uma string codificada em base64.
fonte
ljust(6) for
.x in [
. E IIRC os colchetes dentrojoin
podem ser excluídos.05AB1E ,
8276 bytesExperimente online!
Ainda jogando golfe, isso pode ser melhorado bastante.
žQSDÇƵQ¸«.Bs𔇲”:"DEL"¸«.B)ø
empurra números preenchidos com texto equivalente:vyð2×ý})3äøvy… | ©ý}
junta-os à mesa:®”†… Chr ÿ”3ר¨'-34×.Á.Á»
cuida da parte do cabeçalho da tabela:fonte
PHP,
163 149147 bytesdemolir
O uso
%-N
vale o byte que os números e caracteres à direita salvariam.fonte
Stax , 53 bytes
Execute e depure
fonte
T-SQL, 242 bytes
Formatado:
Tentei algumas variações, incluindo a substituição de várias seqüências comuns por outras variáveis, mas essa foi a versão mais curta que encontrei.
fonte
Python 3 , 154 bytes
Experimente online!
fonte
Anexo , 144 bytes
Experimente online!
fonte