Escreva um programa que produza
Do not repeat yourself!
O código do seu programa deve respeitar as seguintes restrições:
- seu comprimento deve ser um número par
- cada caractere que está na posição
2n
(onden
é um número inteiro> 0) deve ser igual ao caractere na posição2n-1
. O segundo caractere do programa é igual ao primeiro, o quarto é igual ao terceiro, etc.
As novas linhas contam como caracteres!
Isso é código-golfe, então o código mais curto vence!
Exemplos
HHeellllooWWoorrlldd
é um programa válido
123
ou AAABBB
ou HHeello
estão incorretos
Verificação
Você pode usar esse script CJam para verificar se seu código-fonte é válido. Simplesmente cole seu código na caixa "Entrada" e execute o script.
DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!
seria uma resposta válida no gatilhoRespostas:
Hexagonia ,
166126124 bytesInserir as no-ops e os espaços em branco implícitos, isso corresponde ao seguinte código-fonte:
Tenho certeza de que é possível reduzir ainda mais isso e talvez até resolvê-lo no comprimento lateral 6, mas está ficando complicado ...
Como funciona
Diagrama gerado com o Hexagony Colorer da Timwi .
O código é completamente linear. A
\
direita no início redireciona o IP para uma diagonal, de modo que não precisamos nos preocupar com os caracteres dobrados. Os caminhos coloridos são executados na ordem laranja / vermelho, azul / cinza, verde, roxo (quando existem dois caminhos da mesma cor, o caminho esquerdo é executado primeiro, antes de contornar o caminho à direita).Se ignorarmos no-ops, espelhos e comandos que são substituídos por outros, o código linear se resume a isso:
As letras no Hexagony apenas definem o valor da borda da memória atual como o código de caracteres da letra.
;
imprime a borda da memória atual como um caractere. Usamos&
para redefinir a borda da memória0
e imprimir um espaço com32;
.}
move-se para uma borda diferente, para que possamos lembrar32
de outros espaços. O restante do código apenas imprime letras na nova borda e, ocasionalmente, se move para frente e para trás';}
para imprimir um espaço. No final, movemos para a borda do espaço novamente com'
, aumente o valor para 33)
e imprima o ponto de exclamação.@
finaliza o programa.fonte
;
, ainda não há absolutamente nenhuma reutilização entre pares de caracteres no código. O código atual é praticamente a primeira coisa que me veio à mente, então, se alguém se esforçou o suficiente, seria possível encontrar uma solução muito mais complicada que reutilize os pontos e vírgulas e talvez até algumas letras, para se ajustar a isso no comprimento lateral 6.;
apenas uma vez porque não pode atravessá-los horizontalmente. Existem apenas 23;
s no seu código e apenas 6 repetições de caracteres (2 × o, 1 × t, 1 × r, 2 × e), resultando em apenas 29. Pessoalmente, isso mais do que me convence de que o tamanho 6 é impossível. .GolfScript,
1308476 bytesExperimente online no Web GolfScript .
Como funciona
O intérprete GolfScript começa colocando uma sequência vazia na pilha.
Concatenar uma matriz com uma cadeia de caracteres nivela, para que o resultado seja a saída desejada.
fonte
Unário , ~ 1,86 × 10222
Brainfuck simples -> resposta unária. Muito abaixo do ideal;).
O programa consiste em um número par de zeros; especificamente:
deles.
Código original do brainfuck:
fonte
1
s no programa Unary que gera a sequência solicitada. O segundo bloco de código é o programa BF que foi usado para produzi-lo. Como o programa Unary é totalmente composto por1
s, satisfaz trivialmente o requisito de repetição.Rubi -
210014281032820670 bytesIsso pressupõe que a saída possa ser um valor de retorno de uma função (não foi especificado que a saída precise ser para STDOUT)
Código:
O truque é criar a sequência a partir de uma sequência vazia
""
usando a operação de acréscimo<<
e os códigos ASCII dos caracteres.Para obter os números dos códigos ASCII, estou tentando decompor o número em valores que posso gerar facilmente. Por exemplo, ASCII
90
é justo88+1+1
, que é:88
está bem por si própria11**00
é11^0
, que é simplesmente1
Felizmente ambos
++
e--
significariaadd
em ruby, para que eu possa escrever90
como88++11**00++11**00
Existem alguns truques para chegar a alguns números mais facilmente do que apenas adicionar 1s. Aqui está o código que estou usando para gerar o acima (que inclui todos os mapeamentos que estou usando):
Ainda estou pensando em outros truques para diminuir os caracteres necessários para chegar a um número.
Observe que se você usar o
-rpp
sinalizador e adicionarpp
ao início do código da seguinte maneira:então, para 2 + 4 bytes extras, isso pode funcionar como um programa completo, mas imprimirá um extra
"
antes e depois da sequência necessária:Exemplo:
fonte
pp
jóia é uma carta de casal ..."
caracteres na saída e 2. A necessidade da-rpp
bandeira (que não é como--rrpp
)> <> , 174 bytes
Felizmente, em certo sentido, a restrição não se aplica verticalmente. No entanto, o maior problema é que precisamos dobrar todas as novas linhas.
O código que é executado aproximadamente é assim:
Observe que o programa não possui espaços duplos - quando no modo string,> <> empurra espaços para células vazias. Por outro lado, isso significa que uma solução usando
g
(ler célula única a partir do código fonte) seria mais complicada, pois quais espaços no programa se tornam NULs quando lidos.(Nota: isso pode ser 50 bytes mais curto se terminar com um erro , mas eu gosto dessa maneira.)
fonte
Sclipting ,
186146 bytesPara ficar claro, existem três linhas de código, a meio da qual está vazia, porque a nova linha precisa ser duplicada. A contagem de bytes é baseada na codificação UTF-16.
Explicação
O bloco de caracteres coreanos no início empurra a string
"DDDof� \"\u0002nf�of�twG \"\u0002rw'efVpw\aefVaf\u0016twG \"\u0002yw�of�uwWrw'sw7efVlf�fff!\"\u0012"
. Você notará que todo terceiro personagem é um personagem que queremos; o resto é sem sentido. Aqui está o porquê:No Sclipting, dois caracteres coreanos codificam três bytes. Assim, cada caractere coreano codifica efetivamente 12 bits. Para começar uma string
D
, os primeiros 8 bits devem ser0x44
; o resto não importa, mas como temos que repetir todos os caracteres, os bits de 12 a 20 também serão0x44
. Assim, teremos um valor do formulário0x44n44n
para alguns n , que se decompõe em três bytes0x44 0xn4 0x4n
.Para o
o
, ou seja0x6F
, obtemos os bytes0x6F 0xn6 0xFn
.Como sou preguiçoso, comecei por codificar
"DDDooo nnnooottt (etc.)"
e depois substitui todos os outros caracteres pelo anterior, e é por isso que recebo0x444444
="DDD"
para oD
e0x6F66F6
="of�"
para oo
. O�
existe porque,0xF6
por si só, é uma codificação UTF-8 inválida.Agora, de volta ao programa. O restante do programa continua da seguinte maneira:
Agora, o que eu quero fazer a seguir é usar
"..."
como uma expressão regular para que eu possa combinar três caracteres da sequência original de cada vez, usando a construção de loop 替 ... 終. No entanto, como todas as instruções são duplicadas, preciso ter dois desses loops de expressão regular aninhados um no outro e, se a pilha estiver abaixo do normal, recebo um erro de tempo de execução. Portanto,e então inicie os loops. Dessa forma, o loop externo itera apenas uma vez porque corresponde à expressão regular
""
na sequência""
, o que gera uma única correspondência. O loop interno é executado uma vez para cada partida"..."
contra a corda grande. O corpo do loop é:O loop interno termina aqui, portanto, toda correspondência da expressão regular é substituída pelo primeiro caractere dessa correspondência. Isso deixa a sequência desejada na pilha.
Em seguida, o loop externo termina, quando a string desejada é retirada da pilha e a única correspondência da
""
string""
é substituída por ela, deixando a string desejada novamente na pilha.fonte
Labirinto , 528 bytes
As novas linhas duplas doem, mas pelo menos isso prova que é factível!
Cada caractere é impresso um por um, primeiro formando o ponto de código e depois imprimindo um único caractere. Os pontos de código são formados por:
Onde
O comportamento incomum dos dígitos do labirinto é explorado
33::00&&
, o que é realmenteCada caractere único é impresso com o mecanismo
A
xx
existir apenas para preencher a grade de modo que é 5 alta. Primeiro,__
pressione dois zeros e, em seguida, atingimos um operador de rotação da gradev
. Nós colocamos um zero e giramos:e de novo:
Em seguida, movemos para a direita
.
na terceira linha, executando o comando de impressão apenas uma vez.fonte
CJam -
176136 bytesObrigado ao Sp3000 por dividir o tamanho do meu programa por dois :-)
Explicação
HH77++
,GG00++
... calculam o código ascii inteiro dos caracteres adicionando números (por exemplo: `HH77 ++ 'empurra 17, 17 e 77 na pilha e, em seguida, adicione esses 3 números)]]{{cc}}//
percorre os códigos ascii e os converte em caracteres.Experimente aqui
fonte
33cc
, mas eu tenho certeza que há maneiras melhores para alguns dos outroscc
em todos os lugares, fazer]]{{cc}}//
no finalBrainf auto-modificador *** , 72 bytes
Observe que
\x00
representa um literalNUL
byte hexadecimal (célula vazia). O código fonte é colocado na fita, à esquerda da célula inicial.Explicação
Além disso, antes de fazer este programa, eu estava criando um usando apenas caracteres BF na fonte. É possível! Também é muito mais longo, já que, para um valor ASCII ímpar, eu criaria o dobro do valor e depois dividiria por dois. Um pouco mais curto seria modificar toda a fonte para gerar valores ímpares para começar.
fonte
DDoo nnoott rreeppeeaatt yyoouurrsseellff!!
(espaços duplos)? Eu vejo dois.
s.Change first '.' to '0'
. Alterei a explicação para mostrar (novamente) que a primeira.
é alterada para zero.Gelatina , 66 bytes (não concorrente)
Experimente online!
Factóide
O programa ainda funciona se você remover cada segundo caractere.
Experimente online!
Como funciona
retorna uma matriz de sequência. O literal começa com a
“
, termina com a”
e as cadeias são delimitadas internamente por“
. O resultado éO argumento do link e o valor de retorno são definidos para essa matriz de seqüências de caracteres; o restante do código-fonte é executado.
fonte
Gammaplex , 66 bytes
Gammaplex é uma linguagem 2D que usa a posição da primeira linha nova como o comprimento da linha e ignora todas as outras linhas novas.
fonte
MSM ,
270160 bytesMeu primeiro programa de HSH!
A saída da string no MSM é feita empurrando os caracteres individuais para a pilha e juntando-os em uma única string via
.
, por exemplo,O número de
.
é um menor que o número de caracteres. PoisDo not repeat yourself!
precisamos de 22.
s. Felizmente, este é um número par, por isso temos 11 duplosColocar as letras na frente exige mais esforço. O padrão
faz o truque para cada personagem
c
. Avalia da seguinte formaPrecisamos de 23 padrões desse tipo começando
!!'',,
e terminando comDD'',,
seguido pelos 22 comandos de junção.
.fonte
Entre 98, 70 66 bytes
Experimente online!
Após a minha resposta inválida, aqui está uma melhor que realmente se encaixa no desafio!
(Agradecemos a Martin Ender por sugerir o uso do
��
caractere 0x17 em vez de88ff++
)Explicação:
fonte
8f+
: tio.run/nexus/...DC ,
348346342306290278 bytesArquivo
dnr6.short.dc
(sem linha nova à direita):Corre:
fonte
BotEngine , 6x49 = 294
fonte
Backhand , 54 bytes
Experimente online!
Como o ponteiro do Backhand já está se movendo a três células por marca, tudo o que precisamos fazer é diminuir esse número para 2 usando
v
fonte
reticular, não-competidor, 62 bytes
Experimente online!
Explicação em partes:
U
define a direção do ponteiro para(2, 0)
, ou seja, mover2
as unidades xe as unidades0
y, para que ele pule todos os outros caracteres, começando com o próximo aU
ser pulado. Então, todos os outros caracteres são gravados e é equivalente a:que é um programa de saída simples.
De outros
Isso está competindo pela recompensa JavaScript do WallyWest:
Eu posso provar que, embora os números possam ser construídos sob essa restrição, as strings não podem. Como nenhum literal pode ser usado, o posicionamento de qualquer caractere de construção literal criaria uma string vazia:
Então, apenas algum operador pode ser usado; os únicos operadores "emparelhados" usados são:
E nada disso pode converter números / outros em strings. Portanto, nenhuma string pode ser emitida.
fonte
Alice , 74 bytes
Experimente online!
Explicação
O primeiro problema é que precisamos ser capazes de inserir a string, portanto, queremos pular apenas o primeiro
"
. Fazemos isso saltando para a primeira,"
porque o IP moverá uma célula antes de olhar para a célula atual novamente, de modo que é a segunda"
que entra no modo de seqüência de caracteres. Mas para poder pular lá, precisamos10, 0
no topo da pilha, nessa ordem (segundo, topo). Isso é feito comaa00tt,,
:Essa função de rotação exibe um argumento. Se esse argumento for negativo, ele empurra o valor no topo da pilha para baixo em muitas posições. Se o argumento for positivo, ele procura o elemento que está em muitas posições abaixo do topo e o puxa para cima. Observe que, no caso de
Rotate(10)
, não há elementos suficientes na pilha, mas há uma quantidade infinita implícita de zeros na parte inferior, e é por isso que um zero acaba no topo.Agora podemos
J
adotar o primeiro"
usando esses dois argumentos. O segundo"
entra no modo de sequência e registra tudo issoDDoo nnoott...
. Quando atinge o/
, o IP é redirecionado para o sudeste e entramos no modo Ordinal. Por enquanto, o IP salta para cima e para baixo nas três linhas (duas das quais estão vazias); portanto, primeiro registra mais três espaços nas linhas dois e três e, em seguida, deixamos o modo de seqüência de caracteres quando atinge o"
. Como estamos no modo Ordinal no momento, todos os caracteres gravados são enviados como uma única sequência para a pilha (mesmo que tenhamos gravado a maioria deles no modo Cardinal), então terminamos com essa sequência (observe os espaços à direita) :Agora, o IP continua subindo e descendo, o que significa que ele executa um comando de qualquer outro par, ou seja,
Y
et
. Em seguida, o IP atingirá o final da grade na segunda linha e começará a saltar para trás na grade. Isso também muda em qual par de caracteres o IP atinge a primeira linha; portanto, ao voltar, ele agora executa;
,o
e@
. Portanto, ignorando todos os espaços e redirecionamentos IP implícitos, o código executado estáYt;o@
no modo Ordinal.O
Y
é o comando "descompactar" que separa uma string nos caracteres em posições alternadas. Como cada caractere é repetido, isso nos dá apenas duas cópias da sequência que queremos, embora a primeira cópia tenha dois espaços à direita e a segunda tenha um espaço à direita.t
divide esse espaço à direita e o;
descarta. Por fim,o
imprime a string e@
finaliza o programa.fonte
05AB1E ,
1005852 bytes-6 bytes graças a Kevin Cruijssen
Experimente online!
Regras de idempotência.
fonte
á
não vetoriza as cadeias internas, caso contrário, poderia ser usado após o))
.. Removendo tudoá
e usandoεεáá}}
o))
trabalho como alternativa, mas infelizmente não salva bytes (talvez você possa encontrar inspiração nisso? ) .. E em„„!!
vez de……!!
funcionar também, já que o!
builtin deixa as cordas da mesma forma, aparentemente. Ah, bem, eu tentei. xD##θθáá
há um tempo, e por algum motivo que não considereiεε}}
... Tentei€€
, o que não funciona muito bem ... Essa é agora a resposta mais curta, obrigado!Stax , 70 bytes
Execute e depure-o em staxlang.xyz!
Felizmente, Stax tem o construído
::
para todos os dias. Tudo o que preciso é pressionar a corda dobrada, pressionar 2 e correr::
. Fácil né?Errado.
Empurrar essa corda é complicado. A primeira citação pode ser dobrada por
..""
, que é um literal de comprimento 2 para."
seguido por uma citação significativa. O problema é que não vejo como terminar a string (o que é necessário, ou a versão dobrada será impressa) sem iniciar uma nova.O final do programa termina os literais de sequência. Se eu puder colocar esse literal duplicado lá, talvez haja uma boa solução alternativa. Para pular para algum lugar do final de um programa, no entanto, é necessário
G}
, portanto, no mínimo, estou olhando para isso:Isso não faz nada.
G
não inicia um bloco, então nenhum deles salta para o segundo}
. Mais uma vez, eu preciso ignorar um personagem:..}}
. A execução salta do primeiroG
para o segundo}
, continua até o fim, volta para o segundoG
e de lá para o segundo}
, e continua mais uma vez até o fim, antes de continuar no início da[deduplicate]
seção com a corda dobrada no topo da pilha.A desduplicação é simples.
11hh
empurrou onze e reduziu pela metade duas vezes, arredondando as duas vezes para baixo e rendendo duas e::
, em seguida, obterá a saída de que precisamos.Oh-oh. Isso não imprime nada. Existem dois problemas aqui: primeiro, isso
..}
significa que a string.}
estará no topo da pilha no final do programa e, segundo, a saída implícita comum do Stax agora está desativada!O pior problema é a saída. Quando um programa Stax termina normalmente sem imprimir nada, a parte superior da pilha é impressa implicitamente. Mas não imprimimos nada ...? Ah, mas nós temos. Literais de sequência não terminados são impressos em vez de enviados por push, e mesmo essas duas sequências vazias (das sem correspondência
"
no final), apesar de vazias, são suficientes para desarmar essa verificação. Qualquer impressão deve ser feita à mão.Precisamos de um
pp
ouPP
, e, neste caso, ignorar o primeiro passo..pp
é inaceitável, pois ele imprimirá a sequência.p
. Isso significa que precisamos da saída desejada sozinhos na pilha ou entre os dois primeiros, juntamente com uma string vazia. Isso é feito pressionando duas cordas vazias (zz
) e girando os três itens principais duas vezes (aa
) antes de imprimir.Feito isso, temos uma pilha com quatro cordas de altura. Um quinto,
.}
é pressionado antes que o programa saia normalmente; neste ponto, a falta de saída implícita se torna uma bênção e uma maldição, pois nada extra será impresso agora!fonte