Sua tarefa é escrever um programa de computador, de modo que, quando ele for cortado em linhas (dividido no caractere de nova linha), todo arranjo das linhas produza um número diferente entre 1 e n! (onde n é o número total de linhas). Nenhum número deve ser emitido por dois arranjos diferentes e todo arranjo deve gerar um número nesse intervalo. Uma vez que existem n! maneiras de organizar as linhas de um programa, isso significa que cada número deve ser gerado por um rearranjo.
Por exemplo, o programa python
print 1;"""
print 2;"""
Tem dois arranjos
print 1;"""
print 2;"""
e
print 2;"""
print 1;"""
As primeiras saídas 1
e as segundas saídas 2
.
Você pode usar os formatos de saída padrão no idioma que está usando. Você não pode assumir nenhum tipo de clichê. Eu acho que esse desafio é mais interessante se você precisar contornar os formatos que o idioma insistir.
Pontuação
Sua pontuação será o número de linhas no seu programa, com uma pontuação maior sendo melhor. Você pode escolher números de 0 a n! -1, se desejar.
fonte
n
? Todos eles estão empatados com score?Respostas:
CJam , pontuação: ∞
Cada linha é da forma
onde
x
é um número de0
paran-1
. O resultado está no intervalo0
den!-1
.Experimente online! (Para
n=3
.)Créditos para jimmy23013 para o código que calcula o índice de permutação real. Substituí apenas o bit que lê a entrada com a
];Lx+:L
qual descarta o resultado da linha anterior e adiciona o índice da linha atual à variávelL
(que é inicialmente uma matriz vazia).fonte
0+:+
) Acho que você pode obter uma versão muito mais curta usando,m!#
.Perl: ∞
Estenda o comprimento que desejar
A memória ficará rapidamente rapidamente, pois o uso da memória é como O (n ^ n). No entanto, seria fácil substituir o indexador de permutação pelo código O (n), apenas por mais tempo. Estou apenas ilustrando a maneira como você pode usar
END{}
esta tarefa em perl. Todos osEND{}
blocos são executados no momento da saída, mas apenas o primeiro chamado (o último no código) produzirá algo devido ao/A/
teste, que só é verdadeiro uma vezObserve que o
$m
contador deve contar como uma cadeia, porque, como número, transbordaria (mais tarde que o fim do universo, mas é o princípio que conta). Pela mesma razão, eu "conto" o número de linhas construindo uma sequência deA
s em vez de usar um contador real, embora esse estouro ocorra ainda mais tarde.Outra maneira de fazer isso em perl:
Isso usa o fato de que in
foo = bar
bar
é executado depoisfoo
. Esta versão, a propósito, não fica louca no tempo e no espaço, mas isso torna o código mais longoAinda outra idéia é usar,
DESTROY
que tem a vantagem de que apenas um deles será executado. Não vou repetir o código de indexação de permutação do qual já dei dois exemplos.Ou usando
BEGIN
:fonte
Jelly , ∞
(Exemplo com
n=3
.)Experimente online!
231311 bytes por linha.Para um programa com
n
linhas, as linhas terão o formato;
<i>
ÇQŒ¿$⁼Q$?
onde
<i>
representa o número literali
e cada linha tem um valor diferente parai
variar de1
atén
. (Nai
verdade, os valores para não precisam ser esses números específicos, apenas precisam ter valores positivos únicos.) Este programa não é mais usadon
na estrutura de linhas.Quão?
0
.;1
anexa1
à0
ou à lista ativa.⁼Q$
é a mônada condicional da instrução if (?
) que verifica se os elementos da lista são exclusivos. Se estiverem, o link acima é chamado (Ç
) e outro número é anexado à lista. Se não forem únicos, significa que aderimos ao primeiro link. O elemento repetido é removido da lista (Q
) e o índice da permutação é encontrado (Œ¿
). Observe que existe um0
no início da lista quandoŒ¿
é obtido, mas isso não afeta a saída, pois os valores parai
são todos positivos.Novo recurso Jelly
Com o recém-adicionado
Ƒ
quick, podemos reduzir⁼Q$
paraQƑ
, economizando um byte.10 bytes / linha (para um dígito)
Experimente online!
fonte
Flacidez Cerebral , 3
Experimente online!
Eu postei isso no chat mais cedo, mas espero que ao postá-lo aqui, as pessoas possam aproveitar disso.
Explicação
Começamos com o programa básico
Isso marca 2 por si só. Para avançar para o próximo nível, quero adicionar uma nova linha. Meu palpite inicial era
Isso define o TOS como
2
se for zero e não fizer nada de outra maneira. Este é realmente um bom começo. Com as outras duas linhas que são capazes de obter todos os números de1
que6
, exceto4
, porque há2
maneiras de saída2
:e
A fim de remediar esta situação fazemos nossa linha também definir
2
-se4
. Isso pode ser feito comPara maior clareza, isso basicamente implementa a função Haskell
Isso corrige o nosso problema, porque um dos programas que estava sendo lançado anteriormente
2
agora sai4
sem nenhuma outra alteração de programa.fonte
Java 7, pontuação: ∞
Experimente online!
Isso pode imprimir 0 a n! -1 . Linhas adicionais têm o seguinte formato (onde INDEX é um número de 1 a n! -1 ):
Esse método funciona lendo sua própria fonte para determinar as classes de ordem listadas nele. Infelizmente, não havia um método mais legal que eu pudesse encontrar analisando o arquivo compilado ou criando um ClassLoader personalizado, graças a como o java faz a compilação JIT. Suponho que cada classe adicional imprima apenas um número definido estaticamente, mas isso parece mais divertido. Isso também faria com que eu pudesse remover a
B
interface, mas a pontuação não é baseada em bytes, então deixarei isso por diversão.Como funciona (alto nível):
Lê seu próprio código fonte linha por linha. Como cada linha declara uma nova classe, usamos a reflexão para criar uma instância da nova classe e invocar seu
a
método que ele precisa, porque implementa aB
interface.fonte
Ruby , pontuação: ∞
Experimente online!
Este programa possui 61 bytes por linha (para n <10). Tem o mesmo formato básico que a solução de dylnan ; o primeiro número em cada linha terá um valor diferente entre
1
en
, e o segundo número em cada linha serán
.Eu esperava encontrar uma maneira de evitar a inclusão
n
no programa, mas não consegui encontrar uma.fonte
Brain-Flak , 2 (com
-d
)Experimente online!
fonte
2
você pode usar({}())
e(({}){})
.05AB1E , pontuação: 1.114.112
Experimente online! Indexado a 0. O ˆ no início de cada linha envia os caracteres distintos para a matriz global. O restante do código é inutilmente executado, exceto na última linha, onde concatena os valores em uma string e, em seguida, encontra seu índice de permutação. 1.114.112 é o número possível de caracteres Unicode no momento da escrita (os pontos de código 48 a 57 são os mais fáceis de demonstrar, é claro).
fonte