Me ama, não me ama

45

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 , então a entrada mais curta ganha!

Além disso, meu primeiro desafio :) Boa sorte!

MatthewRock
fonte
Existe alguma restrição à distribuição do número de linhas, isto é, deve ser uniformemente aleatória ou é suficiente que todos os comprimentos entre 3 e 20 tenham uma probabilidade positiva?
Zgarb 15/09/2015
Eu não pensei sobre isso, mas diria que qualquer distribuição é boa - para que elas não tenham que ser uniformemente aleatórias.
MatthewRock
São 3 a 20 ( [3, 20)) ou 3 até 20 ( [3, 20])?
orlp 15/09/2015
1
@MatthewRock E se o idioma que queremos usar não puder propagar um número aleatório por conta própria? O usuário pode fornecer uma semente aleatória?
mınxomaτ 15/09/2015
3
@minxomat Seja como for, é apenas um jogo. Continue, mudou as regras.
MatthewRock

Respostas:

23

Pitão, 54 53 51 50 48 bytes

pj+*3\.bm+W~!Z"Loves me"" not"+3O18@".!"Z%hZ"</3
orlp
fonte
%2tWZ"<</33para a impressão do coração economiza 1. No entanto, não estou convencido de que essa seja a melhor maneira.
FryAmTheEggman 15/09/2015
@FryAmTheEggman Conseguiu economizar dois.
orlp 15/09/2015
A mesclagem das duas últimas cadeias salva outra, mas tive que voltar ao meu %.
FryAmTheEggman 15/09/2015
@".!"Z%hZ"</3salva dois bytes
Jakube 15/15
Como não há entrada há alguns dias, aceito esta resposta. Parabéns!
MatthewRock
23

CJam, 53 50 49 bytes

Agradecemos a Dennis por economizar 1 byte.

Imr3+{"Loves me"X!:X" not"*'.3*N}*&"!."X=N'<'/X*3

Teste aqui.

Explicação

O código simplesmente despeja a cadeia de bits na pilha, que é impressa automaticamente no final do programa:

Imr3+         e# Generate a random number in [3,20]
{             e# Execute this block that many times.
  "Loves me"  e#   Push "Loves me", we always need that.
  X!:X        e#   Toggle X (initially 1) between 0 and 1 and leave it on the stack.
  " not"*     e#   Repeat " not" that many times, removing it on every other line.
  '.3*N       e#   Push "..." and a newline.
}*
&             e# Set intersection of "..." and newline, turning them into an empty array.
"!."X=        e# Select "!" or "." based on the last value of X.
N'<           e# Push a newline and "<".
'/X*          e# Include "/" or not depending on the last value of X.
3             e# Push a 3.
Martin Ender
fonte
se poderia imaginar CJam teria sido desenvolvido exclusivamente para o código-golf ^^
Larkey
11
@larkey mas é ...
MatthewRock
O @larkey CJam é derivado do GolfScript, e o GolfScript (como o nome indica) foi projetado para jogar golfe.
Chris Jester-Young
@ ChrisJester-Young era ment um pouco tongue-in-cheek ;-)
Larkey
17

Brainfuck, 2766 bytes (atualmente inválido)

Só porque. Vou adicionar uma versão não-gasta mais tarde.

Código

>+<+[>[>[-]+<-]>[<+>>+[->,----------[<+>[>>>>>>>>>+<<<<<<<<<-]>>>>>>>>>[>+<<<<<<<<<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]]<]<-]>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>>>>>>>>>>>[<<<<<<<<<<+>>>>>>>>>>-]>[<<<<<<<<<<+>>>>>>>>>>-]<<<<<<<<+++++++[<+++++++++++>-]<[<<[>>>>>>>>>>+<<<<<<<+<<<-]>>>[<<<+>>>-]<<[>>>>>>>>>+<<<<<<<+>+<<<-]>>>[<<<+>>>-]<[>>>>>>>>+[<<<<<<<+>+>>>>>>-]<<<<<<[>>>>>>+<<<<<<-]+<[>-<[-]]>[>>>>>+<<<<<-]<<-]<-]++++++[>++++++++<-]>-[<<[>>>>>>>>>+<<<<<<<<+<-]>[<+>-]>-]<<<[-]>[-]+++++[<+++++>-]<[>>>>>>>>>>>+[<<<<<<<<<<+>+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]+<[>-<[-]]>[>>>>>>>>+<<<<<<<<-]<<-]++++++[>>>>>>>>>>+++++++++<<<<<<<<<<-]>>>>>>>>>>[<<+<<<<<<<<+>>>>>>>>>>-]<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<<<-]>>>>>>>[-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[-]++++++++++++++++++++<<[<<<+>>>-]>>[<<<<<<<<+>+<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]>>[>>>-<<<[-]]<<<[-]>>>>>>>>[-]<[>+<<<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>>>>[-]+++<<<[<<<<<+>>>>>-]>>>[<<<<<<<<<<<+>+<<+>>>>>>>>>>>>-]<<<<<<<<<<<<[>>>>>>>>>>>>+<<<<<<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]<[>>>>>>>>-<<<<<<<<[-]]>>>[-]>>>[<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>>-<<<<<<<[-]]>>>>>>>>>[<<<<<<<<<+>+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]<[>>>>>>>[-]-<<<<<<<[-]]>>>>>>>[>>>>>>+<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>+++++++++++[>+++++++>++++++++++>+++++++++>+++>++++<<<<<-]>-.>+.+++++++.>++.<---.>>-.<<------.>.>>++...[-]<[-]<[-]<[-]<[-]<++++++++++.[-]>>>>>>>[-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>->[-]<[>+<-][-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[-]<<[<<<<<<+>>>>>>-]->>[<<<<<<<<-<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>[>>>>>>+<<<<<<[-]]<->>>>>>>[<<<<<<<->>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[>>>>>>>>+<<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[<+>>++++++[>++++++++++<-]>.---------.[-]<<<-<->>-]>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>+++++++++++[>+++++++>++++++++++>+++++++++>+++>++++<<<<<-]>-.>+.+++++++.>++.<---.>>-.<<------.>.>.<<+.+.+++++.>>>++...[-]<[-]<[-]<[-]<[-]<++++++++++.[-]>>>>>>>[-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>->[-]<[>+<-][-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[-]<<[<<<<<<+>>>>>>-]->>[<<<<<<<<-<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>[>>>>>>+<<<<<<[-]]<->>>>>>>[<<<<<<<->>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[>>>>>>>+<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[<+>>++++++[>++++++++++<-]>.-------------.++++.<<<<->>-]<<]

Pseudo-código

loop
    get a random byte
until random byte is >2 and <21

point to byte
[
    output "Loves me..."
    decrease byte by 1
    if byte is 0
        output "<3"
        exit
    eif
    output "Loves me not..."
    decrease byte by 1
]
output "</3"

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)

1              
Loves me...    
Loves me not...
Loves me...    
Loves me not...
Loves me...    
<3             

Semente: 3 (o número aleatório é 20, leva 463.253.048 operações)

3
Loves me...
Loves me not...
(...)
Loves me...
Loves me not...
</3

Eu sugiro que você não se propague 6, pois são necessárias 2,105,900,375iteraçõ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:

gcc.exe -c main.c -o main.o
gcc.exe main.o -o loveme.exe

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:

Programming Puzzles & Code Golf
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
<3
mınxomaτ
fonte
3
+1 para ter a audácia de escrever uma PRNG em Brainfuck ...
AdmBorkBork
@TimmyD Existem maneiras melhores de escrever PRNGs no BF, mas a maioria é baseada no tempo (execute o programa e interrompa a execução em algum momento, depois leia a memória), mas isso exigiria interação do usuário e dois programas separados, o que é contra as regras.
mınxomaτ 15/09/2015
3
Bom pseudocódigo. Mais pessoas devem fazer isso, especialmente porque metade dos idiomas do golfe é basicamente ilegível se você não os conhece.
The_Basset_Hound
3
Infelizmente, sua saída está errada. O último "Ama-me" deve terminar com um ponto de exclamação (portanto, "Ama-me!") E "Não me ama" deve terminar com um único ponto ("Não me ama".).
MatthewRock 16/09
1
Podemos ter algum pseudocódigo do RNG?
Beta Decay
7

Javascript (ES6), 119 104 99 98 bytes

for(i=new Date%18+3,s=i&1?`!
<3`:`.
</3`;i--;)s=`...
Loves me`+(i&1?' not':'')+s
alert(s.slice(4))
Mwr247
fonte
Um bom! Pode ser mais curto usar a concatenação de strings para criar o coração e, possivelmente, na criação de cada linha. Se importa se eu usar o new Datetruque na minha resposta?
ETHproductions
@ETHproductions Vá em frente, desde que você esteja bem comigo usando esses corações haha ​​(e por que eu não usei o alerta ... por algum motivo, eu me convenci de que as funções da seta seriam mais curtas, mas a necessidade de retorno nega isso .. .). Na verdade, eu só tenho ele para baixo para 104 agora com alguns outros truques, bem =)
Mwr247
Dang ... bom trabalho :) Eu manter reorganizando minha, mas sempre no 104.
ETHproductions
A inovação para mim foi combinar a variável comprimento / iteração concatenando para trás e definindo os corações na inicialização. Eu tentei um tempo atrás com poucas economias, mas a simplificação do seu coração tornou muito mais eficiente.
precisa saber é o seguinte
Espere um minuto ... Tentando isso, eu entendo Loves me not... Loves me... Loves me not! <3e Loves 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.
ETHproductions 15/09/2015
6

Python, 147

from random import*;t=randint(3,20)
print"\n".join("LLoovveess  mmee  n o t"[i%2::2].strip()+"..."*(i<t-1)for i in range(t))+"!.\n\n<<3/ 3"[t%2::2]

Usa o em from random import*vez de import randome em randintvez de randrangepara salvar alguns bytes. Provavelmente existem alguns bytes restantes para o golfe.

Loovjo
fonte
3
A alternância "LLoovveess mmee n o t"[i%2::2].strip()parece desnecessariamente complicada. Você não pode simplesmente fazer "Loves me"+~i%2*" not"?
xnor
Even ["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 do
xnor
6

Javascript (ES6), 110 102 bytes

a='';for(i=j=new Date%18+3;i--;)a+='Loves me'+(j-i&1?'':' not')+(i?`...
`:j&1?`!
<3`:`.
</3`);alert(a)

Este 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:

a='';for(i=j=new Date%18+3;i;)a+='Loves me'+' not'.repeat(j-i--&1)+(i?`...
`:j&1?`!
<3`:`.
</3`);alert(a)

Nomes internos malditos de JS 5 + -char. Ah bem. Sugestões são bem-vindas!

ETHproductions
fonte
Condensação impressionante. Estou curioso, por que o 18+3|0?
Mwr247
@ Mwr247 Oh, duh, foi quando eu usei Math.random(). Acho que não é necessário agora.
ETHproductions
5

Perl, 85

print$_?'...
':'','Loves me',$c=$_%2?' not':''for 0..3+rand 18;print$c?'.
</3':'!
<3'
Dom Hastings
fonte
5

Ruby, 91 bytes

(n=3+rand(18)).times{|i|puts"Loves me"+[""," not"][i%2]+(i<n-1?"...":i%2>0?".
</3":"!
<3")}
daniero
fonte
5

Lisp comum 106 104 bytes

(format t"~{Loves me~[ not~]~#[~:*~[.~%</~;!~%<~]3~:;...~]~%~}"(subseq'#1=(1 0 . #1#)0(+ 3(random 18))))

Isso 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 circular 1e 0e subseqé usado para fazer uma lista de comprimento [3,20] (esta é a única parte não portátil, como subseqsó é 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 formatdiretrizes:

~{ 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.

Jason
fonte
1
Este foi um esforço de grupo do canal #lisp IRC. Muito obrigado ao phf pela inteligente formatação iterativa e pelo subseq hack.
Jason
4

Julia, 98 bytes

r=rand(3:20)
for i=1:r println("Loves me"*(i%2>0?" not":"")*(i<r?"...":i%2>0?".\n</3":"!\n<3"))end

Ungolfed:

# Define a random number 3 ≤ r ≤ 20
r = rand(3:20)

for i = 1:r
    # The loveless lines occur when i is even
    println("Loves me" *
            (i % 2 > 0 ? " not" : "") *
            (i < r ? "..." : i % 2 > 0 ? ".\n</3" : "!\n<3"))
end
Alex A.
fonte
4

Shell UNIX, 193 bytes

t=$(seq 2 19|shuf|head -1)
l=t
p=...
while [ $t -ge 0 ];do
case $l:$t in t:0)p=!;h=\<3;;f:0)p=.;h=\</3;;esac
case $l in t)l=f;n=;; f)l=t;n=\ not;;esac
t=$((t-1))
echo Loves me$n$p
done
echo $h
Alois Mahdal
fonte
4

Java, 210 209 203 200 177 bytes

  • virou i%2==0parai%2<1
  • { ... }chaves aparadas para for-loop, edeclaração movida para loop
  • condicionais reordenados
  • modificadores removidos e parênteses desnecessários, Randomuso retrabalhado e incremento parai

Nota: nova linha é adicionada abaixo para formatação neste site, a contagem acima é para uma única linha.

class F{public static void main(String[]a){for(int e=3+(int)(Math.random()*18),i=0;++i<=e;)
System.out.println("Loves me"+(i%2>0?i<e?"...":"!\n<3":" not."+(i<e?"..":"\n</3")));}}

Ungolfed:

class F {
    public static void main(String[] a) {
        for (int e = 3 + (int) (Math.random() * 18), i = 0; ++i <= e; )
            System.out.println("Loves me" + (i % 2 > 0 ? i < e ? "..." : "!\n<3"
                    : " not." + (i < e ? ".." : "\n</3")));
    }
}
hjk
fonte
1
Você pode salvar 13 bytes removendo public.
Luminoso
@Luminous eu ainda vou precisar manter esse por main()...
hjk
@ TimmyD Eu segundo isso.
RK.
4

C, 123, 121, 109106 caracteres (108 bytes)

(com um pouco de ♥♥♥ trapaça ♥♥♥)

O;main(o){for(o=time(O)%18+3;o-O++;printf("Loves me%s%s\n",O&1?"":" not",o-O?"...":O%2?"!\n♥":".\n</3"));}

Há também um ponto Unicode com o coração partido no 1f494, mas tive dificuldades em encontrar uma fonte que a implemente.

Jens
fonte
Isso mostra 120 caracteres e 122 bytes ...
AdmBorkBork 16/15
1
Eu não acho que você precisa O=0, porque Cinicializa automaticamente ints para 0?
FryAmTheEggman
@FryAmTheEggman Good find! Em uma versão anterior, eu tinha O main(o,O)onde deveria ser inicializado.
Jens
Bom, eu gosto disso! Eu não pensei em usar timecomo um número aleatório ... Inteligente!
MatthewRock
@MatthewRock Se você pensar bem, todos os outros programas que usarem srand(time(0))mudarão a resposta com a mesma frequência. O srand é completamente inútil :-)
Jens
4

Python 2, 161 159 156 144 144 bytes

from random import*;a=randrange(3,21)
for i in range(a):print'Loves me'+i%2*' not'+('...'if i!=a-1 else'.'if i%2 else'!')
print['<3','</3'][i%2]

Sã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

a=RR(3,21)
for i in R(a):P('Loves me'+i%2*' not'+('...'if i!=a-1 else'.'if i%2 else'!'))
P(['<3','</3'][i%2])
Celeo
fonte
Você pode fazer a declaração de intervalo em uma única linha. você também pode fazerimport random as r
Azul
você também pode colocar o conteúdo da última declaração de impressão na linha acima.
azul
Eu acho que você pode mudar print'</3'if i%2 else'<3'para print['<3','</3'][i%2]salvar 3 bytes.
Kade
Sim, de fato eu posso; obrigado!
Celeo 15/09/2015
Obrigado! Curiosamente, import random as r;a=r.randrange(3,21)e import random;a=random.randrange(3,21)são do mesmo comprimento.
Celeo # 15/15
3

PowerShell, 121 119 111 bytes

$i=2..19|Random;1..$i|%{"Loves me$(if(!($_%2)){" not"})..."};"Loves me$(if(!($i%2)){"!`n<"}else{" not.`n</"})3"

Editar - 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 fazendo for()loop. Observe que, como isso usa um implícito Get-na frente Randompara salvar alguns bytes, isso pode operar extremamente lentamente em determinadas versões do PowerShell. Referência

Expandido abaixo para esclarecimentos:

# Create a collection of (2,3,4,...18,19) and pipe it as input to Get-Random
$i = 2..19 | Get-Random

# Create a collection of (1,2,...$i-1,$i) and pipe it to seed a ForEach-Object loop
1..$i | ForEach-Object {
  if(!($_%2)) {
    # If the input number is even, we're on an even line
    Write-Output "Loves me not..."
  }
  Else {
    # The input number is odd
    Write-Output "Loves me..."
  }
}
If(!($i%2)) {
  # Our random number is odd
  Write-Output "Loves me!"
  Write-Output "<3"
}
Else {
  # Our random number is even
  Write-Output "Loves me not."
  Write-Output "</3"
}
AdmBorkBork
fonte
3

C ++, 210. 193 184 168 bytes

Em C ++ .. porque .. Por que não? :)

#include <iostream>
main(){auto&c=std::cout;srand(time(0));int i,j=3+rand()%18;while(i++<j)c<<"Loves me"<<(i%2?"":" not")<<(i==j?"":"...\n");c<<(j%2?"!\n<3":".\n</3");}

Viver: 210. 193 184 168

Espero 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.

wendelbsilva
fonte
Humn .. apenas percebe que é de 3 a 20. Vou consertar isso mais tarde. Provavelmente irá adicionar mais 2 bytes ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva
Você pode economizar muito, substituindo #define c coute using namespace std;porauto&c=std::cout;
Ben Voigt
Também economize alguns comint i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt
Olá, encontrei um bug: a última linha deve ser "Ama-me!", Não "Ama-me".
MatthewRock
1
Eu diria que está tudo bem - C e C ++ são semelhantes. E agora este código é mais do que o Java ...
MatthewRock
3

Groovy, 110 bytes

Um tipo de amor formidável:

int r=Math.random()*18;print((0..r+2).collect{"Loves me"+" not"*(it%2)}.join('...\n')+['!\n<3','.\n</3'][r%2])
Christoph Leuzinger
fonte
2

Python 2, 117 bytes

from random import*
n=randint(3,20)
print"...\n".join("Loves me"+i%2*" not"for i in range(n))+[".\n</3","!\n<3"][n%2]

Observe que todos Loves me( not)?são seguidos por ...e uma nova linha, exceto a última. Então, isso parece um trabalho para join.

DLosc
fonte
Um pouco atrasado, mas ".!\n\n<</33"[n%2::2]é 2 bytes mais curto.
FryAmTheEggman 17/09/2015
@FryAmTheEggman Sim, eu vi isso, mas decidi não roubá-lo de Loovjo. Enquanto isso, alguém postou exatamente essa solução. [shrug]
DLosc 17/09/2015
Eu não tinha notado alguém postagem, mas eu tenho certeza que o meu comentário foi o primeiro que tinha nele, assim você pode usá-lo se você quiser: P
FryAmTheEggman
2

R, 141 132 128 114 111 109 bytes

Código

k=sample(3:23,1);for(i in 1:k)cat("Loves",c("me not...\n","me...\n","me not.\n</3","me!\n<3")[1+i%%2+2*!i<k])

Ungolfed

k <- sample(3:23, 1)        # Generates random "k" number from 3 to 23
for(i in 1:k) {             # Loop this block increasing i from 1 until k by 1
  cat                       # Concatenate and paste everything inside this block
  ("Loves",                 # Push "Loves" on every iterations of the loop
      c(                    # Create a vector of strings
        "me not...\n",      # Push string to the index "1" of vector
        "me...\n",          #   to the index "2"
        "me not.\n</3",     #   to the index "3"
        "me!\n<3"           #   to the index "4"
        )[1+i%%2            # Subset the vector by the index (1 or 2)
          +2*!i<k])}        #   if final iteration of loop then index += 2 (3 or 4)

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)*2para +2*!x<k
Edit 4: Voltar para o loop for e removido ()do (i%%2)+1
Edit 5: Wrote me4 vezes e removido osep=""

Mutador
fonte
1

R, 119 111 105 bytes

x<-sample(3:20,1);cat(rep(c("Loves me...\n","Loves me not...\n"),x)[1:x]);cat(ifelse(x%%2==1,"<3","</3"))

Edições 1,2: codificar as duas opções explicitamente está economizando espaço.

Eric Brooks
fonte
1
Você pode salvar um byte usando =para atribuição em vez de <-e outro executando x%%2>0no lugar de x%%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.)
Alex A.
1
@ Alex A. Você também não precisa x%%2>0; apenasx%%2
Flounderer
Bons pontos, obrigado. Preciso voltar e consertar o final.
Eric Brooks
1

Bytes C 226

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main(){srand(time(NULL));int i=rand()%18+3;int j;for(j=0;j<i;j++)printf("Loves me%s%s\n",(j%2)?" not":"",(j==i-1)?(j%2)?".":"!":"...");printf("<%s3\n",(j%2)?"":"/");}

(Com formatação)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand(time(NULL));
    int i = rand()%18 + 3;
    int j;
    for (j = 0; j < i; j++)
        printf("Loves me%s%s\n", (j % 2) ? " not" : "", (j==i-1) ? (j % 2) ? "." : "!" : "...");
    printf("<%s3\n", (j%2) ? "" : "/");
    return 0;
}
tonysdg
fonte
1
Remova o tipo de retorno do principal (-5 bytes), torne iej global com o tipo padrão (-8 bytes, -3 a mais por causa do padrão 0 em j), use 0 em vez de NULL (-3). Outras coisas - use apenas uma variável e faça a contagem decrescente talvez. O stdio de importação geralmente não é necessário ao jogar golfe.
Aragaer # 16/15
1

Python 2, 115 bytes

from random import*
n=randint(2,20)
print'...\n'.join('Loves me'+i%2*' not'for i in range(n))+'.!\n\n<</33'[n%2::2]
SimonPJ
fonte
1

PHP, 191 187 146 165 Bytes

$x=rand(5,22);for($i=2;++$i<=$x;){echo"\nLoves me";if($i%2<1)echo" not";if($i<$x)echo"...";if($i==$x&&$i%2<1){echo".\n</3\n";}elseif($i==$x&&$i%2>0){echo"!\n<3\n";}}

Ungolfed:

$x=rand(5,22);
for($i=2;++$i<=$x;){
    echo "\nLoves me";
    if($i%2<1) echo " not";
    if($i<$x) echo "...";
    if($i==$x && $i%2<1){
        echo ".\n</3\n";
    }
    elseif($i==$x && $i%2>0){
        echo "!\n<3\n";
    }
}

48,49 bytes para pyth e cjam ... uau :)

Marek Bettman
fonte
Mudou $ i% 2 == 0 a $ i% 2 <1 (x2) e US $ i% 2 = 0 a $ i% 2!> 0 (x2)
Marek Bettman
Acontece que ternários operadores não são a melhor resposta em todos os momentos :)
Marek Bettman
1

mSL, 178 176 156 156 154 bytes

Edit 1: Alterado == 0para < 1
Edit 2: Removido espaço em branco desnecessário, obrigado AlexA!
Edição 3: Parênteses removidos

alias l {
var %n 1
while %n <= $rand(3,20) {
var %m $+(Love me,$iif($calc(%n % 2) < 1,$chr(32) $+ not),...)
echo %m
inc %n
}
echo $iif(n isin %m,</3,<3)
}
Denny
fonte
1
Sua solução atualmente é 176 bytes, não 177. Todo o espaço em branco é necessário? Caso contrário, você pode reduzir seu código em uma quantidade significativa simplesmente removendo espaços em branco desnecessários.
Alex A.
@AlexA. Ah, não sei por que escrevi 177, e obrigado por apontar a necessidade de espaço em branco, na verdade não é necessário!
Denny #
1

Perl, 97 bytes

$_='She loves me...
'x(3+rand 18);s/(me.*?)me/$1me not/gs;s/e...
$/e!
<3/;s/t...
$/t.
<\/3/;print

Versão legível:

$_="She loves me...\n"x(3+rand 18);
s/(me.*?)me/$1me not/gs;
s/e...$/e!\n<3/;
s/t...$/t.\n<\/3/;
print
bopjesvla
fonte
1

Hássio , 265 bytes

func main(){rnd=new Random();times=rnd.next(3,21);println("Loves me...");for(x=0;x<times-1;x++){if(x%2==0)println("Loves me not...");else println("Loves me...");}if((times-1)%2==0){println("Loves me not.");println("</3");}else{println("Loves me!");println("<3");}}

A resposta foi jogada.

Jacob Misirian
fonte
Sua solução atualmente é 458 bytes , não 523. Você pode melhorar sua pontuação removendo espaços em branco desnecessários e encurtando nomes de variáveis. Veja a outra solução de Hassium para exemplos.
Alex A.
1
Como observei na outra resposta de Hássio, o gerador de números aleatórios parece ser extremamente tendencioso. Eu corri isso 500 vezes com a versão mais recente e só tenho duas </3.
Dennis
+ Dennis O gerador Random é construído diretamente em cima do gerador de números aleatórios em C #. Veja: github.com/HassiumTeam/Hassium/blob/master/src/Hassium/…
Jacob Misirian
3
Parece não ter sido propagada corretamente. Se eu executar rnd = new Random();rnd.next(0,2);1000 vezes, a distribuição está OK. No entanto, se eu executar rnd = new Random();uma vez e rnd.next(0,2);1.000 vezes, sempre recebo exatamente 533 se 0467 1s.
Dennis
1

C # (160)

O código é inspirado na resposta de hjk , o crédito é para ele.

class P{static void Main(){for(int e=3+new Random().Next(0,18),i=0;++i<=e;)Console.WriteLine("Loves me"+(i%2>0?i<e?"...":"!\n<3":" not."+(i<e?"..":"\n</3")));}}

Ungolfed:

class P
{
    private static void Main()
    {
        for (int e = 3 + new Random().Next(0, 18), i = 0; ++i <= e;)
            Console.WriteLine("Loves me" + (i % 2 > 0 ? i < e ? "..." : "!\n<3" : " not." + (i < e ? ".." : "\n</3")));
    }
}
Abbas
fonte
1

Lua, 137 132 bytes

Provavelmente pode ser jogado muito mais, mas aqui está por enquanto:

t=math.random(3,20)for i=1,t do io.write(i%2==0 and"Loves me"or"Loves me not")print(i==t and(i%2==0 and"!\n<3"or".\n</3")or"...")end

Explicação do código e não destruído:

t=math.random(3,20) --Generates a random number between 1 and 30. We need to assign it to a variable to check if the loop is over later.
for i=1,t do
  io.write(i%2==0 and"Loves me"or"Loves me not") --If i%2 is 0 write without a newline Loves me, if not print Loves me not.
  print(i==t and (i%2==0 and"!\n<3" or ".\n</3") or "...") --If it is not the end of the loop, put ..., else if we ended on an even print ! a newline, and then a heart, but if we ended on an odd put ., a newline and a broken heart :(
end

Edit: Cortado em algum espaço em branco.

TreFox
fonte
1

Geléia , 55 bytes (não competindo?)

“¢zḞzƘFq»,;¥“ not”ṁ18X+2¤j“...¶”µċ⁷Ḃ©”/ẋ;3⁾¶<;®ị⁾.!¤;⁸;

Experimente online!

Como sempre, Jelly é péssima.

Erik, o Outgolfer
fonte
1

PowerShell , 85 88 bytes

+3 bytes obrigado Veskah: Esse é um bom ponto.

0..(1..19|Random)|%{($l='Loves me')+' not'*($n=$_%2)+'...'}
$l+('!
<3',' not.
</3')[!$n]

Experimente online!

confuso
fonte
1
Isso pode gerar "me ama, não me ama </ 3", que, com base em como leio as especificações, está abaixo do número mínimo de linhas.
Veskah 6/03
De fato of *3* to 20 lines inclusive. Obrigado!
mazzy 6/03