M'aime, ne m'aime pas

45

M'aime, ne m'aime pas

Ce jeu pour enfants simple est vieux, mais toujours populaire. Puisque nous vivons au 21ème siècle maintenant, numérisons-le!

spécification

Le programme ne doit prendre aucune entrée, sauf si vous utilisez une langue qui ne peut pas générer une graine aléatoire - dans ce cas, vous êtes autorisé à prendre la graine en tant qu'entrée. Votre tâche consiste à écrire un programme produisant de manière aléatoire un total de 3 à 20 lignes: "Loves me ..." et "Loves me not ..." à tour de rôle, comme dans le jeu (et une ligne supplémentaire; gardez en train de lire).

Cependant, il y a quelques restrictions. Chaque ligne doit être suivie par newline. La première ligne doit être "m'aime ...". La dernière ligne ("Loves me" ou "Loves me not") doit se terminer par un point d'exclamation ou un seul point, respectivement. Après la dernière ligne, vous devez indiquer un cœur ( <3) ou un cœur brisé ( </3) dans la nouvelle ligne, selon que "Loves me!" ou "m'aime pas." était la dernière phrase.

Les espaces de fin sont autorisés.

Exemple de sortie

Sortie:

M'aime ... ne
m'aime pas ...
m'aime ... ne
m'aime pas ...
m'aime!
<3

Une autre sortie:

M'aime ... ne
m'aime pas ...
m'aime ... ne
m'aime pas
</ 3

C'est le , donc l'entrée la plus courte gagne!

Aussi, mon premier défi :) Bonne chance!

MatthewRock
la source
Existe-t-il des restrictions sur la distribution du nombre de lignes, c'est-à-dire, faut-il que ce soit uniformément aléatoire ou est-il suffisant que toutes les longueurs comprises entre 3 et 20 aient une probabilité positive?
Zgarb
Je n'y avais pas pensé, mais je dirais que toute distribution convient, alors elle n'a pas à être uniformément aléatoire.
MatthewRock
S'agit-il de 3 à 20 ( [3, 20)) ou de 3 à 20 ( [3, 20]) inclus ?
orlp
1
@MatthewRock Que se passe-t-il si la langue que nous voulons utiliser ne peut pas générer un nombre aléatoire par eux-mêmes? L'utilisateur peut-il fournir une graine aléatoire?
mınxomaτ
3
@minxomat Peu importe, c'est juste un jeu. Allez, a changé les règles.
MatthewRock

Réponses:

23

Pyth, 54 53 51 50 48 octets

pj+*3\.bm+W~!Z"Loves me"" not"+3O18@".!"Z%hZ"</3
orlp
la source
%2tWZ"<</33pour le cœur, l'impression économise 1. Pas convaincu que ce soit le meilleur moyen cependant.
FryAmTheEggman
@FryAmTheEggman Fait en sauver deux.
Orlp
La fusion des deux dernières chaînes en économise une autre, mais je devais revenir au mien %.
FryAmTheEggman
@".!"Z%hZ"</3économise deux octets
Jakube
Comme il n'y a pas eu d'entrée depuis quelques jours, j'accepte cette réponse. Toutes nos félicitations!
MatthewRock le
23

CJam, 53 50 49 octets

Merci à Dennis d'avoir sauvegardé 1 octet.

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

Testez-le ici.

Explication

Le code dépose simplement la chaîne en morceaux sur la pile, qui est automatiquement imprimée à la fin du programme:

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
la source
on pourrait imaginer que CJam aurait été développé exclusivement pour le code-golf ^^
larkey
11
@larkey mais c'est ...
MatthewRock
@larkey CJam est dérivé de GolfScript, et GolfScript (comme son nom l’indique) est conçu pour le golf.
Chris Jester-Young
@ ChrisJester-Young c'était un peu
ironique
17

Brainfuck, 2766 octets (actuellement non valide)

Juste parce que. J'ajouterai une version sans golf plus tard.

Code

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

Pseudocode

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"

Échantillon

Lorsqu'il est exécuté, le programme entre dans une session interactive en attente de saisie. L'entrée devrait être un nombre. Ce numéro est utilisé comme une graine.

Graine: 1 (le nombre aléatoire est 5, prend 218,168,042 opérations)

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

Graine: 3 (le nombre aléatoire est 20, prend 463,253,048 opérations)

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

Je suggérerais de ne pas semer avec 6, car il faut des 2,105,900,375itérations pour calculer le résultat :).

Compilation / exécution

Vous avez besoin d'un interprète rapide pour cela. Aucun interprète en ligne que j'ai testé ne pouvait gérer la vitesse d'exécution. Les ips (itérations par seconde) devraient être plus que 100,000,000. Alors je suis venu avec une autre solution.

Ceci est un compilateur Brainfuck to C écrit en Brainfuck. Vous pouvez utiliser n’importe quel interprète en ligne pour transpiler mon code en C pur. Je suggère d’utiliser brainfuck.tk . Collez mon code dans l'entrée stdin, après ce code dans l'entrée de code:

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

Téléchargez le source et compilez-le:

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

Vous pouvez également exécuter une copie du code C en ligne ici: via. CodingGround .

Optimisations

Il reste encore du travail à faire, mais la réutilisation des cellules est presque optimale.

Remarques

Vous pouvez utiliser des mots ou des phrases comme une graine:

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τ
la source
3
+1 pour avoir l'audace d'écrire un PRNG dans Brainfuck ...
AdmBorkBork
@TimmyD Il existe de meilleurs moyens d'écrire des PRNG dans BF, mais la plupart d'entre eux sont basés sur le temps (exécutez le programme et arrêtez l'exécution à un moment donné, puis lisez la mémoire), mais cela nécessiterait une interaction de l'utilisateur et deux programmes distincts, ce qui est contraire. les règles.
mınxomaτ
3
Joli pseudocode. Plus de gens devraient le faire, surtout que la moitié des langues de golf sont fondamentalement illisibles si vous ne les connaissez pas.
The_Basset_Hound
3
Malheureusement, votre sortie est fausse. Dernier "Loves me" devrait se terminer par un point d’exclamation (donc "Loves me!"), Et "Loves me not" devrait se terminer par un point ("Loves me not.").
MatthewRock le
1
Peut-on avoir un pseudocode du RNG?
Beta Decay
7

Javascript (ES6), 119 104 99 98 octets

for(i=new Date%18+3,s=i&1?`!
<3`:`.
</3`;i--;)s=`...
Loves me`+(i&1?' not':'')+s
alert(s.slice(4))
Mwr247
la source
Bon un! Il peut être plus court d’utiliser la concaténation de chaînes pour créer le cœur, et éventuellement dans la création de chaque ligne. Ça vous dérange si j'utilise le new Datetruc dans ma réponse?
ETHproductions
@ETHproductions Allez-y, tant que ça vous va d'utiliser ces cœurs haha ​​(et pourquoi n'ai-je pas utilisé alert ... pour une raison quelconque, je me suis dit que les fonctions de flèche seraient plus courtes, mais que le retour oblige à nier cela .. .) En fait, je viens tout juste d’en avoir 104 à présent avec quelques autres tricks =)
Mwr247
Dang ... bon travail :) Je n'arrête pas de réarranger le mien, mais je
finis
Pour moi, la percée consistait à combiner la variable longueur / itération en concaténant en arrière et à définir les coeurs lors de l'initialisation. Je l'ai essayé il y a quelque temps avec de petites économies, mais votre simplification cardiaque l'a rendu beaucoup plus efficace.
Mwr247
Attendez une minute ... Essayer, je reçois Loves me not... Loves me... Loves me not! <3et Loves me not... Loves me... Loves me not... Loves me. </3. Je pense que vous devrez changer l'un des conditionnels pour résoudre ce problème. EDIT: Oh, il suffit de changer le ''et ' not'dans la quatrième ligne.
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]

Utilise le from random import*au lieu de import randomet randintau lieu de randrangesauvegarder quelques octets. Il reste probablement quelques octets pour jouer au golf.

Loovjo
la source
3
L'alternance "LLoovveess mmee n o t"[i%2::2].strip()semble inutilement compliquée. Tu ne peux pas faire juste "Loves me"+~i%2*" not"?
xnor
Même ["Loves me","Loves me not"][i%2]est plus optimal, puisque vous gaspillez maintenant des caractères .strip()et quelques espaces. Mais oui, utilisez le code de
xnor
6

Javascript (ES6), 110 102 octets

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

C'était un petit défi court mais amusant. Il peut être possible de raccourcir davantage. Merci à Mwr247 pour quelques astuces pour économiser des octets!

Version alternative utilisant repeat()105 octets:

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 noms intégrés. Tant pis. Suggestions bienvenues!

ETHproductions
la source
Condensation impressionnante. Je suis curieux cependant, pourquoi le 18+3|0?
Mwr247
@ Mwr247 Oh, duh, c'est à partir de quand j'ai utilisé Math.random(). Je suppose que ce n'est pas nécessaire maintenant.
ETHproductions
5

Perl, 85

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

Ruby, 91 octets

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

Common Lisp 106, 104 octets

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

Cela ne fonctionne que sur les listes qui ne vérifient pas une séquence correcte (par exemple, cmucl, sbcl, clisp). Ccl vérifie la circularité et les erreurs au niveau de sécurité par défaut. ecl sera en boucle pour toujours.

Explication:

#1=(1 0 . #1#)génère une liste circulaire contenant 1et 0et subseqest utilisé pour créer une liste de longueur [3,20] (il s'agit de la seule partie non portable, comme le subseqprévoit uniquement la norme pour pouvoir travailler sur des listes appropriées (c'est-à-dire non circulaires)).

Notre format fonctionne maintenant sur une liste 1 0 1 0...de longueur [3,20]

Explication des formatdirectives:

~{ itère sur cette liste

~[suivi d'un nombre quelconque ~;et terminé par ~]sélectionnera le Nième élément, en fonction de la valeur de l'argument de format. Ceci est utilisé ici pour que le premier élément d'un ~[sera le cas "m'aime pas" et le second le cas "m'aime". Notez que avec ~[un séparateur de ~:;sélectionne un cas par défaut.

~#[fonctionne comme ~[si l'argument est le nombre d'arguments restants. 0 argument restant signifie que nous sommes à la fin, le cas par défaut est d'imprimer...

~:* sauvegarde la position d’une liste d’arguments, ce qui nous permet d’imprimer la bonne bande-annonce.

Jason
la source
1
Il s’agissait d’un effort collectif du canal IRC #lisp. Merci beaucoup à phf pour la chaîne de format intelligente et le hack subsq.
Jason
4

Julia, 98 octets

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.
la source
4

Shell UNIX, 193 octets

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
la source
4

Java, 210 209 203 200 177 octets

  • retourné i%2==0ài%2<1
  • parés { ... }accolades pour for-loop, propose la edéclaration de boucle
  • conditionnels réordonnés
  • Suppression des modificateurs et des parenthèses inutiles, Randomutilisation repensée et incrémentationi

Remarque: la nouvelle ligne est ajoutée ci-dessous pour le formatage sur ce site. Le nombre indiqué ci-dessus correspond à une seule ligne.

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
la source
1
Vous pouvez économiser 13 octets en supprimant public.
Lumineux
@ Luminous, il me faudra quand même conserver celui-là main()...
hjk
@TimmyD J'approuve cela.
RK.
4

C, 123, 121, 109 106 caractères (108 octets)

(avec un peu de tricherie ♥♥♥ ♥♥♥)

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

Il existe également un point Unicode au cœur brisé situé à 1f494, mais j’ai eu du mal à trouver une police qui le mette en œuvre.

Jens
la source
Cela montre 120 caractères et 122 octets ...
AdmBorkBork
1
Je ne pense pas que vous ayez besoin O=0, car l' Cauto-initialisation des ints 0?
FryAmTheEggman le
@FryAmTheEggman Bonne trouvaille! Dans une version précédente, j'avais O dans main(o,O)lequel il devait être initialisé.
Jens
Bien j'aime ça! Je n'avais pas pensé à utiliser timeun nombre aléatoire ... Intelligent!
MatthewRock
@ MatthewRock Si vous y réfléchissez, tous les autres programmes utilisant srand(time(0))changeront leur réponse avec la même fréquence. Le srand est complètement inutile :-)
Jens
4

Python 2, 161 159 156 144 octets

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]

C'est 39 octets juste pour obtenir le nombre aléatoire.

Un grand merci à Muddyfish , fryamtheeggman et orlp pour leur aide.

PYG , 109 octets

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
la source
Vous pouvez faire la déclaration de distance sur une seule ligne. vous pouvez aussi le faireimport random as r
Bleu
vous pouvez également mettre le contenu de la dernière déclaration d'impression sur la ligne ci-dessus.
Bleu le
Je pense que vous pouvez changer print'</3'if i%2 else'<3'pour print['<3','</3'][i%2]sauver 3 octets.
Kade
Oui en effet je peux; Merci!
Celeo
Merci! Fait intéressant, import random as r;a=r.randrange(3,21)et import random;a=random.randrange(3,21)ont la même longueur.
Celeo
3

PowerShell, 121 119 111 octets

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

Edit - en fait plus court pour inclure explicitement "Loves me"plutôt que de déclarer$l

Edit2 - J'ai oublié que je peux jouer au golf en for()boucle ... durr ...

Pas trop mal. Utilise des blocs d'exécution de code en ligne $(...)pour ajuster de manière dynamique la chaîne imprimée lorsque nous sommes en for()boucle. Notez que, dans la mesure où il utilise implicitement Get-avant Randompour enregistrer quelques octets, il est possible que cela fonctionne extrêmement lentement sur certaines versions de PowerShell. Référence

Développé ci-dessous pour clarification:

# 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
la source
3

C ++, 210 193 184 168 octets

En C ++ .. parce que .. Pourquoi pas? :)

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

Vivre: 210 193 184 168

Espérons que mes modifications ne dépendent pas de la plate-forme.

Merci à Ben Voigt pour l'aide. De plus, grâce à tous les commentaires, ils ont été très utiles.

Wendelbsilva
la source
Humn .. viens de me rendre compte de 3 à 20. Je vais régler ça plus tard. Probablement ajoutera 2 octets de plus ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva
Vous pouvez économiser beaucoup en remplaçant #define c coutet using namespace std;parauto&c=std::cout;
Ben Voigt
Également en économiser avecint i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt
Bonjour, j'ai trouvé un bug: la dernière ligne devrait être "m'aime!", Pas "m'aime".
MatthewRock
1
Je dirais que ça va - C et C ++ sont similaires. Et pour le moment, ce code est plus long que Java ...
MatthewRock
3

Groovy, 110 octets

Un genre d'amour groovy:

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
la source
2

Python 2, 117 octets

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]

Observez que tous Loves me( not)?sont suivis de ...et d’une nouvelle ligne, à l’exception de la dernière. Donc, cela ressemble à un travail pour join.

DLosc
la source
Un peu tard mais ".!\n\n<</33"[n%2::2]2 octets plus court.
FryAmTheEggman le
@FryAmTheEggman Oui, j'ai vu cela, mais j'ai décidé de ne pas le voler à Loovjo. En attendant, quelqu'un d'autre a posté exactement cette solution. [haussement d'épaules]
DLosc
Je n'avais pas remarqué que quelqu'un d'autre le publiait, mais je suis presque sûr que mon commentaire était le premier à le
contenir
2

R, 141 132 128 114 111 111 109 octets

Code

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)

Je me suis inspiré du code d' Eric Brooks .

Éditer 1: le code affiche correctement la dernière ponctuation indiquée par Martin
Éditer 2: modifiez la boucle for en une sapply et incluez les cœurs dans la dernière chaîne.
Éditer 3: Supprimé {}et modifié +(x==k)*2en +2*!x<k
Édition 4: Retour à la boucle for et enlevé ()de (i%%2)+1
Éditer 5: Écrit me4 fois et enlevé lesep=""

Mutador
la source
1

R, 119 111 105 octets

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

Éditions 1,2: Coder les deux options de manière explicite est un gain de place.

Eric Brooks
la source
1
Vous pouvez sauvegarder un octet en utilisant =pour l'affectation plutôt qu'un <-autre en faisant x%%2>0à la place de x%%2==1. Notez également que cela ne gère pas correctement la dernière ligne; il devrait y avoir un .ou !plutôt que .... (Voir l'exemple de sortie dans la question.)
Alex A.
1
@ Alex A. Vous n'avez pas besoin non x%%2>0plus; justex%%2
Flounderer
Bons points, merci. Je dois y retourner et réparer la fin
Eric Brooks
1

C 226 octets

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

(Avec mise en forme)

#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
la source
1
Supprime le type de retour de main (-5 octets), rend i et j globaux avec le type par défaut (-8 octets, -3 de plus à cause de la valeur par défaut 0 en j), utilisez 0 au lieu de NULL (-3). Autres choses - utilisez une seule variable et faites peut-être le compte à rebours de la boucle. La stdio d'importation n'est généralement pas nécessaire pour jouer au golf.
aragaer
1

Python 2, 115 octets

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
la source
1

PHP, 191 187 146 165 octets

$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 octets pour pyth et cjam ... wow :)

Marek Bettman
la source
Changé $ i% 2 == 0 en $ i% 2 <1 (x2) et $ i% 2! = 0 en $ i% 2> 0 (x2)
Marek Bettman
s'avère que les opérateurs ternaires ne sont pas la meilleure réponse à tout moment :)
Marek Bettman
1

mSL, 178 176 156 154 octets

Modifier 1: modifié == 0pour < 1
modifier 2: Suppression des espaces inutiles, merci AlexA!
Edition 3: parenthèses supprimées

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
la source
1
Votre solution est actuellement de 176 octets, et non de 177. Tous les espaces sont-ils nécessaires? Sinon, vous pourriez raccourcir considérablement votre code en supprimant simplement les espaces inutiles.
Alex A.
@Alexa. Oh, je ne sais pas pourquoi j'ai écrit 177, et merci d'avoir souligné la nécessité des espaces, c'est en effet inutile!
Denny
1

Perl, 97 octets

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

Version lisible:

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

Hassium , 265 octets

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 réponse a été golfée.

Jacob Misirian
la source
Votre solution est actuellement de 458 octets , et non de 523. Vous pouvez améliorer votre score en supprimant les espaces inutiles et en raccourcissant les noms de variables. Voir l’autre solution Hassium pour des exemples.
Alex A.
1
Comme je l'ai noté dans l'autre réponse de Hassium, le générateur de nombres aléatoires semble extrêmement biaisé. J'ai couru ces 500 fois avec la dernière version et n'en ai eu que deux </3.
Dennis
+ Dennis Le générateur Random est construit directement sur le générateur de nombres aléatoires C #. Voir: github.com/HassiumTeam/Hassium/blob/master/src/Hassium/…
Jacob Misirian, le
3
Il ne semble pas se semer correctement. Si j'exécute rnd = new Random();rnd.next(0,2);1000 fois, la distribution est OK. Cependant, si j'exécute rnd = new Random();une fois et rnd.next(0,2);1000 fois, j'obtiens toujours exactement 533 0s et 467 1s.
Dennis
1

C # (160)

Le code est inspiré par la réponse de hjk , le crédit lui revient.

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
la source
1

Lua, 137 132 octets

On peut probablement jouer beaucoup plus au golf, mais le voici pour le moment:

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

Explication de code et non golfée:

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: coupé quelques espaces.

TreFox
la source
1

Gelée , 55 octets (non compétitif?)

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

Essayez-le en ligne!

Comme d'habitude, Jelly suce avec des ficelles.

Erik l'Outgolfeur
la source
1

PowerShell , 85 88 octets

+3 octets merci Veskah: C'est un bon point.

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

Essayez-le en ligne!

mazzy
la source
1
Cela peut générer "m'aime, ne m'aime pas </ 3", ce qui, selon la façon dont je lis les spécifications, est inférieur au nombre minimal de lignes.
Véska
En effet of *3* to 20 lines inclusive. Merci!
Mazzy