Seu desafio é escrever N trechos de código de tal forma que, quando você concatenar o primeiro K ≥ 1 juntos, eles produzem o número K . Quanto maior o N , melhor. Aqui está o problema: você não pode usar nenhum personagem mais de uma vez nos seus snippets.
Regras
- Você pode usar o mesmo caractere várias vezes em um (e apenas um) snippet.
- Esses trechos devem ser concatenados na ordem em que são apresentados , sem pular nenhum.
- Você deve escrever pelo menos dois trechos.
- Todos os snippets devem estar no mesmo idioma.
- Lembre-se: os trechos não precisam ser programas ou funções completos, nem precisam funcionar por conta própria.
-1
é um trecho válido em Java, por exemplo - Todas as concatenações resultantes devem gerar o respectivo valor de K.
- O vencedor é a pessoa com o maior valor de N. O desempatador é o menor comprimento total do programa em bytes.
Exemplo
Suponha que os seus fragmentos foram AD
, xc
, 123
, e ;l
. Então:
AD
deve produzir1
ADxc
deve produzir2
ADxc123
deve produzir3
- e
ADxc123;l
deve produzir4
.
Este programa teria uma pontuação de 4 .
number
code-challenge
source-layout
Conor O'Brien
fonte
fonte
1
e `2`?Respostas:
Python 3 , 1 112 056 trechos, 4 383 854 bytes
Isso é muito semelhante à resposta Python 2 do @ WheatWizard . Comecei a trabalhar nisso um pouco antes de ser publicado, mas a solução das peculiaridades do Python em relação a caracteres não ASCII e longas filas levou algum tempo. Descobri que o Python lê linhas 8191 bytes de cada vez e, quando esses 8191 bytes contêm apenas uma parte de um caractere de vários bytes, o Python lança um SyntaxError .
O primeiro fragmento usa uma codificação de Menos caracteres (distintos) para a Completude de Turing .
Essa monstruosidade simplesmente cria a seguinte string e a executa.
Os seguintes trechos têm exatamente um caractere. Os próximos três personagens são
\n
,\r
e#
. Todos os caracteres Unicode restantes (exceto substitutos) seguem em uma ordem específica, portanto, eles se alinham com o limite de 8191 bytes.O script a seguir gera os programas apropriados para a entrada k entre 1 e 1112056 .
fonte
Perl 5,
50.091151 trechosPrimeiro trecho:
De 2 a 26 trechos:B
atéZ
27 a 46 snippets:
a
az
, excluindo os caracteres em "comprimento"47 a 56 snippets:
0
até9
57.o fragmento:_
Os trechos restantes são os 50.105 caracteres Unicode individuais que Perl considera como caracteres "word", excluindo os 14 caracteres distintos da palavra no snippet inicial, em qualquer ordem.Bem, foi um bom pensamento, mas acontece que, após um certo período, o Perl gera um erro de "identificador muito longo". Este é o programa combinado mais longo que consegui digitar o Perl:
A página de manual do perldiag diz "Versões futuras do Perl provavelmente eliminarão essas limitações arbitrárias", mas o meu Perl 5.18 não o fez.
Explicação:
No modo não estrito, o Perl 5 interpreta seqüências de caracteres de palavras não citadas como "palavras de barra", essencialmente citando-as automaticamente. Eles geralmente são evitados, mas com certeza ajudam aqui!
fonte
a-z
snippets provavelmente usarão caracteres do seu primeiro snippet.length("length(
.Python 2 , pontuação 32
Com trechos subseqüentes
B
,C
,D
, ...Y
,Z
,u
,v
,w
,x
,y
,z
.Em uma reviravolta dramática, o Python 3 suporta identificadores Unicode, o que nos deixaria muito bobo com esse truque - mas não pode
print
sem parênteses. Também poderia inserir dígitos no identificador, mas não acho que essa abordagem seja muito divertida de extrair.Experimente online!
Python 2 , pontuação 18, menos trapaça
Experimente online!
fonte
JavaScript (ES6, V8 6.x),
5250298119526119638119683128781 snippets,88149147575179575631576121612.789 bytesMais abaixo, há um snippet de pilha que gera o programa completo, o avalia e cria um link de download para o arquivo. Esse snippet continuará gerando respostas melhores, pois versões posteriores do Unicode são suportadas por versões mais recentes do JavaScript, que adicionam novos identificadores válidos ao idioma.
Usando apenas ASCII
Explicação
Isso usa a técnica de metaprogramação de
Proxy
para habilitar uma interceptação de manipulador de get no objeto e acessar o nome da propriedade como uma string, retornando o identificadorlength / 2
como seu valor.Com o primeiro trecho iniciando como
new Proxy({},{get:(n,{length:e})=>e>>(e/e)}).nn
, cada trecho adicional adicionado incrementa a cadeialength
de caracteres do identificador,2
certificando-se.repeat()
do respectivo ponto de código duas vezes para caracteres utf-16 de 2 bytes e uma vez para caracteres utf-16 de 4 bytes.Identificadores em JavaScript
Na especificação ECMAScript , um
IdentifierName
é definido com a seguinte gramática:Gerando a resposta
Inicialmente, usando a propriedade Unicode "ID_Continue", escrevi um script Node.js que gera a resposta completa. Agora é apenas um script do lado do cliente que usa um ingênuo
eval()
para testar caracteres válidos, repetindo todos os pontos de código unicode:A execução
stat -f%z answer.js
gera uma contagem de bytes de 612802, mas subtraímos 13 bytes para oconsole.log(
e)
envolto o envio real.Codificação
A fonte é armazenada como utf-8, o que se reflete na enorme contagem de bytes da resposta. Isso é feito porque o Node.js pode executar apenas arquivos de origem codificados em utf-8.
O JavaScript armazena internamente cadeias de caracteres com codificação utf-16, portanto, a string "comprimento do caractere" retornada em JavaScript é na verdade apenas metade do número de bytes da string codificada em utf-16.
fonte
x
vez de$
liberá-lo como um caractere identificador extra?Python 2 , pontuação
610+3 graças a pizzapants184
+1 graças a WheatWizard
Experimente online!
fonte
print int(True)
apenas4/4
, você pode adicionarand 7
para 7, dado que você não tem que imprimir o número, apenas 'produto' it&2
aumentará sua pontuação em um porque&
tem maior precedência do que^
, mas você precisa fazer o número 2 de alguma forma. (Você pode usar[[]==[]][[]<[]]<<[[]==[]][[]<[]]
)ord
foi em conflito comand
, mas eu fixo queTI-Basic (série 83, versão do sistema operacional 1.15 ou superior), pontuação:
17181924(Desempatador: 53 bytes.)
Você pode obter uma pontuação muito grande abusando do comprimento da string, como de costume: comece com (como @Scrooble aponta) e continue adicionando snippets de token único até o final. O TI-Basic possui mais de 700 deles, o que realmente funciona muito bem. Mas aqui está outra abordagem:
length("A
length("length(
Note-se que TI-Basic é separado em tokens, assim que (por exemplo) o
e^(
comando não usar qualquer um dos personagense
,^
,(
.Baseia-se em um recurso não documentado do
sub(
comando: além de encontrar substrings, também pode ser usado para dividir um número por 100.Isso funciona se ele estiver sendo executado em uma calculadora fresco, que nos permite supor que
X
,Y
,Z
são todos zero, que as variáveis da janela são definidas para seus valores padrão, que a calculadora está no modo radiano, e querand
's três primeiras saídas serão sobre0.943
,0.908
,0.146
.fonte
PowerShell , 25 bytes, Pontuação 5
Fragmento 1:
' '.count
saídas1
. Isso é feito usando a.count
sequência, que é uma porque existe apenas uma sequência. Experimente online!Snippet 2:
*2
resultados2
porque pegamos o1
snippet anterior e o multiplicamos por dois Experimente online!Trecho 3:
+!""
saídas3
adicionando o Boolean-not de uma string vazia. Isso lança implicitamente a cadeia vazia para$true
, que é novamente convertida implicitamente para1
, portanto, estamos adicionando uma Experimente online!Trecho 4:
-(-1)
resultados4
, subtraindo simplesmente um negativo Experimente on-line!Trecho 5:
|%{5}
saídas5
, colocando o número anterior em um loop e cada iteração desse loop (apenas um, porque há apenas um número de entrada) saídas5
Experimente online!Agradeço a Jan por um meio alternativo de apresentar
4
e uma maneira astuta de apresentar5
.fonte
' '.count*2+!""-(-1)|%{5}
uma pontuação de 5?$_
dentro|%{ }
. Obrigado!C, 10 trechos, 45 bytes
Experimente online!
fonte
MATL , pontuação
815,64123 bytes11,23ZP
foi idéia dele, junto com a mudança3
comI
a trecho de 7.OO...N&
foi ideia dele.Mais por vir.Eu não sei as funções do MATL de cor, então eu tive que ir e voltar na documentação ... :)Experimente online!
fonte
5Yy
é legal! Eu já usoY
em 3 para obter a segunda nobre :(OOOOOOON&
. Se você adicionar outros, provavelmente esse será o último, por causa de&
yyyyyyyy...
? Eu tive que dobrar o número, 24y
para duplicar 12 vezes ...?d
. Agora estou no celular, mas tenteX#
depurar a impressão da pilhaV , pontuação 10
Experimente online!
fonte
Geléia , 253 bytes, pontuação 250
Snippets subsequentes de 1 caractere:
Nota:
¶
também pode ser substituído por\n
, eles são o mesmo byte na página de código do Jelly.Depois de anexar todos esses trechos, você poderá anexar o trecho de 2 caracteres
”‘
.+1 graças a Dennis .
Experimente online!
fonte
Linguagem , 1 112 064 trechos
O n th fragmento consiste de 2 3n-1 repetições do n th sem carácter substituto Unicode, até e incluindo a 1 112 064 th e último carácter não-substituto do padrão Unicode corrente.
A saída é unária (usando o byte nulo como dígito) para simplificar. O decimal é possível, mas tornará os programas ainda mais longos. Com o unário, podemos testar os primeiros programas.
Para n = 1 , obtemos 4 repetições de U + 0000 . Isso é equivalente ao programa brainfuck
.
, que imprime um byte nulo.Para n = 2 , obtemos 32 repetições de U + 0001 , para um total de 36 caracteres. Isso é equivalente ao programa brainfuck
..
, que imprime dois bytes nulos.Para n = 3 , obtemos 256 repetições de U + 0002 , para um total de 292 caracteres. Isso é equivalente ao programa brainfuck
...
, que imprime três bytes nulos.E assim por diante, até n = 1 112 064 .
fonte
'+'*(48 + d) +'.>'
para cada dígito decimal de n alcançaria a mesma pontuação. É muito mais difícil de descrever.BASIC (ZX Spectrum), pontuação 244 (nova pontuação 247) [isso está enganando?]
Snippet 1:
Snippet 2:
:
Snippet 3:
REM
Snippets 4-244: snippets de um caractere, usando todos os caracteres que não estão nos snippets 1, 2 e 3.
Explicação
Personagens
No Spectrum,
PRINT
é um caractere único (código 245). O trecho de 1 usa 11 caracteres diferentes:2
,3
,5
,6
,+
,-
,*
,(
,)
,PRINT
ePEEK
O que você vê como espaços são uma parte de personagensPRINT
ePEEK
, portanto, o espaço em si não tem sido utilizado. Decidi dar o número da linha 2356 porque esses são os únicos dígitos presentes no código.Os caracteres 13 e 14 não são permitidos. Isso significa que restam 243 caracteres para os trechos 2-244, começando com
:
eREM
para evitar o código que produziria erro ou faria qualquer outra coisa.Como funciona
É por isso que não tenho certeza se essa resposta está no livro.
23635 é o local da memória para a variável de sistema PROG de 16 bits, armazenada como LH. (O valor geralmente é 23755. Mas, além do resultado errado, se esse não for o caso, usar esse número diretamente, mesmo que encurtasse o código, me custaria caracteres de dígito extra.) O valor de PROG é o local da memória onde o próprio programa está armazenado. Os dois primeiros bytes são o número da linha armazenada como HL, os dois bytes a seguir são o comprimento da linha armazenada como LH. É assim que o programa procura o comprimento de sua própria linha, para que algo apropriado precise ser subtraído
Salvando caracteres
Considerando como os números são armazenados, a linha poderia ter terminado com -114, para que o snippet 1 produzisse 1. Mas eu não queria usar dígitos extras, então tirei dois números de 2 dígitos, que então precisavam somar a 122; 56 e 66 foram bem.
O código é um pouco feio com todos os valores de aninhamento e cálculo de PROG (
PEEK 23635+256*PEEK 23636
) duas vezes. Mas se eu o armazenasse e usasse o valor armazenado, isso custaria caracteres / trechos extras - a linha poderia começar comoque usaria 4 caracteres adicionais:
LET
,p
,=
e:
.Talvez eu planeje isso para que todos os números sejam calculados a partir de números que usam apenas 1 dígito e ganham 3 trechos.
EDITAR:
Aqui está o novo trecho 1 (é assim que uma única linha longa é exibida automaticamente no Spectrum, portanto, se você quiser testar o código, isso ajudará você a ver que você o digitou corretamente):
Eu poderia ganhar outro trecho evitando o
+
e apenas me contentar com-
. Eu não vou tentar, isso foi uma provação suficiente.fonte
Klein 011 , 9 trechos
Snippet 1
Experimente online!
Snippet 2
Experimente online!
Snippet 3
Experimente online!
Snippet 4
Experimente online!
Snippet 5
Experimente online!
Snippet 6
Experimente online!
Snippet 7
Experimente online!
Fragmento 8
Experimente online!
Snippet 9
Experimente online!
Explicação
Este foi um desafio muito divertido para Klein. A topologia exclusiva de Klein permite que muitas coisas interessantes sejam feitas. Como você pode notar, as respostas 5 a 9 estão apenas adicionando preenchimento (as letras não fazem nada no Klein, então eu as usei como preenchimento) ao código para esticar a caixa delimitadora. Isso faz com que o ip siga um caminho diferente pelas partes anteriores do código, devido à topologia exclusiva de Klein.
Vou fazer uma explicação completa mais tarde, mas, por enquanto, aqui está uma versão mais fácil de entender do programa, com todas as letras substituídas por
.
s.Experimente online!
fonte
> <> , Pontuação:
Infinito1.112.064-6 = 1.112.058Snippet 1 (6 bytes)
Esse trecho gera a quantidade de caracteres após o; mais um. Isso pode ser estendido para
umaquantidadeinfinitamuito grande de trechos de um caractere cada. Um rápido google me diz que existem 1.112.064 caracteres Unicode possíveis, menos os 6 que eu já usei.Tente Ele online
fonte
R , pontuação: 79
Agradecemos a resposta de Sean Perl pela inspiração; isso abusa de algumas peculiaridades do intérprete R.
Primeiro trecho:
trechos subsequentes são os caracteres em:
Experimente online!
A
scan
função lê dados do arquivo""
com o padrãostdin()
.Os documentos para
stdin()
indicam que:Portanto, os dados subsequentes se tornam o arquivo. Isso pode ser expandido trivialmente e pode funcionar com várias codificações diferentes.
fonte
Pyke , 256 bytes, pontuação 254
Observe que esses são códigos hexadecimais dos bytes reais, separados por espaços, pois o byte nulo (
\x00
) está incluído.Snippet inicial:
Snippets subsequentes de 1 caractere:
Experimente aqui!
fonte
Fragmentos Java 8, 7 (19 bytes)
Apenas um começo, continuará trabalhando nisso.
Experimente aqui.
Explicação:
Talvez a precedência de execução fique mais clara quando adiciono parênteses:
a*b
: Multipliquea
comb
~a
:-a-1
a>b?x:y
:if(a>b){ x }else{ y }
a|b
: OR bit a bita
comb
a^b
: Bitwise-XORa
comb
a%b
:a
modulo-b
fonte
Python 2 , 110 trechos
Aqui está o trecho completo:
Experimente online!
O primeiro trecho é
E, em seguida, os próximos 109 trechos são os próximos 109 bytes.
Isso é bastante "barato", como Lynn coloca. O primeiro trecho abre o arquivo e subtrai 44 do seu comprimento, depois o outro trecho adiciona 1 ao comprimento do arquivo sem alterar a lógica do programa como um todo. aumentando assim o resultado da saída em 1.
fonte
dc , pontuação 13, 58 bytes
Experimente online! (Observe que a versão TIO adiciona um
f
após cada trecho para imprimir a pilha inteira, mostrando que cada trecho apenas deixa um único valor na pilha; também esqueci o espaço à esquerda no último trecho, que não importa funcionalmente quando estão separados por quebras de linha, mas contam para o uso do meu personagem)Cada concatenação de trecho adicional deixa o valor desejado e apenas o valor desejado na pilha. Depois de completar 12 anos, eu meio que fiquei sem maneiras de comer a pilha. Tentei usar as operações matemáticas desde o início, pois elas devoram a pilha e, à medida que aumentamos o número, fica mais difícil gerenciar dessa maneira. Quando tudo está dito e feito, eu tenho apenas o dígito 0 para jogar e muito pouco na maneira de empilhar, então acho que 13 está bem próximo do máximo. Tenho certeza de que existem muitas maneiras semelhantes (e provavelmente mais curtas) de realizar isso no dc, isso meio que se encaixou. Observe que o cygwin manipula o AF misturado com 0-9 de maneira diferente da maioria das versões do dc,
44C4r/CC 4//
funciona para o snippet final no cygwin.fonte
Pyth , 124 trechos
Experimente online!
Os caracteres não imprimíveis foram escapados usando três caracteres imprimíveis (
x..
). O primeiro trecho tem três bytes, e cada trecho depois disso aumenta em um por um.fonte
Beatnik , 22 bytes, pontuação 20
Supondo que a palavra "snippet" permita que você coloque o valor na pilha.
fonte
Octave, Score 86
Seguido por:
Isso explora o fato de o Octave tratar tudo depois de um nome de função como uma entrada de string. Então,
nnz n
retorna o número de elementos diferentes de zero na string'n'
. Chegamos a 86 adicionando outros caracteres ASCII imprimíveis.',"%#
não funcionafonte
APL (Dyalog) , pontuação 12
+1 pontuação graças a @dzaima
Primeiro ao terceiro trechos:
Então cada um
234567890
.Experimente online!
fonte
Julia 0.6, 111217
O script a seguir cria o programa completo:
Explicação
A macro
seguido por todos os caracteres unicode distintos permitidos nos identificadores, calculados com
isidentifier
. Algumas marcas diacríticas atrapalham a contagem, então eu as removi.fonte
TeX, pontuação 61 (possivelmente 190)
Primeiro trecho:
Outros 60 trechos: em qualquer ordem, cada um contendo um caractere
Explicação:,
\len
que é chamada no final, converte uma sequência de controle em uma sequência, cada caractere (incluindo\
) é um símbolo de caractere dessa sequência; depois\glen
devora o token\
e\tlen
conta os tokens restantes. Portanto, ele gera o comprimento dessa sequência de controle (não incluindo\
).Os caracteres de outros trechos estendem a sequência de controle que é inicialmente apenas
\t
. Uma sequência de controle com vários caracteres deve ser composta apenas por letras, mas todas elas contam como letras porque foram atribuídas ao código de categoria 11 (usando códigos ASCII para que os caracteres em si não apareçam no primeiro trecho).Decidi usar códigos octais para alguns caracteres que me custaram um símbolo,
'
mas me salvaram dois dígitos, 8 e 9, por isso ganhei um trecho. Possivelmente poderia ter ganho mais alguns se eu não precisasse\expandafter
.Saída
Possível alteração: envolva
\number\count1
para\message{}
que a saída não entre na.dvi
saída, mas para console e.log
. Não custa nenhuma letra extra.190
Infelizmente, o TeX funciona com ASCII e não com Unicode (ou funciona agora?), Mas minha solução pode ser estendida para incluir mais 129 trechos de caractere único contendo os caracteres com os códigos 127-255. Talvez até alguns caracteres antes de 32. O caractere 32 (espaço) não funcionou, caso contrário, eu o colocaria em um trecho também - não precisava dele no primeiro trecho. Obviamente, cada um desses caracteres adicionais teria que ser
\catcode
d em uma letra no primeiro trecho.fonte
Pip, 57 bytes, pontuação = 16
Observe que
<tab>
representa um caractere de tabulação literal (ASCII 9). Experimente online!Cada trecho é um programa completo que gera o número desejado. A maioria deles trabalha com o princípio de que a última expressão em um programa Pip é impressa automaticamente: por exemplo, no trecho 5, o código anterior é avaliado, mas a única parte que importa é a
5
. Exceções a isso são:RT9
(raiz quadrada de 9), mas, após o fragmento 2, ele analisa como2RT9
(segunda raiz de 9) - o que, é claro, é a mesma coisa.y
variável. O fragmento 8 então gera o valor dey
.o
(pré-inicializado como 1). O trecho 13 pega esse resultado e subtraiv
(pré-inicializado para -1).1
sem uma nova linha (Ok=k
, onde ék=k
avaliada como o valor de verdade padrão de 1) e, em seguida, imprime automaticamente6
.Outras coisas interessantes:
14
do valor de pi."F"
de hexadecimal.fonte
Zsh , pontuação> 50 000 (1 112 046?), 16 + Σ (comprimento do ponto de código UTF-8) bytes
O Zsh lida com codificações multibyte por padrão. O snippet base possui 18 caracteres únicos, 34 no total. Qualquer outro ponto de código (exceto o byte nulo) pode ser adicionado a ele. Enquanto escrevo isso, meu script testando isso está no codepoint ~ 50.000, tamanho total do arquivo 150K, com cerca de 30 trechos / segundo. Execute meu script de teste completo aqui. Você pode ajustá-lo para iniciar em alguns pontos de código posteriores.
Experimente os primeiros 2000 snippets online!
São possíveis mais trechos usando esta técnica .
fonte