Me ama, não me ama
Este jogo infantil simples é antigo, mas ainda é popular. Já que estamos vivendo no século 21 agora, vamos digitalizá-lo!
Especificação
O programa não deve receber nenhuma entrada, a menos que você esteja usando um idioma que não possa gerar uma semente aleatória - nesse caso, você poderá receber a semente como uma entrada. Sua tarefa é escrever um programa que produza aleatoriamente um total de 3 a 20 linhas, inclusive: "Me ama ..." e "Não me ama ..." por turnos, como no jogo (e uma linha adicional; mantenha lendo).
No entanto, existem algumas restrições. Cada linha deve ser seguida por nova linha. A primeira linha deve ser "Ama-me ...". A última linha ("Ama-me" ou "Não me ama") deve terminar com ponto de exclamação ou um único ponto, respectivamente. Após a última linha, você precisa gerar um coração ( <3
) ou um coração partido ( </3
) na nova linha, dependendo de "Me ama!" ou "Não me ama." foi a última frase.
Espaços em branco à direita são permitidos.
Saída de exemplo
Resultado:
Me ama ...
Não
me
ama ...
Me ama ... Não me ama ... Me ama!
<3
Outra saída:
Me ama ...
Não
me
ama ... Me ama ... Não me ama.
</ 3
Este é o código de golfe , então a entrada mais curta ganha!
Além disso, meu primeiro desafio :) Boa sorte!
fonte
[3, 20)
) ou 3 até 20 ([3, 20]
)?Respostas:
Pitão,
5453515048 bytesfonte
%2tWZ"<</33
para a impressão do coração economiza 1. No entanto, não estou convencido de que essa seja a melhor maneira.%
.@".!"Z%hZ"</3
salva dois bytesCJam,
535049 bytesAgradecemos a Dennis por economizar 1 byte.
Teste aqui.
Explicação
O código simplesmente despeja a cadeia de bits na pilha, que é impressa automaticamente no final do programa:
fonte
Brainfuck, 2766 bytes (atualmente inválido)
Só porque. Vou adicionar uma versão não-gasta mais tarde.
Código
Pseudo-código
Amostra
Quando executado, o programa entra em uma sessão interativa aguardando entrada. A entrada deve ser um número. Este número é usado como uma semente.
Semente: 1 (o número aleatório é 5, leva 218.168.042 operações)
Semente: 3 (o número aleatório é 20, leva 463.253.048 operações)
Eu sugiro que você não se propague
6
, pois são necessárias2,105,900,375
iterações para calcular o resultado :).Compilando / Executando
Você precisa de um intérprete rápido para isso. Nenhum intérprete online que testei conseguiu lidar com a velocidade de execução. Os ips (iterações por segundo) devem ser maiores que
100,000,000
. Então, eu vim com outra solução.Este é um compilador Brainfuck para C escrito em Brainfuck. Você pode usar qualquer intérprete online para transpilar meu código para C. puro. Sugiro usar brainfuck.tk . Cole meu código na entrada stdin, após este código na entrada de código:
Baixe o código-fonte e compile-o:
Você também pode executar uma cópia do código C online aqui: via. CodingGround .
Otimizações
Ainda há trabalho a ser feito, mas a reutilização da célula é quase ideal.
Observações
Você pode usar palavras ou frases como uma semente:
fonte
Javascript (ES6),
1191049998 bytesfonte
new Date
truque na minha resposta?Loves me not... Loves me... Loves me not! <3
eLoves me not... Loves me... Loves me not... Loves me. </3
. Acho que você precisará alterar um dos condicionais para corrigir isso. EDIT: Oh, basta mudar o''
e' not'
na quarta linha.Python, 147
Usa o em
from random import*
vez deimport random
e emrandint
vez derandrange
para salvar alguns bytes. Provavelmente existem alguns bytes restantes para o golfe.fonte
"LLoovveess mmee n o t"[i%2::2].strip()
parece desnecessariamente complicada. Você não pode simplesmente fazer"Loves me"+~i%2*" not"
?["Loves me","Loves me not"][i%2]
é mais ideal, pois agora você está desperdiçando caracteres.strip()
e alguns espaços. Mas sim, use o código doJavascript (ES6),
110102 bytesEste foi um pequeno, porém divertido, pequeno desafio. Pode ser possível reduzir mais. Obrigado a Mwr247 por alguns truques de economia de bytes!
Versão alternativa usando
repeat()
105 bytes:Nomes internos malditos de JS 5 + -char. Ah bem. Sugestões são bem-vindas!
fonte
18+3|0
?Math.random()
. Acho que não é necessário agora.Perl, 85
fonte
Ruby, 91 bytes
fonte
Lisp comum
106104 bytesIsso funciona apenas em lisps que não verificam a sequência correta (por exemplo, cmucl, sbcl, clisp). O ccl verifica a circularidade e o erro no nível de segurança padrão. O ecl funcionará para sempre.
Explicação:
#1=(1 0 . #1#)
gera uma lista contendo circular1
e0
esubseq
é usado para fazer uma lista de comprimento [3,20] (esta é a única parte não portátil, comosubseq
só é requerido pelo padrão de trabalho em listas adequadas (ou seja, não circulares)).Nosso formato agora está operando em uma lista
1 0 1 0...
de comprimento [3,20]Explicação das
format
diretrizes:~{
itera sobre esta lista~[
seguido por qualquer número de~;
e finalizado com~]
selecionará o item N, com base no valor do argumento de formato. Isso é usado aqui para que o primeiro item de a~[
seja o caso "não me ame" e o segundo item o caso "me ame". Observe que, com~[
um separador de~:;
seleciona um caso padrão.~#[
funciona como~[
exceto o argumento é o número de argumentos restantes. 0 argumentos restantes significa que estamos no final, o caso padrão é imprimir...
~:*
faz o backup da lista de argumentos em uma posição, o que nos permite imprimir o trailer correto.fonte
Julia, 98 bytes
Ungolfed:
fonte
Shell UNIX, 193 bytes
fonte
Java,
210209203200177 bytesviroui%2==0
parai%2<1
{ ... }
chaves aparadas parafor
-loop,e
declaração movida para loopRandom
uso retrabalhado e incremento parai
Nota: nova linha é adicionada abaixo para formatação neste site, a contagem acima é para uma única linha.
Ungolfed:
fonte
main()
...C,
123, 121, 109106caracteres (108 bytes)(com um pouco de ♥♥♥ trapaça ♥♥♥)
Há também um ponto Unicode com o coração partido no 1f494, mas tive dificuldades em encontrar uma fonte que a implemente.
fonte
O=0
, porqueC
inicializa automaticamente ints para0
?main(o,O)
onde deveria ser inicializado.time
como um número aleatório ... Inteligente!srand(time(0))
mudarão a resposta com a mesma frequência. O srand é completamente inútil :-)Python 2,
161159156144 144 bytesSão 39 bytes apenas para obter o número aleatório.
Um grande obrigado a muddyfish , fryamtheeggman e orlp por sua ajuda.
PYG , 109 bytes
fonte
import random as r
print'</3'if i%2 else'<3'
paraprint['<3','</3'][i%2]
salvar 3 bytes.import random as r;a=r.randrange(3,21)
eimport random;a=random.randrange(3,21)
são do mesmo comprimento.PowerShell,
121119111 bytesEditar - mais curto para incluir explicitamente, em
"Loves me"
vez de declarar$l
Edit2 - esqueci que eu posso jogar
for()
loops no pipelining ... durr ...Não é muito pobre. Usa blocos de execução de código embutido
$(...)
para ajustar dinamicamente a string impressa enquanto estamos fazendofor()
loop. Observe que, como isso usa um implícitoGet-
na frenteRandom
para salvar alguns bytes, isso pode operar extremamente lentamente em determinadas versões do PowerShell. ReferênciaExpandido abaixo para esclarecimentos:
fonte
C ++,
210.193184168 bytesEm C ++ .. porque .. Por que não? :)
Viver:
210.193184168Espero que nenhuma das minhas alterações seja dependente da plataforma.
Obrigado a Ben Voigt pela ajuda. Além disso, graças a todos os comentários, eles foram muito úteis.
fonte
j=3+(int)(rand()*17.0/RAND_MAX)
#define c cout
eusing namespace std;
porauto&c=std::cout;
int i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Groovy, 110 bytes
Um tipo de amor formidável:
fonte
Python 2, 117 bytes
Observe que todos
Loves me( not)?
são seguidos por...
e uma nova linha, exceto a última. Então, isso parece um trabalho parajoin
.fonte
".!\n\n<</33"[n%2::2]
é 2 bytes mais curto.R,
141132128114111109 bytesCódigo
Ungolfed
Eu me inspirei no código de Eric Brooks .
Edit 1: Agora, o código gera corretamente a última pontuação, como indicado por Martin
Edit 2: Alterou o loop for para um sapply e incluiu os corações dentro da última string de linha.
Edit 3: Removido
{}
e alterado+(x==k)*2
para+2*!x<k
Edit 4: Voltar para o loop for e removido
()
do(i%%2)+1
Edit 5: Wrote
me
4 vezes e removido osep=""
fonte
R,
119111105 bytesEdições 1,2: codificar as duas opções explicitamente está economizando espaço.
fonte
=
para atribuição em vez de<-
e outro executandox%%2>0
no lugar dex%%2==1
. Observe também que isso não lida com a última linha corretamente; deve haver um.
ou!
melhor que...
. (Ver exemplo de saída em questão.)x%%2>0
; apenasx%%2
Bytes C 226
(Com formatação)
fonte
Python 2, 115 bytes
fonte
PHP,
191187146165 BytesUngolfed:
48,49 bytes para pyth e cjam ... uau :)
fonte
mSL,
178176156 156154 bytesEdit 1: Alterado
== 0
para< 1
Edit 2: Removido espaço em branco desnecessário, obrigado AlexA!
Edição 3: Parênteses removidos
fonte
Perl, 97 bytes
Versão legível:
fonte
Hássio , 265 bytes
A resposta foi jogada.
fonte
</3
.rnd = new Random();rnd.next(0,2);
1000 vezes, a distribuição está OK. No entanto, se eu executarrnd = new Random();
uma vez ernd.next(0,2);
1.000 vezes, sempre recebo exatamente 533 se0
4671
s.C # (160)
O código é inspirado na resposta de hjk , o crédito é para ele.
Ungolfed:
fonte
Lua,
137132 bytesProvavelmente pode ser jogado muito mais, mas aqui está por enquanto:
Explicação do código e não destruído:
Edit: Cortado em algum espaço em branco.
fonte
Geléia , 55 bytes (não competindo?)
Experimente online!
Como sempre, Jelly é péssima.
fonte
PowerShell ,
8588 bytes+3 bytes obrigado Veskah: Esse é um bom ponto.
Experimente online!
fonte
of *3* to 20 lines inclusive
. Obrigado!