Dada uma matriz de números inteiros positivos A
como entrada, gere um programa que, quando repetido por k
vezes , gera o valor k
th (1-index) da matriz.
Por exemplo, se a matriz for [1,11]
, a saída deve ser um programa que emita 1
e, quando repetido duas vezes, emita 11
. Código como print(end="1");
no Python 3 funciona: print(end="1");
imprime 1 e print(end="1");print(end="1");
imprime 11
A menor soma dos comprimentos de código para resolver todos os casos de teste vence. Seu meta-código deve resolver 500 casos de teste nos anos 60 e cada código da solução deve retornar em 10s. O meta-código e o código da solução não precisam estar no mesmo idioma, mas todas as soluções que seu metaprograma gera devem estar no mesmo idioma.
Os dados e o gerador do pré-teste podem ser vistos aqui . Sete dias depois, a soma do tempo de envio (por exemplo, 12:34 significa 1234) será a semente aleatória e gerará outro caso de teste como o caso final.
A semente final é 7335 em GMT + 8, então os dados finais do teste estão aqui
fonte
print(end="1");
repetido por 2 vezes éprint(end="1");print(end="1");
x
. Em seguida,x
deve fornecer o primeiro elemento da lista,xx
deve fornecer o segundo elemento da lista,xxx
fornecer o terceiro e assim por diante.Respostas:
Python 3 , gera Stax
Isso usa uma variedade de estratégias. A maioria das estratégias se aplica apenas sob certas condições, mas há uma estratégia de fallback sempre utilizável. No final, o menor programa candidato é selecionado.
Experimente online!
Atualização: validação Demorará muito tempo para executar cada multiplicidade de cada programa separadamente. É possível executá-los todos ao mesmo tempo. Para fazer isso, um pequeno pedaço de código deve ser usado. É responsável por algumas coisas.
Faça saída implícita, se houver. Normalmente, no final de um programa stax, a parte superior da pilha é impressa se não houver outra saída. Ao executar vários programas no mesmo arquivo de origem, isso deve ser feito explicitamente.
Limpe as duas pilhas.
Redefinir registros. Para esses programas, apenas o registro x é usado.
Este padrão deve ser aplicado após cada programa individual a ser executado.
Por exemplo, a entrada
[5,2,7,3]
produz o programa stax3527E|X@
. Todas as quatro multiplicidades podem ser testadas ao mesmo tempo.Experimente online!
Dessa forma, é possível testar todas as multiplicidades de todo o programa na mesma execução, assumindo que nada ocorra. Provavelmente seria o maior programa stax já executado se todos os 500 forem concluídos.
fonte
Perl 5
-p
, gera Perl 5-p
, sobrecarga191713-1 graças a @Dom Hastings
A pontuação para uma entrada será
length of the input + 13
. Obviamente, pode ser aprimorado gerando programas auto-descompressivos para entradas maiores, mas não vou me incomodar.Dê à matriz de entrada separada por vírgulas em uma linha em STDIN.
Experimente online!
Execute os
n
tempos concatenados de saída sem entrada (por exemplo, redirecionamento de / dev / null)Exemplo de maneira de executá-lo para entrada
2,6,4,7
e o programa resultante repetido 4 vezes:Experimente online!
Se você não gostar do programa resultante tentando ler do STDIN, use esta versão com sobrecarga 17:
Experimente online!
Exemplo de maneira de executá-lo para entrada
2,6,4,7
e o programa resultante repetido 4 vezes:Experimente online!
Esta versão falha após imprimir a saída necessária
fonte
s/ /,/g;$_="die say+($_)[\$-++],"
:?05AB1E , gera 05AB1E
Experimente online!
O programa gerado para a entrada
[5,17,7,13,2]
é"5 17 7 13 2"#.g<è
.Conjunto de testes para [5,17,7,13,2]
A duração do programa gerado é
len(input) + 5
fonte
len(input)
não é a contagem de números inteiros, mas o comprimento da string que contém todos eles. Eu entendi mal a princípio.APL (Dyalog Unicode)
Prefixo anônimo lambda. Retorna um corpo do programa.
Experimente online!
Métodos
Isso explora vários métodos e retorna o primeiro método utilizável, eventualmente voltando a um método universalmente aplicável.
Elemento único
Se a lista tiver apenas um elemento, ela será retornada como está.
2, 22 etc.
Apenas um dígito pode ser repetido para gerar o número 11 vezes maior,
Tudo o mesmo
Acabamos de retornar o
⊢
número mais à direita ( ).Linear
Seqüências f (n) = k × n apenas inserem um sinal de adição antes do primeiro termo.
Fatorial seguido por todos os 1s
Quando o primeiro número n =! Me os números subsequentes são 1, então
!m
é uma solução porque!m
é n em!m
é 1 e!1
é 1.b ab ab ab
Como todos os números de dois dígitos são maiores que todos os números de um dígito, um número máximo máximo, em que a frente do primeiro número está colada na parte de trás do segundo número, é uma solução.
O código de três linhas
Verifique se alguma fórmula do tipo
+a×b
é válida.Fallback de cadeia
Sequências longas sem números abaixo de 5 (porque 4 é uma quebra de linha) podem ser codificadas como caracteres do SBCS.
Fallback de string deslocada
Se houver números abaixo de 5, aumentamos 9 para evitá-los.
Cair pra trás
Concatenação simples de string
"{⍺←⊃⋄1⌽⍺⊢⍵}"
e a⍕
entrada stringified ( ). Por exemplo,[3,1,4]
retorna o corpo do programa{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
.A peça entre chaves é uma função ambivalente, o que significa que pode ser uma função de prefixo ou uma função de infixo. Assim, a instância mais à esquerda será executada no modo prefixo, e todas as outras no modo infix. A diferença entre os modos é se
⍺
, significando o argumento esquerdo, tem um valor. Caso contrário, será atribuída a função⊃
(primeiro).Explicação do método de fallback
{
…}
Lambda anônima:⍺←⊃
Se não houver argumento à esquerda (⍺
), atribua a função⊃
(primeiro) a⍺
⋄
então:Nesse momento, o código a seguir significa duas coisas diferentes, dependendo se
⍺
é uma lista de números (chamada de infixo) ou a função "primeiro" (chamada de prefixo).Se
⍺
é uma lista de números:⍺⊢⍵
descartar o argumento da esquerda em favor do argumento da direita1⌽
gire esse passo para a esquerdaIf
⍺
é a função "first":⊢⍵
produzir o argumento certo⍺
escolha o primeiro elemento disso1⌽
gire um passo (um no-op em um escalar)Exemplo de execução do método de fallback
3 1 4
O código da execução{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
, atribui a função "primeiro" a⍺
e, portanto, retorna o primeiro elemento;3
.A execução
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
permite que o lambda mais à direita "capture" a esquerda3 1 4
como seu argumento à esquerda, portanto,⍺
tenha um valor que é descartado a favor do3 1 4
qual é então girado um passo à esquerda e produz1 4 3
como resultado. Isso é usado como argumento único para o lambda mais à esquerda, onde⍺
se torna a "primeira" função, fazendo com que o resultado seja o primeiro elemento;1
.A execução
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
permite que o lambda mais à direita "capture" o meio3 1 4
como argumento à esquerda, que é descartado em favor do argumento à direita3 1 4
, que quando girado um passo à esquerda é1 4 3
. Isso é usado como argumento à direita do lambda do meio junto com o3 1 4
argumento mais à esquerda como à esquerda. O argumento da esquerda é descartado para a direita, que girou um passo para a esquerda4 3 1
. Isso então se torna o único argumento do lambda mais à esquerda,⍺
tornando-se a "primeira função", retornando o primeiro elemento;4
.Pontuação
Quando chegar a hora de testar usando dados reais, use este equipamento de teste (vinculado preenchido com dados de pré-teste). Os casos de teste vão no campo Entrada e a Saída será a contagem total de bytes de todos os 500 programas juntos. (Ele também gera um erro, mas é apenas porque, posteriormente, tenta avaliar a Entrada como está.)
fonte
Carvão
Experimente online! Link é a versão detalhada do código. Explicação:
Saída a string literal
⎚§⪪
.Transmitir a matriz de entrada para string, juntar espaços e imprimir.
Saída a string literal
¦ Lυ⊞υω
.Saída de, por exemplo,
5,17,7,13,2
é⎚§⪪5 17 7 13 2¦ Lυ⊞υω
. Experimente online! Explicação:Limpe a tela, para que apenas a última saída fique visível.
Pegue o comprimento da lista predefinida
u
. Use isso para indexar na lista de números inteiros que foram divididos em espaços e gerar o elemento selecionado.Envie uma variável dummy para a lista predefinida
u
, para que a próxima cópia produza o próximo elemento da lista.Comprimento total da saída = (comprimento de todos os números inteiros em todas as listas) + (número de números inteiros em todas as listas) + (número de listas * 9) caracteres (SBCS).
fonte
Haskell , gera Haskell
Experimente online! Para o primeiro testcase,
[5,2,7,3,2,3,15,10,7,2,14,11,16,16,3,3,4,3,8,4]
ele produz o seguinte programa:Tente uma vez , dobrou e caiu . Isso usa a mesma abordagem da minha resposta Haskell para eu dobrar a fonte, você dobrar a saída .
O comprimento de cada programa gerado é o comprimento da lista de entrada como sequência mais 25, portanto, a pontuação para os casos de teste atualmente disponíveis é
12266 + 500 * 25 = 24766
. Isso mostra que a proporção de código para dados é basicamente igual e duvido que seja possível escrever um código de descompressão pequeno o suficiente que diminua a pontuação. Pode ser possível se as listas forem muito maiores.fonte
Python 2 , gera Python 2
Experimente online!
Para a entrada
o programa gerado é
que é 98 bytes.
Adaptado desta solução em "Eu dobro a fonte, você dobra a saída!".
Droga, duas respostas mais curtas apareceram antes de eu terminar de escrever esta resposta.
fonte
k
vezesprint
parasys.stdout.write
remover o "algo" à direita.Java 8, gera Python 2
Experimente online.
Ou seja,
[3,4,5,6,7]
gera este programa Python 2:Experimente online uma vez ; Experimente online duas vezes ; Experimente online três vezes .
O programa Python gerado é baseado na resposta do @ Mr.Xcoder pela terceira vez desafio de .
Explicação:
Código Java 8:
Código Python 2:
fonte
Bash, gera programas em Perl 5
O programa Bash pode ser chamado como
script.sh 1,2,3
.O programa Perl deve ser chamado com a
-E
bandeira.O
perl
código gerado para uma entrada de4,7,8
é:Força bruta. Remove um elemento da matriz (
perl
não importa que a matriz não exista inicialmente), define-o se ainda não estiver definido. Em seguida, ecoa o primeiro elemento da matriz no final. (OEND
bloco é executado por último). Aexec 'true'
sair do programa, de modo que quanto maisEND
blocos não são executados.Exemplo:
fonte
Python 2, gera C ++
Isso não vai bater nenhum recorde, eu estava interessado principalmente em pensar se poderia descobrir como fazê-lo :) Use o fato de que variáveis globais são executadas antes do main e, portanto, pode incrementar uma variável global e, em seguida, usar um #ifdef para garantir que main seja definido apenas uma vez.
fonte
Encantos Rúnicos , gera Rúnico
Experimente online!
Recebe a entrada como uma lista de valores separada por espaço.
Saída realizada uma vez
Saída realizada duas vezes
Saída realizada quatro vezes
Utiliza o comando numérico contínuo do modo de leitura,
´
que foi confirmado em 12 de janeiro e encontrei esta pergunta no dia 14. Este comando permite que valores arbitrários de comprimento possam ser codificados, pois sem esse recurso seria muito difícil fazê-lo (por exemplo1392
, precisaria ser representado como1X3+X9+X2+
, necessitando de um loop adicional no mínimo); precisamente o problema que eu queria resolver quando criei o´
comando.No código original, o
|
nas cordas"{Zs$;|1|l;|y"
e"UwR'10<|I+}"
são substituídos com\n
(que sentar-se na grade e não modificá-lo, como normalmente) comw
comandos rito:74akw
,94/Rakw
,c4akw
, e85akw
. Os personagens originais podem ser literalmente qualquer coisa.|
foi escolhido para ser um espaço reservado simbólico que representava visualmente o que eu queria. Vários bytes salvas (se os unscoring) por não ter que reflexivamente adicionar um ponto de entrada, comowR'10<
escreve umR
em um local onde já existe (posição0,1
), e então começa a encher sua pilha de lixo antes de ficar sem mana, seguindo um looping seqüênciaU"'i34
.O código de saída resultante funciona usando o
w
comando rite para alterar o primeiro caractere na segunda linha para umR
redirecionamento direto (para que apenas um IP execute uma instrução de impressão), com uso inteligente do tamanho da pilha resultante de programas cada vez mais altos para determinar qual índice ler. Todos os outros IP alteram o mesmo local para a mesma instrução e terminam. Tudo o resto não é utilizado.A imagem está desatualizada, mas suficiente para explicação do fluxo.
Cada execução de
1Iy
mantém a capacidade do IP de lidar com uma pilha cada vez maior (causada pelol
comando), cujo tamanho permite ao programa determinar quantas cópias do código-fonte base existem. A final1
é usada para incrementar o número anteriorl
ao número necessário ao girar a pilha (criada a seguir) para chegar ao valor correto. oZ
comando nega esse valor para que a pilha gire na direção correta.A matriz de entrada original é então codificada usando o modo de leitura contínua, com um 0 para evitar a modificação incremental do mesmo valor, para ler as entradas originais. O NOP de espaço é necessário para sair do modo de leitura contínua e permitir que o 0 subseqüente inicie a pilha novamente.
A pontuação deve ser aproximadamente igual
3+v.toString().length
, para cada entrada da matrizv
,+23
para cada matriz. Aproximadamente(2.55*total length of input)
ou33837
para a amostra de entrada, se eu fiz as coisas certas.Pequenas alterações foram introduzidas no meu programa final esperado devido aos efeitos colaterais introduzidos na mesma compilação em relação ao
s
comando, no entanto, resultou em uma melhor pontuação ao mesmo tempo.fonte