Mi ama, non mi ama


45

Mi ama, non mi ama

Questo semplice gioco per bambini è vecchio, ma ancora popolare. Dal momento che viviamo nel 21 ° secolo ora, digitalizziamolo!

specificazione

Il programma non deve ricevere input, a meno che non si stia utilizzando una lingua che non è in grado di generare seed casuali, in tal caso è consentito prendere il seed come input. Il tuo compito è quello di scrivere un programma che genererà casualmente un totale di 3 a 20 righe incluse: "Loves me ..." e "Loves not not ..." a turno, come nel gioco (e una riga aggiuntiva; continua lettura).

Tuttavia, ci sono alcune restrizioni. Ogni riga dovrebbe essere seguita da newline. La prima riga deve essere "Mi ama ...". L'ultima riga ("Loves me" o "Loves me not") dovrebbe terminare con un punto esclamativo o un singolo punto, rispettivamente. Dopo l'ultima riga, devi generare un cuore ( <3) o un cuore spezzato ( </3) nella nuova riga, a seconda che "Mi ami!" o "Non mi ama." è stata l'ultima frase.

Sono consentiti spazi vuoti finali.

Esempio di output

Produzione:

Mi ama ...
Non
mi
ama ...
Mi ama ... Non mi ama ... Mi ama!
<3

Un'altra uscita:

Mi ama ...
Non
mi
ama ... Mi ama ... Non mi ama.
</ 3

Questo è il , quindi vince l'ingresso più corto!

Inoltre, la mia prima sfida :) Buona fortuna!


Esistono restrizioni sulla distribuzione del numero di linee, ovvero dovrebbe essere uniformemente casuale o è sufficiente che tutte le lunghezze comprese tra 3 e 20 abbiano una probabilità positiva?
Zgarb,

Non ci ho pensato, ma direi che qualsiasi distribuzione va bene, quindi non devono essere uniformemente casuali.
Matthew Rock

È da 3 a 20 ( [3, 20)) o da 3 a 20 ( [3, 20]) inclusi ?
orlp,

1
@MatthewRock Cosa succede se la lingua che vogliamo utilizzare non può eseguire il seeding di un numero casuale da solo? L'utente può fornire un seme casuale?
mınxomaτ,

3
@minxomat Qualunque cosa, è solo un gioco. Dai, ho cambiato le regole.
Matthew Rock

Risposte:


23

Pyth, 54 53 51 50 48 byte

pj+*3\.bm+W~!Z"Loves me"" not"+3O18@".!"Z%hZ"</3

%2tWZ"<</33per la stampa del cuore salva 1. Non convinto che questo sia il modo migliore però.
FryAmTheEggman,

@FryAmTheEggman Ha fatto risparmiare due.
orlp,

Unire le ultime due stringhe insieme ne salva un'altra, ma ho dovuto tornare alla mia %.
FryAmTheEggman,

@".!"Z%hZ"</3salva due byte
Jakube,

Dal momento che non ci sono entrate da alcuni giorni, sto accettando questa risposta. Congratulazioni!
MatthewRock,

23

CJam, 53 50 49 byte

Grazie a Dennis per aver salvato 1 byte.

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

Provalo qui.

Spiegazione

Il codice scarica semplicemente la stringa in bit e pezzi nello stack, che viene stampato automaticamente alla fine del programma:

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.

si potrebbe immaginare che CJam sarebbe stato sviluppato esclusivamente per code-golf ^^
larkey,

11
@larkey ma è ...
MatthewRock,

@larkey CJam deriva da GolfScript e GolfScript (come suggerisce il nome) è progettato per il golf.
Chris Jester-Young,

@ ChrisJester-Young è stato un po '
ironico

17

Brainfuck, 2766 byte (attualmente non valido)

Solo perché. Aggiungerò una versione non giocata più tardi.

Codice

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

pseudocodice

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"

Campione

Quando eseguito, il programma entra in una sessione interattiva in attesa di input. L'input dovrebbe essere un numero. Questo numero è usato come seme.

Seme: 1 (il numero casuale è 5, richiede 218.168.042 operazioni)

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

Seme: 3 (il numero casuale è 20, richiede 463.253.048 operazioni)

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

Suggerirei di non eseguire il seeding 6, poiché sono necessarie 2,105,900,375iterazioni per calcolare il risultato :).

Compilazione / esecuzione

Hai bisogno di un interprete veloce per questo. Nessun interprete online che ho provato potrebbe gestire la velocità di esecuzione. Ips (iterazioni al secondo) dovrebbe essere maggiore di 100,000,000. Quindi ho trovato un'altra soluzione.

Questo è un compilatore da Brainfuck a C scritto in Brainfuck. Puoi usare qualsiasi interprete online per tradurre il mio codice in puro C. Suggerisco di usare brainfuck.tk . Incolla il mio codice nell'input stdin, oltre questo codice nell'input del codice:

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

Scarica il sorgente e compilarlo:

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

Puoi anche eseguire una copia del codice C online qui: via. CodingGround .

ottimizzazioni

C'è ancora del lavoro da fare, ma il riutilizzo delle celle è quasi ottimale.

Osservazioni

Puoi usare parole o frasi come seme:

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

3
+1 per l'audacia di scrivere un PRNG in Brainfuck ...
AdmBorkBork

@TimmyD Esistono modi migliori per scrivere PRNG in BF, ma la maggior parte di essi è basata sul tempo (eseguire il programma e interrompere l'esecuzione ad un certo punto, quindi leggere la memoria), ma ciò richiederebbe l'interazione dell'utente e due programmi separati, il che è contrario le regole.
mınxomaτ,

3
Bello pseudocodice. Più persone dovrebbero farlo, soprattutto perché metà delle lingue del golf sono praticamente illeggibili se non le conosci.
The_Basset_Hound il

3
Purtroppo il tuo output è sbagliato. L'ultimo "Ama me" dovrebbe terminare con un punto esclamativo (quindi "Ama me!"), E "Ama me non" dovrebbe terminare con un singolo punto ("Ama me non.").
Matthew Rock

1
Possiamo avere uno pseudocodice dell'RNG?
Decadimento beta

7

Javascript (ES6), 119 104 99 98 byte

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

Buona! Potrebbe essere più breve usare la concatenazione di stringhe per creare il cuore, e possibilmente nella creazione di ciascuna linea. Ti dispiace se uso il new Datetrucco nella mia risposta?
ETHproductions

@ETHproductions Provaci, fintanto che stai bene con me usando quei cuori haha ​​(e perché non ho usato l'avviso ... per qualche ragione mi sono convinto che le funzioni delle frecce sarebbero più brevi, ma la necessità di tornare nega che .. .). In realtà l'ho appena portato a 104 ora con alcuni altri trucchi =)
Mwr247

Dang ... bel lavoro :) Continuo a riordinare il mio, ma
finisco

La svolta per me è stata la combinazione della variabile lunghezza / iterazione concatenando all'indietro e definendo i cuori nell'inizializzazione. L'ho provato qualche tempo fa con pochi risparmi, ma la tua semplificazione del cuore l'ha resa molto più efficiente.
Mwr247,

Aspetta un minuto ... Provando questo, ho capito Loves me not... Loves me... Loves me not! <3e Loves me not... Loves me... Loves me not... Loves me. </3. Penso che dovrai risolvere uno dei condizionali per risolvere questo problema. EDIT: Oh, basta cambiare la ''e ' not'nella quarta riga.
ETHproductions

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]

Utilizza from random import*invece di import randome randintinvece di randrangesalvare pochi byte. Probabilmente ci sono ancora alcuni byte per giocare a golf.


3
L'alternanza "LLoovveess mmee n o t"[i%2::2].strip()sembra inutilmente complicata. Non puoi farlo "Loves me"+~i%2*" not"?
xnor

Anche ["Loves me","Loves me not"][i%2]è più ottimale, dal momento che stai sprecando caratteri .strip()e un paio di spazi. Ma sì, usa il codice di
xnor

6

Javascript (ES6), 110 102 byte

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

Questa è stata una piccola ma divertente sfida. Potrebbe essere possibile accorciare di più. Grazie a Mwr247 per alcuni trucchi per risparmiare byte!

Versione alternativa utilizzando repeat(), 105 byte:

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

Darn JS 5 + -char nomi incorporati. Oh bene. Suggerimenti benvenuti!


Impressionante condensazione. Sono curioso però, perché il 18+3|0?
Mwr247,

@ Mwr247 Oh, duh, era di quando l'ho usato Math.random(). Immagino che non sia necessario ora.
ETHproductions

5

Perl, 85

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

5

Rubino, 91 byte

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

5

Lisp comune 106 104 byte

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

Funziona solo su lisps che non controllano una sequenza corretta (es. Cmucl, sbcl, clisp) ccl verificherà la circolarità e gli errori al livello di sicurezza predefinito. ecl eseguirà il loop per sempre.

Spiegazione:

#1=(1 0 . #1#)genera un elenco circolare contenente 1e 0ed subseqè usato per creare un elenco di lunghezza [3,20] (questa è l'unica parte non portatile, poiché subseqè richiesto solo dallo standard per lavorare su elenchi corretti (cioè non circolari)).

Il nostro formato è ora operativo su un elenco 1 0 1 0...di lunghezza [3,20]

Spiegazione delle formatdirettive:

~{ scorre su questo elenco

~[seguito da un numero qualsiasi di ~;e terminato con ~]selezionerà l'ennesimo elemento, in base al valore dell'argomento format. Questo è usato qui in modo che il primo oggetto di un ~[caso sia il caso "non mi ami" e il secondo il caso "non mi ami". Si noti che con ~[un separatore di si ~:;seleziona un caso predefinito.

~#[funziona come ~[tranne l'argomento è il numero di argomenti rimanenti. 0 argomenti rimanenti significa che siamo alla fine, il caso predefinito è di stampare...

~:* esegue il backup dell'elenco degli argomenti di una posizione, che ci consente di stampare il trailer corretto.


1
Questo è stato uno sforzo di gruppo da parte del canale IRC #lisp. Mille grazie a phf per l'intelligente stringa di formato iterativa e l'hack subseq.
Jason,

4

Julia, 98 byte

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

4

Shell UNIX, 193 byte

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

4

Java, 210 209 203 200 177 byte

  • lanciato i%2==0ai%2<1
  • { ... }parentesi graffe tagliate per for-loop, spostata la edichiarazione in loop
  • riordinati condizionali
  • rimossi modificatori e parentesi non necessarie, rielaborato Randomutilizzo e incremento peri

Nota: newline viene aggiunto di seguito per la formattazione su questo sito, il conteggio sopra è per una singola riga.

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")));
    }
}

1
È possibile salvare 13 byte rimuovendo il pubblico.
Luminoso

@Luminoso dovrò comunque conservare quello per main()...
hjk

@TimmyD Secondo.
RK.

4

C, 123, 121, 109 106 caratteri (108 byte)

(con un po 'di barare ♥♥♥ ♥♥♥)

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"));}

C'è anche un punto Unicode a cuore spezzato in 1f494, ma ho avuto difficoltà a trovare un carattere che lo implementa.


Ciò mostra 120 caratteri e 122 byte ...
AdmBorkBork,

1
Non penso che sia necessario O=0, perché Cl'inizializzazione automatica di ints 0?
FryAmTheEggman,

@FryAmTheEggman Buona scoperta! In una versione precedente avevo O in main(o,O)cui doveva essere inizializzato.
Jens,

Carino mi piace! Non pensavo di usare timeun numero casuale ... Intelligente!
Matthew Rock

@MatthewRock Se ci pensate, tutti gli altri programmi che usano srand(time(0))cambieranno la loro risposta con la stessa frequenza. Lo srand è completamente inutile :-)
Jens

4

Python 2, 161 159 156 144 byte

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]

Sono 39 byte solo per ottenere il numero casuale.

Un grande grazie a muddyfish , fryamtheeggman e orlp per il loro aiuto.

PYG , 109 byte

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])

È possibile eseguire l'istruzione range in un'unica riga. puoi anche fareimport random as r
Blue

puoi anche inserire il contenuto dell'ultima istruzione di stampa nella riga sopra.
Blu

Penso che puoi cambiare print'</3'if i%2 else'<3'in print['<3','</3'][i%2]per salvare 3 byte.
Kade,

Sì davvero posso; Grazie!
Celeo,

Grazie! È interessante notare import random as r;a=r.randrange(3,21)che import random;a=random.randrange(3,21)sono della stessa lunghezza.
Celeo,

3

PowerShell, 121 119 111 byte

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

Modifica: in realtà è più breve da includere esplicitamente "Loves me"anziché dichiarare$l

Edit2 - ho dimenticato che posso golf for()loop tramite pipeline ... durr ...

Non troppo malandato. Utilizza i blocchi di esecuzione del codice inline $(...)per regolare dinamicamente la stringa stampata mentre stiamo for()eseguendo il loop. Si noti che poiché utilizza un implicito Get-davanti Randomper salvare un paio di byte, questo può funzionare molto lentamente su alcune versioni di PowerShell. Riferimento

Espanso di seguito per chiarimenti:

# 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"
}

3

C ++, 210 193 184 168 byte

In C ++ .. perché .. Perché no? :)

#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");}

Vivere: 210 193 184 168

Spero solo che qualcuno dei miei cambiamenti non dipenda dalla piattaforma.

Grazie a Ben Voigt per l'aiuto. Inoltre, grazie a tutti i commenti, sono stati molto utili.


Humn .. realizzo solo i suoi 3 a 20. Lo aggiusterò più tardi. Probabilmente aggiungerà altri 2 byte ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva,

Puoi risparmiare molto sostituendo #define c coute using namespace std;conauto&c=std::cout;
Ben Voigt,

Salvane anche un po 'conint i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt,

Ciao, ho trovato un bug: l'ultima riga dovrebbe essere "Mi ama!", Non "Mi ama".
Matthew Rock

1
Direi che va bene - C e C ++ sono simili. E in questo momento questo codice è più lungo di Java ...
MatthewRock

3

Groovy, 110 byte

Un tipo di amore groovy:

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

2

Python 2, 117 byte

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]

Osserva che ogni Loves me( not)?è seguito da ...una nuova riga, tranne l'ultima. Quindi questo sembra un lavoro per join.


Un po 'in ritardo ma ".!\n\n<</33"[n%2::2]è più breve di 2 byte.
FryAmTheEggman,

@FryAmTheEggman Sì, l'ho visto ma ho deciso di non rubarlo da Loovjo. Nel frattempo, qualcun altro ha pubblicato esattamente quella soluzione. [scrollata di spalle]
DLosc,

Non avevo notato che qualcun altro lo stava postando, ma sono abbastanza sicuro che il mio commento sia stato il primo a inserirlo, quindi puoi usarlo se vuoi: P
FryAmTheEggman

2

R, 141 132 128 114 111 109 byte

Codice

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)

Mi sono ispirato al codice di Eric Brooks .

Modifica 1: ora il codice emette correttamente l'ultima punteggiatura come sottolineato da Martin
Modifica 2: ha cambiato il ciclo for in uno sapply e ha incluso i cuori all'interno dell'ultima stringa di riga.
Modifica 3: rimosso {}e modificato +(x==k)*2in +2*!x<k
Modifica 4: Torna a per ciclo e rimosso ()da (i%%2)+1
Modifica 5: Scritto me4 volte e rimosso ilsep=""


1

R, 119 111 105 byte

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"))

Modifiche 1,2: La codifica esplicita delle due opzioni consente di risparmiare spazio.


1
È possibile salvare un byte utilizzando =per assegnazione anziché <-e un'altra eseguendo x%%2>0al posto di x%%2==1. Si noti inoltre che questo non gestisce correttamente l'ultima riga; ci dovrebbe essere un .o !piuttosto che .... (Vedi l'output di esempio nella domanda.)
Alex A.

1
@Alex A. Non è nemmeno necessario x%%2>0; solox%%2
Flounderer,

Buoni punti, grazie. Devo tornare indietro e aggiustare il finale
Eric Brooks,

1

C 226 byte

#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)?"":"/");}

(Con formattazione)

#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;
}

1
Rimuovere il tipo restituito da main (-5 byte), rendere i e j globali con il tipo predefinito (-8 byte, -3 in più a causa del valore predefinito 0 in j), utilizzare 0 anziché NULL (-3). Altre cose: usa solo una variabile e fai il conto alla rovescia del ciclo forse. L'importazione di stdio non è in genere necessaria durante il golf.
Aragaer,

1

Python 2, 115 byte

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]

1

PHP, 191 187 146 165 byte

$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 byte per pyth e cjam ... wow :)


Modificato da $ i% 2 == 0 a $ i% 2 <1 (x2) e $ i% 2! = Da 0 a $ i% 2> 0 (x2)
Marek Bettman,

risulta che gli operatori ternari non sono la migliore risposta in ogni momento :)
Marek Bettman,

1

mSL, 178 176 156 154 byte

Modifica 1: modificato == 0in < 1
Modifica 2: rimosso spazi bianchi non necessari, grazie AlexA!
Modifica 3: parentesi rimosse

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)
}

1
La tua soluzione è attualmente di 176 byte, non 177. È necessario tutto lo spazio bianco? In caso contrario, è possibile abbreviare il codice di un importo significativo semplicemente rimuovendo gli spazi bianchi non necessari.
Alex A.

@AlexA. Oh, non so perché ho scritto 177, e grazie per aver sottolineato la necessità di spazi bianchi, non è davvero necessario!
Denny,

1

Perl, 97 byte

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

Versione leggibile:

$_="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

1

Hassium , 265 byte

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");}}

La risposta è stata giocata a golf.


La soluzione è attualmente 458 byte , non 523. È possibile migliorare il tuo punteggio rimuovendo spazio bianco inutile e abbreviando i nomi delle variabili. Vedi l'altra soluzione Hassium per esempi.
Alex A.

1
Come ho notato nell'altra risposta Hassium, il generatore di numeri casuali sembra essere estremamente distorto. L'ho eseguito 500 volte con l'ultima versione e ne ho ottenute solo due </3.
Dennis,

+ Dennis Il generatore casuale è costruito direttamente sopra il generatore di numeri casuali C #. Vedi: github.com/HassiumTeam/Hassium/blob/master/src/Hassium/…
Jacob Misirian,

3
Non sembra essere seminato correttamente. Se eseguo rnd = new Random();rnd.next(0,2);1000 volte, la distribuzione è OK. Tuttavia, se eseguo rnd = new Random();una volta e rnd.next(0,2);1000 volte, ottengo sempre esattamente 533 se 0467 1s.
Dennis,

1

C # (160)

Il codice si ispira alla risposta di HJK , il merito va a lui.

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")));
    }
}

1

Lua, 137 132 byte

Probabilmente si può giocare a golf molto di più, ma eccolo qui per ora:

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

Spiegazione del codice e non golfato:

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

Modifica: eliminato alcuni spazi bianchi.



1

PowerShell , 85 88 byte

+3 byte grazie Veskah: è un buon punto.

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

Provalo online!


1
Questo può generare "Loves me, Loves me not </ 3", che, in base a come leggo le specifiche, è inferiore al numero minimo di righe.
Veskah,

Anzi of *3* to 20 lines inclusive. Grazie!
mazzy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.