Existem 40 maneiras pelas quais um caminho hamiltoniano direcionado pode ser organizado em uma grade 3 × 3:
Este gráfico ( graças ao Sp3000! ) Mostra apenas os 20 caminhos não direcionados. Percorra cada linha colorida nas duas direções para os 40 caminhos direcionados.
Desafio
Usando apenas ASCII imprimível , escreva uma grade 3 x 3 de caracteres, como:
ABC
DEF
GHI
Quando cada um dos 40 caminhos direcionados é lido nesta grade como 40 programas de linha única e 9 caracteres, o objetivo é fazer com que cada programa produza um número inteiro único de 1 a 40. Fazer isso para todos os 40 caminhos parece difícil e improvável, portanto, você só precisa fazê-lo funcionar para o maior número possível de caminhos.
A submissão cujos 40 programas de caminho produzirem os números mais distintos de 1 a 40 será o vencedor. O desempatador vai para a finalização anterior.
Os programas de caminho que erro ou não produzem um número inteiro de 1 a 40 ou produzem um número inteiro que outro programa de caminho já coberto não é contado. Especificamente:
- Os programas que apresentam erros ao compilar, executar ou sair não são contados. Os avisos estão ok.
- Programas que não produzem um número inteiro de 1 a 40 ou produzem algo ligeiramente malformado, como
-35
ou35 36
não são contados. - Programas que requerem entrada do usuário para produzir a saída não são contados.
- Programas que nunca terminam não são contados.
- A partir de agora , os programas que não são determinísticos não são contados.
- Caso contrário, os programas válidos que produzem um número inteiro de 1 a 40 que outro programa válido já produziu não são contados. (O primeiro programa é contado.)
- Somente os programas que geram representações inteiras de números de 1 a 40 (inclusive) são contados no total. Os números são esperados para estar no costume
1
,2
, ...,39
,40
formato, a menos que não é a norma para o seu idioma. (Uma nova linha à direita na saída está correta.) - Quais são os números de saída dos programas e em que ordem eles estão, não importa. Somente o número de números inteiros distintos de programas válidos é importante.
Todos os programas de caminho devem ser executados no mesmo idioma. No entanto, os "programas" podem de fato ser funções (sem argumentos necessários) ou comandos REPL , além de programas completos, que imprimem ou retornam seu número inteiro de destino. Você pode misturar e combinar entre funções, comandos REPL e programas completos.
Seus 9 caracteres ASCII imprimíveis não precisam ser distintos.
Exemplo
Se sua grade 3 × 3 fosse
ABC
DEF
GHI
e seus 40 programas e saídas ficaram assim
ABCFEDGHI -> 26
ABCFIHEDG -> 90
ABCFIHGDE -> 2
ABEDGHIFC -> syntax error
ADEBCFIHG -> prints 40 but then errors
ADGHEBCFI -> 6
ADGHIFCBE -> 6
ADGHIFEBC -> 6
CBADEFIHG -> runtime error
CBADGHEFI -> 3
CBADGHIFE -> 4
CFEBADGHI -> -32
CFIHEBADG -> 38.0
CFIHGDABE -> "36"
EDABCFIHG -> 33
EFCBADGHI -> no output
EHGDABCFI -> compilation error
EHIFCBADG -> 8
GDABCFEHI -> 22
GHEDABCFI -> 41
IHGDEFCBA -> 0
GDEHIFCBA -> '9'
EDGHIFCBA -> +10
CFIHGDEBA -> 11
GHIFCBEDA -> error
IFCBEHGDA -> error
EBCFIHGDA -> prints 23 but then loops infinitely
CBEFIHGDA -> randomly prints either 24 or 44
GHIFEDABC -> error
IFEHGDABC -> 30
EFIHGDABC -> 39
IHGDABEFC -> 7
GDABEHIFC -> 29
EBADGHIFC -> -1
GHIFCBADE -> 26
IHGDABCFE -> 1
IFCBADGHE -> error
GDABCFIHE -> no output
IHEFCBADG -> no output
IFCBADEHG -> "quack"
sua pontuação seria 14, porque existem 14 números inteiros distintos de 1 a 40, válidos 26 2 6 3 4 33 8 22 11 30 39 7 29 1
.
fonte
123654789
Respostas:
PARI / GP - 24
PARI / GP ignora espaços entre dígitos, para que
1 8 2
, por exemplo, seja tratado como182
. O mesmo poderia funcionar para perl, substituindo os espaços por sublinhados. Não esgotei todo o espaço de pesquisa, portanto, pode haver melhores candidatos.Um programa pode ser alimentado para o gp como
gp -q -f program.gp
, ou interativamente, no repl.Saída
Todos os valores, com exceção de 4, estão dentro do intervalo necessário, com 12 entradas duplicadas.
Atualizar
Eu terminei o processamento, existem seis 23s distintos e apenas um 24 (conforme lido pelas linhas):
O programa que eu usei para triturar está abaixo. O PARI / GP possui recursos limitados de processamento de strings; portanto, lide principalmente com matrizes de char (aka
Vecsmall
). Os operadores são testadas+
,-
,*
,\
(div andar),%
,;
(separador de expressão, essencialmente devoluções tudo antes), e(espaço, tal como descrito acima). O operador expoente
^
também pode ser adicionado, mas torna-se muito lento para testar exaustivamente.fonte
Peixe morto , 18
Este foi realmente o primeiro idioma que tentei antes de considerar os operadores de infix. Estou publicando agora pela pura hilaridade da idéia de que Deadfish poderia ser útil para alguma coisa.
Para quem não conhece Deadfish,
i
é incrementado,s
é quadrado eo
é produzido, com o acumulador começando em 0 (também há uma quarta instruçãod
para decremento não usada aqui). O fato de não termos impressão automática e precisamos usaro
é uma grande desvantagem, mas surpreendentemente o Deadfish não é muito ruim aqui, considerando todas as coisas. Acontece que o posicionamento ideal do operador de saída está no meio.fonte
Python REPL e muito mais,
2223Observação principal: Se você colorir a grade como um tabuleiro de damas, o caminho alterna as cores da grade à medida que avança e inicia e termina na mesma cor.
Ainda força bruta para melhor.Tentar com+*%
(e mesmo**
para idiomas onde a^
exponenciação) não resultou em nada melhor, infelizmente. Também tentei usar operadores bit a bit e apenas^
(xor) pareceu ajudar um pouco, mas a pesquisa estava demorando muito, então eu desisti.fonte
6+7*5%6%4
,6+7*4%6%5
e6+8*4%6%5
(esquerda para a direita, de cima para baixo), e nada mais.+
e-
nos cantos / centro? Como são operadores unários e binários, isso ainda deve resultar em todas as expressões válidas. É improvável que isso resulte em uma solução melhor, mas pelo menos expande o espaço de pesquisa. Hmm, na verdade, pode ser um problema, porque você pode acabar com sequências de operadores.J, 15
Isso gera apenas números válidos, mas muitos são duplicados. Os valores únicos são
17 11 16 28 31 23 13 10 21 33 18 24 22 29 27
. Definitivamente, você pode fazer melhor alterando operadores e números inteiros envolvidos.fonte
Yes
.> <>, 36 *
Se você tiver sorte o suficiente!
Como o desafio não exige que o código seja determinístico, precisamos apenas provar que é possível (mesmo que improvável) retornar 36 números e estamos prontos.Foi bom enquanto durou, eu acho.(Para aqueles que não estão familiarizados com> <>, uma ótima introdução pode ser encontrada aqui )
Decidi usar a instrução "x" em> <>, que altera a direção dos ponteiros das instruções para cima, baixo, esquerda ou direita aleatoriamente. Como nosso código será apenas uma linha, isso significa que só podemos olhar para os casos quando ele for para a direita ou para a esquerda, pois se o ponteiro for para cima ou para baixo, ele apenas apertará a instrução "x" novamente.
A instrução "n" exibe o número na parte superior da pilha e o imprime. No entanto, se a pilha estiver vazia e não houver nada para aparecer, um erro será gerado.
A instrução "l" simplesmente empurra o comprimento da pilha para a pilha (e, para nossa sorte, ela não envia um erro se a pilha estiver vazia); portanto, por exemplo, se a pilha estiver vazia e "l" for chamado, ele colocaria 0 na pilha. Se agora chamarmos novamente "l", como a pilha possui um elemento (0), ela enviará 1 para o topo da pilha e agora isso significaria que haveria duas coisas na pilha e isso significaria que se formos chamar "l" novamente, colocaremos 2 na pilha, etc. Assim, podemos usar "l" para inserir um número arbitrário na pilha através do método mostrado anteriormente.
O ";" instrução termina o programa.
A idéia de usar "x" é que, por exemplo, se houver apenas um "x" no código (onde A, B, C, D são algumas instruções):
O programa executaria A, então B e C, e, ao atingir "x", teríamos duas possibilidades: o código continuava indo para a direita e pressionava o ";" e sai ou vai para a esquerda e executa C, em seguida, B, em seguida, A, em seguida, D e só então sai. Portanto, se nosso código contiver um "x", o programa obterá dois fluxos possíveis de programas, dos quais podemos escolher o programa mais adequado.
Se houver dois ou mais "x" es, obteremos um número infinito de possíveis fluxos de programas.
Nosso código possui cinco "x" es, além disso, cada um deles está em uma "célula inicial" dos caminhos hamiltonianos, o que significa que todo programa começará com um "x" e todo programa terá a estrutura:
Onde A, B, C, D pertencem a {; , n, l, l} Isso significa que existem apenas 12 programas exclusivos. Além disso, como sempre começamos com um "x", podemos analisar o caso quando o programa for deixado, portanto, programas simétricos também podem ser considerados iguais. Até simetria, existem apenas 6 programas possíveis diferentes. Apenas 4 deles ocorrem nos programas gerados como caminhos hamiltonianos:
Vejamos o primeiro programa "xnxlxlx; x" se dermos certo no primeiro passo, apertarmos o comando de impressão, o que gerará um erro, pois não temos nada na pilha. Se formos para a esquerda, pressionamos o comando final do programa. Portanto, não podemos produzir nenhum número desses programas.
O segundo programa, "xlxnxlx; x", é muito mais esperançoso, pois, ao irmos para a direita no início, um zero é colocado na pilha; se formos para a esquerda no próximo "x", nossa pilha ganha um, indo para a direita novamente, temos um 2 que podemos imprimir e continuar indo para o final do programa. Podemos observar que, na verdade, podemos imprimir qualquer número par , pois na parte "xlx", no início, podemos atingir um tamanho arbitrário, indo para a direita, para a esquerda e para a direita novamente, um certo número de vezes.
Da mesma forma, pode-se ver que o terceiro programa xnxlx; xlx pode gerar qualquer número ímpar , indo para a esquerda no início e depois repetindo a rotina "xlx" somente desta vez indo para a esquerda, direita e esquerda.
E o quarto programa é essencialmente o mesmo que o segundo programa e pode gerar qualquer número par .
Portanto, para os programas necessários, temos:
São 4 programas que não podem emitir números, 20 que podem gerar qualquer número par, 16 que podem gerar qualquer número ímpar. Como existem exatamente 20 números pares e pelo menos 16 números ímpares no intervalo de 1 a 40, com uma certa probabilidade, existe a possibilidade de haver 36 números diferentes no intervalo de 1 a 40 emitidos por esse bloco de código.
fonte
GolfScript, 8
Atualmente, a solução com maior pontuação. : PFoi legal enquanto durou.Programas
fonte
0)1#2#3(4
15 anos. Simetria bonita também.CJam, 14
Abaixo os programas de trabalho:
Os valores gerados são: [1, 3, 4, 11, 13, 14, 20, 21, 22, 23, 24, 30, 31, 33]
fonte
dc (20)
32 saídas, 20 delas distintas (marcadas com a
$
)2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 16, 20, 22, 24, 25, 32, 34, 40
fonte