Os caracteres ASCII imprimíveis (códigos hexadecimais 20 a 7E) na ordem são:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(Observe que há espaço lá.)
Essa sequência contém claramente todos os caracteres ASCII imprimíveis pelo menos uma vez em ordem crescente quando lidos da esquerda para a direita, mas não em ordem decrescente.
A corda
REVERSED:~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! NORMAL: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
contém todos os caracteres ASCII imprimíveis pelo menos uma vez, em ordem crescente e decrescente. Por outras palavras, quando os caracteres são avaliados com o seu código numérico, as subsequências crescentes e decrescentes mais longas têm o comprimento 95 (o número de caracteres ASCII imprimíveis).
Desafio
Escolha um subconjunto contíguo de N caracteres ASCII imprimíveis, como LMNOP
(N = 5). Escreva um programa usando apenas os caracteres N cuja saída contém todos os 95 caracteres ASCII em ordem crescente e decrescente, como no exemplo acima.
O vencedor é a finalização com o menor N. No caso de empate, o código mais curto em bytes vence.
Notas
- Um subconjunto contíguo significa um conjunto de ASCIIs imprimíveis que aparecem em uma linha ininterrupta, como
LMNOP
ou89:;<=>
. - Seu subconjunto contíguo pode "dar a volta"
~
ao espaço, mas isso gera uma penalidade de +3 em N. Então{|}~
, N = 4, mas{|}~ !
N = 6 + 3 = 9. - Seu programa pode conter apenas N caracteres ASCII imprimíveis do subconjunto contíguo que você selecionou. Nem todos precisam aparecer e podem aparecer várias vezes em qualquer ordem. (Todos os ASCII não imprimíveis e todos os não ASCII não são permitidos. Isso significa que guias e novas linhas não são permitidas.)
- Sua saída pode conter apenas caracteres ASCII imprimíveis e deve ter menos de 10000 caracteres.
- As subsequências crescentes e decrescentes mais longas da saída devem ter comprimento 95 (conforme explicado acima).
- Saída para stdout. Não há entrada.
- N é um número inteiro positivo menor que 96.
fonte
Respostas:
Unário, N = 1
14680262330376163203871465704220787333741951071 bytes
Usa apenas o byte '0' (ASCII 49).
Jogou cerca de 4.13253e + 60 bytes na solução da @ Comintern. Crédito ainda para ele :)
No Brainfuck original:
fonte
Unário , N = 1
4132527913354820031118363262102424570092493175835499123283719 (4.1325279e + 60) bytes
O código fonte no unary é obviamente muito grande para ser postado aqui. Pode ser facilmente reproduzido digitando (ou gerando) um arquivo preenchido com "0" s do mesmo tamanho que o número de bytes acima.
Aqui está a representação binária:
E o código Brainf ** k equivalente (quebras de linha para maior clareza):
Saída:
EDIT: Golfed out 9.097887e + 87 caracteres desnecessários.
fonte
Brainfuck, N = 2
24.383 bytes. Usa apenas - e. (ASCII 45 e 46). Experimente aqui: http://esoteric.sange.fi/brainfuck/impl/interp/i.html . Provavelmente pode ser analisado como código Morse com os espaços corretos.
Requer um intérprete aderente à definição tradicional de Brainfuck, que usa uma matriz de (pelo menos) células de 30.000 bytes , todas inicializadas em zero.
fonte
-
, então a parte descendente.-.-.etc
e a parte ascendente (grupos de 255-
seguidos de a.
) Até onde eu sei, está tudo lá. Veja também editar na minha resposta para explicação.-
apenas uma.
no final :). Minha culpa.CJam - N = 3; 7659 bytes
Experimente em http://cjam.aditsu.net/
fonte
Brainf ** k, N = 4
Meu primeiro programa de foda cerebral. Usa 3 caracteres fora do bloco
+,-.
(Ascii 43 a 46.)410 bytes (um
.
pode ser excluído do programa se o dobro~~
puder ser reduzido para um único~
).Aqui está a lista de comandos nessa área da tabela ASCII (não preciso do comando de entrada):
Felizmente, os comandos restantes
<>[]
(mover o ponteiro de dados e executar saltos condicionais) não são necessários!Divida em 3 linhas para maior clareza: 1: Incremente até que os dados atinjam 32. 2: Saída e incremente até que os dados atinjam 126. 3: Saída e diminua até que os dados atinjam 32.
Saída
Editar N = 2
Pela resposta de @nneonneo, é possível substituir cada um
+
por 255-
sinais para N = 2. algum rearranjo do código e da saída (exibindo para baixo e para cima) significa que a primeira linha pode ser reduzida para 256-126 = 130-
sinais. Isso me ocorreu depois que fui dormir, e noneoneo me venceu. https://codegolf.stackexchange.com/a/35801/15599fonte
~
vez de,~~
pois as subsequências crescente e decrescente ainda estariam lá.C; N = 43 = 40 + 3
Aqui evito caracteres comuns como
+
-
*
/
dígitos0-9
, vírgula,
e ponto e vírgula;
.Então fui forçado a expressar vários números usando apenas as operações
&
%
~
.Pode ser possível jogar mais golfe (encontrar as menores representações para os números 63 e 95 é um exercício para o leitor).
O subconjunto ascii é 32 ... 41 e 97 ... 126.
Não tenho certeza se caracteres de nova linha são permitidos no código; caso contrário, basta removê-los.
fonte
Turbilhão , N = 2, 6486 bytes
Usando apenas 2 caracteres
01
,.Saída:
Eu acho que posso jogar mais com loops, mas codificar com 0 e 1 foi horrível, então não vou fazer isso.
Comentado
Observe que há
O
el
como0
e1
.fonte
Python 2.7 N = 45 = 42 + 3
Isso usa
string.printable
, classifica e cospestdout
. Salvei alguns caracteres inserindo o.
instdout.write
usandoeval
e formatação de string usando osord
valores dos caracteres que eu poderia usar.Fora com o velho - N = 49 = 46 + 3
Infelizmente, embora o python inclua astring.printable
lista, isso não está em ordem ascii e não há como usá-lo sem a*
ou a.
, portanto, são necessários menos caracteres para fazê-lo manualmente.Usando o intervalo de caracteres:
A versão óbvia: N = 63 = 60 + 3
Esta é a versão óbvia usando o intervalo de caracteres:
fonte
len('x')
me salva outros 2 caracteres.import
solução só funcionará se você tiver;
, o que adiciona uma quantidade substancial de caracteres.C; N = 61 = 58 + 3
Para compensar o uso de um subconjunto tão grande, joguei meu código no golfe.
O subconjunto ASCII é 32 ... 59 e 97 ... 126.
Foi um desafio divertido evitar o
=
personagem!fonte
;
. Você pode usá-lo para expandir sua resposta, sem que ela se torne uma cópia da outra.Python 2.7 N = 28 + 12 + 3 = 43
Usando caracteres
cdefghijklmnopqrstuvwxyz{|}~
e depois agrupando para!"#$%&'()*+
Para evitar o uso
,.-
, tive que usar alguns truques. Eu useiexec
para transformar o código em strings, o que me permitiu usarchr(ord('+') + len('xxx'))
para.
echr(ord('+') + len('x'))
para,
. Em qualquer lugar que eu precisasse de -1, usei ~ 0 na forma de~len('')
. Para evitara
, eu useichr(ord('c') + ~len('x'))
(99 - 2).A string que é composta tem N = 48, usando caracteres
abcdefghijklmnopqrstuvwxyz{|}~
e, em seguida, envolvendo!"#$%&'()*+,-.
Observe que as novas linhas e comentários são apenas para facilitar a leitura.
fonte
Rubi - N = 48
Deixe Ruby ser Ruby e adote a penalidade máxima.
N = 48 <- 15 ('' - '.') + 30 ('a' - '~') + 3
ou
Antigo:
N = 72 {pontuação linear} <- 72 ('.'-' u ') + linhas novas inválidas
Há algumas brigas aqui para evitar o 'v' em "reverso". Deixei-o porque gosto do pacote ("C *") hack.
fonte
x86_64 Código da máquina, formato Mach-O
N = 2, 32768 caracteres (muito grande para caber no limite de msg)
Edit: Pastebin está desativado, então você pode encontrar o texto completo em: http://www.ionoclast.com/random/golf.bin.txt
fonte
#include <unistd.h> int main() { char const s[] = "~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#\"! !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; write( 1, s, sizeof s ); }
assembly deve se sair muito melhor.Ruby, N = 27
Usa
$
completamente>
.fonte
Scala, N = 69
Usa os caracteres
01246789\bdefu
(escape unicode) como uma maneira elegante de escrever(' 'to'~')++('~'to' ')map print
.fonte