Esse é um desafio de código-golfe de complexidade restrita , com kolmogorov e complexidade , para produzir uma saída fixa sem entrada.
O formato de saída, no entanto, é flexível - pode ser impresso em padrão, em erro padrão, retornado como uma lista de caracteres, retornado como uma lista de bytes ou retornado como uma lista de números inteiros. Se você acha que algo mais parece razoável, basta perguntar nos comentários!
Aqui está um CODEGOLF de arte ASCII simples e em letras grandes :
CCCC OOO DDDD EEEEE GGG OOO L FFFFF
C O O D D E G O O L F
C O O D D EEE G GG O O L FFF
C O O D D E G G O O L F
CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Sem novas linhas (ou espaços à direita em nenhuma linha), ele tem 256 caracteres:
CCCC OOO DDDD EEEEE GGG OOO L FFFFFC O O D D E G O O L FC O O D D EEE G GG O O L FFFC O O D D E G G O O L F CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Os índices (com base em 0) dos caracteres não espaciais são:
1, 2, 3, 4, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 29, 30, 31, 36, 37, 38, 42, 49, 50, 51, 52, 53, 54, 61, 65, 68, 72, 75, 82, 89, 93, 96, 103, 104, 111, 115, 118, 122, 125, 126, 127, 132, 135, 136, 139, 143, 146, 153, 154, 155, 156, 163, 167, 170, 174, 177, 184, 188, 191, 195, 198, 205, 207, 208, 209, 210, 214, 215, 216, 220, 221, 222, 223, 227, 228, 229, 230, 231, 235, 236, 237, 238, 242, 243, 244, 248, 249, 250, 251, 252, 255
Você não pode usar nenhum desses 97 bytes em seu código, mas deve produzir uma lista (ou saída semelhante) desses bytes, nesta ordem, com os bytes ausentes substituídos pelo 32º byte na página de código que você está usando (em muitos, muitos páginas de código um caractere de espaço).
Você pode incluir as novas linhas de impressão bonita * (mas sem espaços à direita nas linhas), se isso ajudar.
Por exemplo, usando a página de códigos Jelly, esta saída é aceitável:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 12345
6 = A D H K R Y ] ` g
h o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓ
ƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ
ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... mas também é:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 123456 = A D H K R Y ] ` gh o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... e assim é:
[32, 1, 2, 3, 4, 32, 32, 32, 8, 9, 10, 32, 32, 32, 14, 15, 16, 17, 32, 32, 32, 21, 22, 23, 24, 25, 32, 32, 32, 29, 30, 31, 32, 32, 32, 32, 36, 37, 38, 32, 32, 32, 42, 32, 32, 32, 32, 32, 32, 49, 50, 51, 52, 53, 54, 32, 32, 32, 32, 32, 32, 61, 32, 32, 32, 65, 32, 32, 68, 32, 32, 32, 72, 32, 32, 75, 32, 32, 32, 32, 32, 32, 82, 32, 32, 32, 32, 32, 32, 89, 32, 32, 32, 93, 32, 32, 96, 32, 32, 32, 32, 32, 32, 103, 104, 32, 32, 32, 32, 32, 32, 111, 32, 32, 32, 115, 32, 32, 118, 32, 32, 32, 122, 32, 32, 125, 126, 127, 32, 32, 32, 32, 132, 32, 32, 135, 136, 32, 32, 139, 32, 32, 32, 143, 32, 32, 146, 32, 32, 32, 32, 32, 32, 153, 154, 155, 156, 32, 32, 32, 32, 32, 32, 163, 32, 32, 32, 167, 32, 32, 170, 32, 32, 32, 174, 32, 32, 177, 32, 32, 32, 32, 32, 32, 184, 32, 32, 32, 188, 32, 32, 191, 32, 32, 32, 195, 32, 32, 198, 32, 32, 32, 32, 32, 32, 205, 32, 207, 208, 209, 210, 32, 32, 32, 214, 215, 216, 32, 32, 32, 220, 221, 222, 223, 32, 32, 32, 227, 228, 229, 230, 231, 32, 32, 32, 235, 236, 237, 238, 32, 32, 32, 242, 243, 244, 32, 32, 32, 248, 249, 250, 251, 252, 32, 32, 255]
(Este último é uma saída de lista válida em qualquer idioma com qualquer página de código e pode-se também usar qualquer formatação razoável de lista.)
Aqui está o código Python 3 que mostra os bytes ASCII indisponíveis.
* Embora a impressão em si possa não ser tão bonita assim!
fonte
$%&*123456=ADHKRY]``ghosvz}~
e nenhuma nova linha?array_map(function($n){return sprintf("%6b",$n);},...)
sem um$
(eu poderia fazer isso) E sem}
(nenhuma idéia). Sim; Eu quero empacotar os dados!Respostas:
Python 2 ,
321203 bytesExperimente online!
Explicação:
de dentro para fora:
cfjdbljcibkeajjejiljjlcbjddlafklebajjlceljdeadficijflealkeklkljadfbbckjebclk
é o número25731972618407747697792173390589410779249734035626759409848989703511287412985
codificado com caracteres permitidos. (Não123456
é permitido)reduce(lambda x,y:x+repr('abcdefijkl'.find(y)),'cfjdbl..bclkf','')
mapeia a string para sua string decimal:reduce(lambda x,y:x+y,'..','')
é o mesmo que''.join('..')
(nãoo
é permitido)repr('..')
em vez destr('..')
(nãos
é permitido)'abcdefijkl'.find(y)
mapeia um caractere para um dígito.enumerate(bin(int(...)))
converte a sequência numérica em uma sequência binária e enumera. Isso dá aos pares[(0,0), (1,b), (2,1), (3,1), ...]
map(lambda(i,x):(x>'0'and i-8-8-8-8)+8+8+8+8, ... )
converte a lista enumerada no resultado final.map(lambda(i,x):.. , .. )
em vez de[... for(i,x)in ...]
(nãoo]
é permitido)lambda(i,x): ..
converte cada par (índice, valor) no índice ou32
.(x>'0'and i-8-8-8-8)+8+8+8+8
é o mesmo que:x>'0'and i or 8+8+8+8
, (Nãoo
é permitido)[8+8+8+8,i][x>'0']
ou[8<<9-7,i][x>'0']
(não]
é permitido)8+8+8+8
=32
(Não23
é permitido)Isso significa que o programa é essencialmente o mesmo que:
fonte
C (gcc) , 318 bytes
Experimente online!
Este é um pouco de uma jornada ...
1. Comprimindo a lista
De alguma forma, precisaremos verificar se um número inteiro é um dos pontos de código especiais. Qualquer lista 'nua' será muito longa, então usamos uma lista de verificação. Esta lista tem um valor diferente de zero em pontos de código 'restritos' e um valor zero naqueles que não são.
Infelizmente, isso ainda leva 512 bytes apenas para ter a lista (parece
0,0,7,7,0,7,0,...
). Isso pode ser reduzido com uma máscara de bits.Para fazer uso da máscara de bits, dividiremos cada byte em duas partes. Os primeiros 3 bits selecionam uma máscara de uma matriz, enquanto os últimos 5 selecionam um pouco na matriz. Não podemos reduzir ainda mais a matriz porque os números inteiros de 32 bits usados por padrão não suportam mais que 2 ^ 5 = 32 bits.
Usando uma implementação de referência, escrevi:
Eu era capaz de gerar os valores apropriados para essa nova matriz usando o comando
echo "obase=16;ibase=2;$(./a.out | rev)" | bc
. Isso passa a saída do programa acima (./a.out
) para orev
programa, que inverte cada linha. Ele imprime isso junto com um cabeçalho para bc que define a base de saída como 16 e a base de entrada como 2. Assim, bc converte os dígitos binários em uma máscara de bits hexadecimal.A matriz resultante pode ser vista nesta solução 'beta':
2. Lidando com as restrições
Há muitas restrições que precisam ser colocadas no código acima. Aqui eu passo por cada um deles 1 por 1.
Isso também é percebido por outros idiomas; sem a atribuição em C, é muito difícil obter valores garantidos em variáveis. A maneira mais fácil para nós é escrever nossa função como um programa completo. O primeiro argumento de
main
será passado, cujo valorargc
será 1 se chamado sem argumentos.As construções única looping em C são
for
,while
egoto
todas as quais contêm caracteres restritos. Isso nos deixa usando a recursão. A função principal iniciará em 1 e será repetida até que o argumento seja> 256, enquanto isso diminuirá o argumento internamente para usar um valor indexado em 0.Os valores na matriz acima são hexadecimais, mesmo quando convertidos em decimal, eles contêm alguns símbolos restritos, principalmente 123456 (o AD pode ser em minúsculas). Para contornar isso, cada constante é XORed com outra, para que os caracteres restritos sejam removidos. 1 se torna 9 ^ B, 2 se torna C ^ E, 3 se torna B ^ 8, 4 se torna 8 ^ C, 5 se torna 9 ^ C e 6 se torna 9 ^ F (há mais maneiras de fazer isso, eu escolhi esse caminho) .
As restrições não deixam muitas funções de impressão para nós.
putchar
eputs
são ambos restritos, saindoprintf
. Infelizmente, temos que enviarprintf
uma string de formato, idealmente "% c". Todas essas cadeias têm esse sinal de porcentagem traquina que queremos remover. Felizmente, assumimos uma máquina little-endian (porque aparentemente é isso que o TIO usa, e isso é bastante típico). Ao construir o número inteiro cujos bytes na memória são 0x25 (%), 0x63 (c), 0x00 (\ 0), qualquer coisa (não importa, é depois do terminador nulo), podemos apenas passar seu endereçoprintf
e ele assumirá é uma string. Um desses números que funciona é -989830363 (0xC5006325). É fácil criar com as restrições 77707-989908070.Ainda existe o problema de que não podemos fazer referência a nenhum valor (porque não podemos atribuí-los e porque não podemos usar &); portanto, temos que usar uma matriz literal (int []) {...}. Na verdade, usamos isso também para a matriz de máscaras de bits acima.
Não podemos usar ']' ou '}' para fechar nossas matrizes ou funções. Felizmente, C tem dígrafos e trigramas que funcionam.
:>
se tornará]
, enquanto??>
se tornará}
. Isso exige que o gcc aceite o-trigraphs
switch, pois ignora os trigramas por padrão (em violação do padrão).Não podemos usar
&
para mascarar bits do nosso índice, nem podemos%
chegar lá da maneira antiga. Portanto, confiamos no comportamento específico da implementação. Em particular, deslocamos nossos números inteiros de 32 bits o suficiente para a esquerda para perder bits e depois para a direita. Por exemplo, para obter os últimos 5 bits do nosso número, primeiro deslocamos para a esquerda 27 bits (saindoabcde00000...
) e depois voltamos para a direita em 27 bits (saindo...00000abcde
).Precisamos de mais alguns valores literais em todo o código - esses são extraídos da resposta JS de Arnauld, mais 27 (pelo motivo acima) são adicionados por mim como
9+9+9
.3. Juntando
Aqui está a descrição da fonte com todas essas alterações juntas.
fonte
?:
extensão, abuso bit a bit mudança módulo 32, 273 bytes-trigraphs
opção em alguns compiladores C, enquanto?:
requer o gcc que requer-trigraphs
.brainfuck , 635 bytes
Experimente online!
Em resposta a finalmente ser derrotado por Javascript, joguei o que posso com isso:
1 byte economizado por ter 32 na célula 0 e incrementar a célula 1 (a única razão pela qual eu o tinha inicialmente da outra maneira foi por causa de uma solução rápida quando OrjanJohansen apontou que eu não podia usar
]
)1 byte salvo diminuindo uma terceira célula (inicialmente em 0) para gerar
255
=-1
2 bytes salvos imprimindo espaços entre os caracteres 31 e 36 sem usar,
<>
mas simplesmente parando em 32 para imprimir da célula 0 ao aumentar de 31 a 33.brainfuck , 639 bytes
Experimente online!
Primeiro, geramos o número 32. Depois, apenas aumentamos uma célula e alternamos a impressão entre essa célula e a que contém 32. Números cada vez maiores são algo que Brainfuck faz bem.
É bom vencer o Javascript com o Brainfuck, isso não acontece com frequência!
fonte
]
não é um personagem permitido. Embora você ainda possa consertar isso e vencer o Javascript. :)]
não é permitido, acho que minha resposta BF provavelmente está ótima agora.JavaScript (SpiderMonkey) ,
1918159814871431 bytesGuardado 56 bytes graças a @ user202729
Experimente online!
Quão?
O fato de que isso
=
não é permitido é um extermínio em JS. Não podemos fazer nenhuma atribuição de variável e também não podemos usar nenhuma função de seta.+
-
/
|
^
<<
>>
8<<98
8<<2
fonte
32
como8<<9-7
salva um byte para cada um32
.32 = 8<<98
Haskell,
623617614594360342 bytesEdit: -234 bytes graças a @Lynn, encontrando uma codificação padrão como uma string. -18 bytes graças a @ Ørjan Johansen.
Experimente online!
Como funciona
fonte
(id:pure(\_->8+8+8+8))
poruntil((||" XXXX XXX XXXX XXXXX XXX XXX X XXXXXX X X X X X X X X X XX X X X X XXX X XX X X X XXXX X X X X X X X X X X X XXXX XXX XXXX XXXXX XXXX XXX XXXXX X"!!i<'X').(<1))pred 1
e guardar um monte de bytes.filter
vez deuntil
ramificar (ecycle
para evitar um extra++pure(...)
).Brain-Flak -r,
41904188 bytesExperimente online!
Este é um pouco difícil para o Brain-flak, já que não podemos usar
]
ou}
. Significando que os únicos caracteres úteis são<>()
.Aqui está um programa Haskell que me ajudou a escrever isso
Apenas conta pular onde os espaços precisam estar e empurrá-los individualmente.
fonte
{}
uma pesquisa por computador, possamos encontrar o ideal em tempo finito.JavaScript (SpiderMonkey) ,
1001919789441 bytesExperimente online!
Finalmente bate BF !!!
Ideia geral
Converta cada caractere da cadeia longa em seu índice ou 32, dependendo do valor.
Array.prototype.map
? Como obter matrizForça bruta para ver quais objetos são acessíveis acessando as propriedades do objeto (porque
]
não é permitido, apenas as propriedades com nome correspondente a um identificador são acessíveis).RegExp.prototype.exec
retorna um objeto do tipo matriz quando há uma correspondência. Quando nenhum argumento é fornecido, o argumento é padronizado comoundefined
, então/u/.exec()
corresponde e retorna uma matriz.Obtenha 2 valores distintos arbitrários em 2 caracteres diferentes
Queremos ter
(x,y)=>x=='0'?32:y
, mas não podemos usar=
.Em vez disso, vamos fazer
Podemos colocar
map
a string sobre alguma função, mas=>
não é permitido, portanto, apenas algumas funções podem ser usadas. Pode terthis
argumentos vinculados e alguns vinculados (portanto, tem o formato(x,y,z)=>pre_filled_function.call(pre,filled,args,etc,x,y,z)
)Depois de considerar uma lista de funções (
repeat exec bind create map indexOf replace fill find reduce filter findIndex call bind apply
), decido que as seguintes funções serão usadas (depois de considerar todas as outras combinações)repeat
: number -> strings diferentes.find
: thisArg -> primeiro elemento na correspondência de matriz.A ideia geral seria:
onde
somefunction
considera othis
argumento (x
) e o primeiro argumento (elem1
ouelem2
) e retorna se ele corresponde.A última função de seta é reescrita para
[].find.bind([elem1,elem2],somefunction)
.Matriz literal
Podemos usar regex exec para obter uma matriz, e
fill
com valores diferentes. Por exemplo,/()/.exec()
retorna uma matriz de comprimento 2, então podemos preenchê-la conforme necessário.De que
somefunction
precisamos?Precisamos de um que retorne um valor de verdade / falsidade depende
this
(que é uma das 2 funções que retornaremos) e o primeiro argumento (deve ser uma string ou matriz).Para isso, usei
indexOf
- ele retorna valor falso se o primeiro argumento for um prefixo dothis
argumento.Representam os literais da função
fonte
TI-Basic (série 83), 578 bytes
O TI-Basic possui sua própria "página de códigos" muito especial, com opções de design estranhas, como mover o caractere de espaço para 0x29, para que 0x20 possa ser o
randM(
comando.É complicado descobrir como fazer com que o TI-Basic produza o tipo certo de objeto. Strings não funcionariam por várias razões: não há como referenciar um token sem usar o token, e também não temos permissão para o
"
personagem. Não podemos simplesmente escrever uma lista, porque{
e}
são proibidos. Nós somos permitidos os caracteres[
e]
para matrizes, mas uma matriz de 1 por 256 não funciona, pois as matrizes são permitidas no máximo 99 linhas e colunas. Nós não podemos usar→
para atribuir a variáveis, e não podemos chegar às variáveis de listaʟ
ouL₁
atravésL₆
de qualquer maneira.Então, aqui, escrevemos uma fórmula lógica complicada com desigualdades que diz quando um caractere é um dos que queremos exibir. Em seguida, usamos o
seq(
comando para gerar uma lista1
nessas posições e em0
outros lugares. A partir daí, outroseq(
comando e alguma aritmética terminam o trabalho.Essa foi a parte emocionante; o resto é jogar golfe nas constantes e eu provavelmente não fiz isso o máximo possível. Um dos truques que uso é que, por padrão,
Xmax
é 10,XFact
é 4 eΔTbl
é 1.fonte
(
é proibido.[A](I,J)
e, pelo que entendi, você deseja fazer algo como[A](int(I/99),I-99int(I/99))
ler todos os elementos da matriz[A]
- também não podemos fazer isso. (By the way,)
também é proibido Felizmente, não temos para fechar terminando parênteses, mas limita como podemos usar muitos comandos..)Brain-Flak -r, 3894 bytes
Experimente online!
Eu escrevi um programa para gerar o programa Brain-Flak ideal para qualquer saída. Assuma isso:
<>
não é usado, então esta solução é ideal.
fonte
Python 2 ,
162157 bytesAviso : caracteres imprimíveis à frente!
Experimente online!
Com base na resposta existente do TFeld , mas com algumas alterações:
0xe0/7
vez de8+8+8+8
para representar 32. ( um programa para encontrar a menor representação de um número )bytearray
para representar o literal enorme.A
bytearray
é semelhante aostr
que é iterável, no entanto, a iteração fornece números inteiros, não caracteres. Podemos usá-lo para codificar um literal base-N ereduce(lambda x,y: x*N+y, my_bytearray)
decodificá-lo.Como os arquivos Python 2 não têm uma codificação por padrão, apenas caracteres em ASCII (0..127) podem ser usados. Byte nulo, novas linhas, barras invertidas e aspas levam mais 1 byte.
Além disso, não é possível usar todas as bases.
Eu escrevi um programa para encontrar a menor representação de
n
, dadas essas restrições.fonte