Escolha uma citação ou frase com exatamente 5 palavras, como Programming puzzles and code golf!
.
Escreva um programa que, quando anexado a si mesmo n vezes, produz as primeiras n + 1 palavras da sua frase em ordem.
Por exemplo, se o código do seu programa era MYPROG
e sua frase era Programming puzzles and code golf!
, executando ...
MYPROG
deve produzirProgramming
MYPROGMYPROG
deve produzirProgramming puzzles
MYPROGMYPROGMYPROG
deve produzirProgramming puzzles and
MYPROGMYPROGMYPROGMYPROG
deve produzirProgramming puzzles and code
MYPROGMYPROGMYPROGMYPROGMYPROG
deve produzirProgramming puzzles and code golf!
Anexar mais de 4 vezes é indefinido, seu programa pode fazer qualquer coisa.
Regras
- Sua frase deve ter um inglês gramatical significativo. Idealmente, deve ser adequadamente capitalizado e pontuado.
- Sua frase pode ter qualquer tamanho, mas sua entropia, calculada por http://www.shannonentropy.netmark.pl/ , não pode ser inferior a 3,5 .
(Cole sua frase, pressione Calcular e procure o último H (X) .) - Sua frase pode conter apenas caracteres ASCII imprimíveis (hex 20 a 7E). Seu código pode conter apenas ASCII imprimível, guias e novas linhas.
- Sua frase deve conter exatamente 5 palavras exclusivas e 4 espaços. Todos os não-espaços contam como partes das palavras. Espaços são os limites das palavras. Eles podem não estar à frente ou à direita; Afinal, deve haver uma, exceto a última palavra.
- A saída também deve conter um espaço entre as palavras. A saída em cada etapa anexa pode conter espaços finais, mas não espaços iniciais.
- Saída para stdout. Não há entrada.
Pontuação
Sua pontuação é o comprimento em bytes do seu programa não anexado inicial. (por exemplo, MYPROG
pontuação 6)
Como se trata de código-golfe, a pontuação mais baixa vence.
code-golf
source-layout
Passatempos de Calvin
fonte
fonte
Respostas:
CJam - 24
Experimente em http://cjam.aditsu.net/
Explicação:
Lm
remove as letras contidas em L (inicialmente "") de "TheguywasnotI"3<
pega as 3 primeiras letras]
coleta o conteúdo da pilha em uma matrizS*
junta-se à matriz usando espaço como um separador:L
atribui a string resultante a L (também a deixa na pilha )Versão antiga (28 bytes):
Explicação:
S/
divide porW):W
incrementos de espaço W (inicialmente W = -1)=
obtém a W'th word]
coleta o conteúdo da pilha em uma matrizS*
se junta à matriz usando o espaço como separadorfonte
Piet (resposta honorária)
Serpentes serpente seu caminho para baixo, correndo pela direita através do azul e entrando novamente pelo verde. Imprime "A fruta voa como uma banana".
Eu usei o PietCreator para fazer isso, mas você pode experimentá-lo aqui . Remanejar os programas Piet é uma dor, então comecei em 35x35 e continuei dessa maneira, o que significa que usei muito mais codels do que precisava.
Versões de tamanho real
fonte
> <> (42)
Os peixes são realmente o melhor animal de estimação. Algumas pessoas mantêm bugs como animais de estimação devido a uma incompreensível falta de lógica. Este programa faz o possível para argumentar com essas pessoas.
Observe que não há nova linha final no programa. A saída completa é revertida na primeira linha; a frase completa é "O que qualquer bug pode fazer?" (entropia 3,58418).
Explicação completa:
Este é um dos programas mais divertidos que já escrevi, pois esse é o primeiro a usar a reflexão. A primeira linha é onde está a carne do programa.
!v
é um no-op, pois!
faz com que a próxima instrução seja pulada.'?od gub yna nac tahW;'
armazena a frase completa na pilha (é retrocedida porque cada letra é empurrada para a pilha na ordem em que foi escrita; portanto, ela deve ser revertida para ser reproduzida corretamente).00p
é onde a mágica real começa a acontecer. Observe que não apenas armazenou a frase, mas também armazenou a;
.00p
insere o caractere superior na pilha no programa na posição (0, 0), então agora o primeiro caractere do programa é a;
.A finalização
!
ignora esse ponto-e-vírgula e move o cursor parav
, o que direciona o fluxo do programa para baixo.A partir daqui, tudo é apenas rotinas de impressão. Como não há nova linha final, anexos sucessivos do programa simplesmente adicionam as duas últimas linhas, com efeito, uma vez que a primeira linha estará à direita de
voo <
e, portanto, nunca será executada.No final, o cursor é direcionado para o canto inferior esquerdo do programa e volta para o canto superior esquerdo, onde
;
foi inserido anteriormente, encerrando o programa.fonte
"It is by a rope."
Sua frase repete caracteres, para que ela tenha entropia mais baixa do que poderia.Python 66
Entropia: 3.61635
Ouput:
Obrigado @JasonS e @grc pelas dicas sobre como reduzir a parte de detecção de variáveis.
Atualização: Veja a resposta de JasonS para um truque envolvente que levou isso a 55 bytes. :)
fonte
i=locals().get('i',-1)+1;
é -5 bytesi='i'in dir()and i+1
. Editar: regras alteradas.i='i'in dir()and i+1;print"Tfpcfhaialetgny"[i::5]+" ."[i>3],
Python 3, 55 (bônus 67)
Você quer dizer que envolve?
OK, alguma explicação sobre o # 2 (spoilers)
credits
é um python embutido que contém o texto que eu gostaria de usar. É de um tipo especial, com um formato formatado,repr
para que você possa digitá-lo no interpretador interativo e ver uma saída agradável, então eu precisostr()
disso. Passei um bom tempo analisando os componentes internos para isso e "Obrigado por apoiar o desenvolvimento do Python" como uma frase era boa demais para deixar passar.Como há muito texto e quero apenas minhas 5 palavras, desejo armazenar as posições inicial e final de cada substring. Isso está nos bytes no começo.
bytes
objetos em python3 agem como matrizes de números inteiros quando você usa operações de sequência neles.Mas o código pode conter apenas caracteres imprimíveis, então tive que encontrar um deslocamento (49) que tornasse todos os meus valores de posição imprimíveis como caracteres.
"Obrigado" está próximo do início da sequência, enquanto as outras palavras estão mais próximas do final, o que significa que meus valores de posição estavam muito distantes para que todos estivessem no intervalo imprimível. Multiplicar a string por 2 faz outra cópia de "Obrigado" que está mais próxima das outras palavras.
Tomar a
[49:]
fatia da cadeia de caracteres é um byte de origem a menos do que adicionar 49 a a e b.O construto usado nas três respostas é
x=<value>;dostuff and increment;x
. O finalx
não faz nada, mas quando combinado com a próxima cópia do código, ele se transforma noxx=<value>
que impede que ox
contador seja substituído.a,b,*q=q
é perfeitamente normal descompactar sequência Python 3.fonte
Python 2 (37)
Depois que Sarah se tornou presidente de seu capítulo local na Mensa, ela se tornou um foco de atenção romântica de homens que procuravam um parceiro inteligente. Em todos os encontros, Sarah tentava fazer uma conexão pessoal, mas os homens apenas a investigavam sobre questões filosóficas abstrusas. Frustrada por ninguém se importar com seu lado emocional, ela exclamou ...
Saída:
A entropia é
H(x)=3.5
exatamente.Os meus agradecimentos a Jason S., cuja resposta eu basicamente usei no atacado. O
ii
truque envolvente é maravilhoso.fonte
print
espaços prepends em vez de acrescentar-lhesC - 65
Comentar abuso :)
Por esse motivo, as novas linhas são importantes e o código deve ser anexado da seguinte maneira:
fonte
CJam, 24 bytes
Se executado cinco vezes, a impressão de que Liz estava bem para mim . Pontuação não incluída, desculpe.
Como funciona
fonte
Pyth , 32
Frase: "É por uma corda".
Entropia: 3,5
Como funciona:
p
significa imprimir com separador especificado.O primeiro argumento
?kqZ4d
,, fornece o separador.?kqZ4d
meiosk if Z==4 else d
.k
é''
, enquantod
é' '
.O segundo argumento, o valor a ser impresso, é gerado dividindo (
P
) no espaço (d
) e a indexação nessa lista (@
) emZ
.Por fim,
Z
inicializado automaticamente como 0, é incrementado por 1 (~Z1
).fonte
Golfscript, 53
Este foi divertido.
Frase: "Você não é um pato". (o que é completamente verdadeiro; entropia 3.5110854081804286)
Explicação:
A pilha começará como
''
na primeira "execução" (já que nenhum STDIN é fornecido).'1'
s são anexados a isso para indicar quantas vezes o código foi colado.Agora, o que acontece na segunda execução:
E assim por diante.
"Mas", você está pensando, "como você consegue que os 1s não saiam?" Ah, essa é a parte divertida de hacky. O Golfscript implementa
puts
(que é chamado quando o programa termina) assim:Eu simplesmente mudei para
Para que os
1
s sejam suprimidos da saída final.fonte
J - 42 char
Eu poderia usar uma frase mais curta, mas por quê? Não seria o meu favorito.
Isso funciona devido à dualidade da mônada / díade de J: todo verbo pode ser invocado como mônada - com um argumento à direita - ou como díade - com um argumento à esquerda e outro à direita.
Considere a seguinte sessão com o J REPL:
Lá,
,
é tratado como díade, porque está entre dois argumentos e(#~1=6|#\)&.;:
é uma mônada, porque não tem argumento à esquerda. Portanto, se tivéssemos um verbo que pudesse agir como,
diádico e(#~1=6|#\)&.;:
monádico, estaríamos definidos.Como você já deve ter adivinhado, essa conjunção existe e parece
:
. Monádicof :g
é equivalente af
, e é equivalente ag
quando diádico. Isso resolve o problema.Exemplos, que você pode tentar em tryj.tk :
E sim, a natureza do inverso de
;:
faz com que não haja espaços à direita.Usando
It is by a rope.
como a frase dá 35 Char:(#~1=6|#\)&.;: :,'It is by a rope.'
. Não precisamos do espaço à direita, como precisamos para minha sentença, por;:
motivos misteriosos e baseados em fatos.fonte
BBC Basic, 40
Inclui uma nova linha. Seria 30 se as palavras-chave pudessem ser consideradas como tokenizadas em vez de ASCII.
Eu peguei minha namorada dormindo com o leiteiro, então eu a larguei e estou dormindo com sua irmã por vingança.
As my ex do I!
(cinco "palavras" de duas letras com caracteres únicos) não eram entropia suficiente, então adicionei o smiley de língua no final para tornar a entropia exatamente 3,5. Afinal, na realidade, tenho uma vida bastante normal, não um enredo estranho de novela.Repetindo o programa 5 vezes, obtemos
Somente as 5
READ
instruções são executadas e os 5 primeiros itens de dados são lidos na primeiraDATA
instrução. o restante dos dados é redundante. Saída:fonte
Ruby, 50
Isso usa seu próprio comprimento para determinar quantas palavras serão impressas. Caso contrário, suas repetições serão ignoradas, terminando no caractere de comentário
#
,. Frase emprestada do bitpwner : é muito conveniente ter uma frase curta com o mesmo número de letras em cada palavra.Uma vez que cada palavra + final é 4 caracteres, a fórmula seria, por exemplo, para o programa de 56 de comprimento:
(File.size($0)/56)*4 - 1
, mas eu posso dividir antes do tempo,56/4 = 14
, assimFile.size($0)/14 - 1
, poupando alguns caracteres.50
não é múltiplo de4
, mas12
está próximo o suficiente para o intervalo necessário.fonte
Chip , 165 + 3 = 168 bytes
+3 para bandeira
-w
"Ganhei um terno vermelho" (3.5) (na verdade não ganhei nada disso) (... ainda)
Observe a nova linha à direita, para que a cópia concatenada apareça abaixo do código existente.
Experimente online! (o original)
Experimente online! (o original, mais as quatro cópias)
Esta é uma bagunça emaranhada. Aconteceu que a parte mais complicada foi a condição de rescisão. (Minha primeira iteração imprimiu a (s) palavra (s), seguida por um fluxo interminável de bytes nulos ...).
Como funciona
Primeiro a frase:
12 caracteres únicos + 4 espaços = exatamente 3,5 entropias.
E o código:
cada cópia imprime a primeira palavra e depois informa a cópia abaixo para imprimir a próxima palavra. Se houver apenas uma instância, não haverá segunda cópia; portanto, nada, exceto a primeira palavra, será impresso.
Se houver duas cópias, ambas imprimirão a primeira palavra simultaneamente (os bytes estão juntos OU, portanto, tudo bem), somente a segunda cópia imprimirá a segunda palavra.
Se todas as cinco cópias estiverem presentes, todas imprimirão a primeira palavra, etc, etc, e a quinta cópia imprimirá a última palavra sozinha.
O circuito de terminação encerrará o programa assim que todas as cópias não estiverem sendo ativamente impressas.
fonte
Ruby, 63
fonte
Perl, 37
É parecido com o que tinha acontecido, mas aproveitando o qw do perl para salvar mais alguns caracteres.
fonte
Comprimento da mensagem Rebmu + 27
Fomos com "Meu QI não sou eu!" isso seria 43. Mas eu apoio esta mensagem:
Rebol equivalente / vermelho:
O Rebol possui 3 condicionais básicos: SE, MAIS E MENOS. A menos que seja equivalente a SE NÃO, mas pode ser mais claro: "Sempre faça o seguinte, A menos que essa condição seja verdadeira".
Nesse caso, a condição é que testemos para ver se o símbolo S recebeu um valor no contexto atual. Temos que usar uma citação, porque tentar usar um S não citado em uma expressão condicional o avaliaria e possivelmente causaria um erro. (
value?
não cita seu parâmetro por padrão, porque você pode querer ter qual símbolo está verificando em uma variável, por exemplosym: 's
,if value? sym [...]
na verdade, verificaria se S foi definido, não SYM)Somente a primeira pasta do programa atribui a série de strings a S. Pastas sucessivas pegam uma string da cabeça da série e a passam para PRINT / ONLY, que imprimirá seu argumento sem adicionar um avanço de linha.
(Nota: PRINT / ONLY é uma maneira de substituição sugerida para dizer PRIN, que está sendo considerada em Rebol 3 e Red; uma substituição de impressão agora está sendo testada em Rebmu.)
fonte
AHK , 44 bytes
Observe a nova linha no final. A única coisa inteligente aqui é que a string é composta por palavras de três letras, para que não tenhamos que dividir nada. Em vez disso, apenas puxamos uma substring com base em
i
. A saída é para a tela ativa como se tivesse sido digitada no teclado.fonte
Javascript (53)
Peguei o texto do aditsu porque não estou fazendo nada sofisticado com o texto, para que as palavras escolhidas sejam um pouco irrelevantes para a solução (exceto a contagem de bytes).
Conta
alert
neste caso? Edit: Lendo as regras, provavelmente não, como eu não estou juntando as cordas com espaços. Vou adicionar espaços para torná-lo justo.Observe também que o caro
var
é realmente relevante nesse caso.fonte
var i|=0;
que não funciona aqui ??|=
parecidovar
. Semvar
, você recebe umReferenceError: i is not defined
.var i=i|0
expande paravar i=undefined|0
, eundefined|0
é aparentemente0
.var i=i|0
é equivalente avar i;i=i|0
. É por isso que você não recebe o erro de referência. A razão pela qual será definido como 0 pela primeira vez é o que @ nyuszika7h disse.Perl, 43
56Eu aceito que não posso ganhar este. Minha tentativa original explica por que:
fonte
Lua, 77
Uma solução bastante simples:
(H (X) = 4,23)
fonte
Javascript, 138
(a nova linha adicional é adicionada apenas para facilitar a leitura)
Imprime
I'll sleep when I'm dead
. Usa um timer para garantir que a saída seja impressa apenas uma vezfonte
Pure Bash, 51 bytes
H (X) = 3,59447
Isso poderia ser um pouco mais complicado ao se usar uma das frases mais curtas, mas fico feliz em
seguira citação mais famosa deDescartes,Lennon. (Desculpe @Descartes, mas todas as palavras precisam ser únicas).Saída:
Tome cuidado para inserir espaços entre as palavras, mas não espaços à esquerda ou à direita.
Conta com o fato de que no bash, variáveis indefinidas, quando expandidas como seqüências de caracteres têm o valor "", mas quando expandidas aritmeticamente, têm o valor 0.
fonte
!
agora - parece fazer o truque.PHP
8978 charÉ um pouco detalhado, e definitivamente não vai ganhar, mas foi divertido de qualquer maneira. Aqui está o que eu vim com
Frase:
code golf is pretty fun
Entropia = 3.82791
Código:
Golfe:
fonte
Python3 - 122 bytes
Abra as portas do compartimento de pods [HAL]
Eu acho que vou ganhar algum crédito nerd com este. Se ao menos a pergunta permitisse mais uma palavra ...
O que meu programa faz é pegar o nome do arquivo (p.py é a base) e verifica quantas vezes o nome da base é iterado. Em seguida, leva fatias de um
n
tempo de seqüência de caracteres .n
sendo o número dep
s no nome do arquivo.O benefício do regex é que o programa pode ser chamado como você quiser e ainda funcionará (desde que você altere o nome da base no código): meu programa original foi chamado golfed.py.
fonte
05AB1E , 21 bytes (Não-competidor)
Experimente online!
Usos:
Explicação
fonte
“€í€Ü€…‚¿‹·“
heheStax , 24
Execute e depure
Citação: Alguns animais são mais iguais.
fonte
SmileBASIC, 54 bytes
Eu preferiria "A areia pode ser comida". mas isso falha no teste de entropia de alguma forma. Claro que eu poderia ter escolhido uma frase mais curta, mas isso é chato.
A
READ
palavra-chave lê um valorDATA
e o armazena em uma variável. UsarREAD
novamente obterá o próximo item e assim por diante.fonte
Pitão , 27 bytes
Uma vez , duas vezes , três vezes , quatro e cinco vezes . Anexar depois disso começa a repetir a frase.
fonte