Kocha mnie, nie kocha mnie

45

Kocha mnie, Kocha mnie nie

Ta prosta gra dla dzieci jest stara, ale wciąż popularna. Ponieważ żyjemy teraz w 21 wieku, dokonajmy digitalizacji!

Specyfikacja

Program nie może pobierać danych wejściowych, chyba że używasz języka, który nie może wygenerować losowego materiału źródłowego - w takim przypadku możesz wziąć dane źródłowe jako dane wejściowe. Twoim zadaniem jest napisanie programu, który wygeneruje losowo łącznie 3 do 20 wierszy łącznie: „Kocha mnie ...” i „Kocha mnie nie ...” po kolei, jak w grze (i jedna dodatkowa linia; zachowaj czytanie).

Istnieją jednak pewne ograniczenia. Po każdej linii powinna następować nowa linia. Pierwszy wiersz musi brzmieć „Loves me ...”. Ostatni wiersz („Loves me” lub „Loves me not”) powinien kończyć się odpowiednio wykrzyknikiem lub pojedynczą kropką. Po ostatnim wierszu musisz wypisać serce ( <3) lub złamane serce ( </3) w nowym wierszu, w zależności od tego, czy „Loves me!” lub „Nie kocha mnie”. było ostatnie zdanie.

Końcowe białe znaki są dozwolone.

Przykładowy wynik

Wynik:

Kocha mnie ...
Kocha mnie nie ...
Kocha mnie ...
Kocha mnie nie ...
Kocha mnie!
<3

Kolejne wyjście:

Kocha mnie ...
Kocha mnie nie ...
Kocha mnie ...
Kocha mnie nie.
</ 3

To jest , więc wygrywa najkrótszy wpis!

Także moje pierwsze wyzwanie :) Powodzenia!

MatthewRock
źródło
Czy są jakieś ograniczenia w rozkładzie liczby linii, tj. Czy powinien on być jednolicie losowy, czy wystarczy, aby wszystkie długości między 3 a 20 miały dodatnie prawdopodobieństwo?
Zgarb
Nie myślałem o tym, ale powiedziałbym, że każda dystrybucja jest w porządku - więc nie muszą być jednolicie losowe.
MatthewRock
Czy to 3 do 20 ( [3, 20)) czy 3 do 20 ( [3, 20])?
lub
1
@MatthewRock Co zrobić, jeśli język, którego chcemy używać, nie może samodzielnie wygenerować losowej liczby? Czy użytkownik może podać losowy materiał siewny?
mınxomaτ
3
@minxomat Cokolwiek, to tylko gra. Dalej, zmieniłem zasady.
MatthewRock

Odpowiedzi:

23

Pyth, 54 53 51 50 48 bajtów

pj+*3\.bm+W~!Z"Loves me"" not"+3O18@".!"Z%hZ"</3
orlp
źródło
%2tWZ"<</33oszczędza druk serca 1. Nie jestem przekonany, że to najlepszy sposób.
FryAmTheEggman
@FryAmTheEggman Sprawiło, że uratował dwa.
lub
Scalenie dwóch ostatnich ciągów razem oszczędza kolejny, ale musiałem wrócić do siebie %.
FryAmTheEggman
@".!"Z%hZ"</3zapisuje dwa bajty
Jakube
Ponieważ od kilku dni nie było żadnego wpisu, akceptuję tę odpowiedź. Gratulacje!
MatthewRock
23

CJam, 53 50 49 bajtów

Dzięki Dennisowi za zaoszczędzenie 1 bajtu.

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

Sprawdź to tutaj.

Wyjaśnienie

Kod po prostu zrzuca ciąg w kawałkach na stos, który jest drukowany automatycznie na końcu programu:

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
źródło
można sobie wyobrazić, że CJam zostałby opracowany wyłącznie dla golfa
kodowego
11
@larkey, ale to jest ...
MatthewRock
@larkey CJam pochodzi z GolfScript, a GolfScript (jak sama nazwa wskazuje) jest przeznaczony do gry w golfa.
Chris Jester-Young
@ ChrisJester-Young to było trochę język w policzek ;-)
larkey
17

Brainfuck, 2766 bajtów (obecnie nieprawidłowy)

Właśnie dlatego. Później dodam wersję bez golfa.

Kod

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

Pseudo kod

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"

Próba

Po uruchomieniu program wchodzi w interaktywną sesję oczekującą na dane wejściowe. Dane wejściowe powinny być liczbą. Ta liczba jest używana jako ziarno.

Seed: 1 (losowa liczba to 5, zajmuje 218 168 042 operacji)

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

Seed: 3 (losowa liczba to 20, zajmuje 463 253 048 operacji)

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

Sugeruję, abyś nie używał nasion 6, ponieważ 2,105,900,375obliczenia wyniku wymagają iteracji :).

Kompilowanie / uruchamianie

Potrzebujesz do tego szybkiego tłumacza. Żaden testowany przeze mnie interpreter online nie byłby w stanie obsłużyć szybkości wykonywania. Ips (liczba iteracji na sekundę) powinna być większa niż 100,000,000. Więc wymyśliłem inne rozwiązanie.

To jest kompilator Brainfuck to C napisany w Brainfuck. Możesz użyć dowolnego interpretera internetowego do transponowania mojego kodu do czystego C. Sugeruję użycie brainfuck.tk . Wklej mój kod na wejściu stdin, wklej ten kod na wejściu kodu:

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

Pobierz źródło i skompiluj je:

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

Możesz również uruchomić kopię kodu C online tutaj: via. CodingGround .

Optymalizacje

Nadal jest wiele do zrobienia, ale ponowne użycie komórki jest prawie optymalne.

Uwagi

Możesz użyć słów lub wyrażeń jako materiału siewnego:

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τ
źródło
3
+1 za śmiałość napisania PRNG w Brainfuck ...
AdmBorkBork
@TimmyD Istnieją lepsze sposoby pisania PRNG w BF, ale większość z nich jest oparta na czasie (uruchom program i zatrzymaj wykonywanie w pewnym momencie, a następnie odczytaj pamięć), ale wymagałoby to interakcji użytkownika i dwóch oddzielnych programów, co jest przeciwne zasady.
mınxomaτ
3
Niezły pseudokod. Więcej osób powinno to zrobić, zwłaszcza że połowa języków golfowych jest w zasadzie nieczytelna, jeśli ich nie znasz.
The_Basset_Hound
3
Niestety Twoje dane wyjściowe są nieprawidłowe. Ostatni „Loves me” powinien kończyć się wykrzyknikiem (więc „Loves me!”), A „Loves me not” powinien kończyć się pojedynczą kropką („Loves me not.”).
MatthewRock,
1
Czy możemy mieć jakiś pseudokod RNG?
Beta Decay
7

JavaScript (ES6), 119 104 99 98 bajtów

for(i=new Date%18+3,s=i&1?`!
<3`:`.
</3`;i--;)s=`...
Loves me`+(i&1?' not':'')+s
alert(s.slice(4))
Mwr247
źródło
Dobry! Może być krótsze użycie konkatenacji łańcuchów do utworzenia serca i ewentualnie przy tworzeniu każdej linii. Czy może skorzystasz z new Datepodstępu w mojej odpowiedzi?
ETHprodukcje
@ETHproductions Idź na całość, dopóki nie masz nic przeciwko używaniu tych serc haha ​​(i dlaczego nie użyłem alertu ... z jakiegoś powodu przekonałem się, że funkcje strzałek będą krótsze, ale potrzeba powrotu neguje to ... .). Właśnie udało mi się obniżyć do 104 teraz, używając również innych trików =)
Mwr247,
Cholera ... dobra robota :)
Nadal zmieniam kopertę
Przełomem było dla mnie połączenie zmiennej długości / iteracji poprzez połączenie wstecz i zdefiniowanie serc w inicjalizacji. Próbowałem go jakiś czas temu z niewielkimi oszczędnościami, ale twoje uproszczenie serca uczyniło go znacznie bardziej wydajnym.
Mwr247,
Chwileczkę ... Próbuję tego, rozumiem Loves me not... Loves me... Loves me not! <3i Loves me not... Loves me... Loves me not... Loves me. </3. Myślę, że będziesz musiał zmienić jeden z warunków, aby to naprawić. EDIT: Oh, po prostu przełączyć ''i ' not'w czwartej linii.
ETHprodukcje
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]

Używa from random import*zamiast import randomi randintzamiast, randrangeaby zapisać kilka bajtów. Prawdopodobnie zostało jeszcze kilka bajtów.

Loovjo
źródło
3
Ta zmiana "LLoovveess mmee n o t"[i%2::2].strip()wydaje się niepotrzebnie skomplikowana. Nie możesz po prostu zrobić "Loves me"+~i%2*" not"?
xnor
Nawet ["Loves me","Loves me not"][i%2]jest bardziej optymalny, ponieważ marnujesz teraz znaki .strip()i kilka spacji. Ale tak, użyj kodu
xnor
6

JavaScript (ES6), 110 102 bajtów

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

To było krótkie, ale zabawne małe wyzwanie. Możliwe może być dalsze skrócenie. Dzięki Mwr247 za kilka sztuczek oszczędzających bajty!

Alternatywna wersja repeat(), 105 bajtów:

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 wbudowane nazwy. No cóż. Sugestie mile widziane!

ETHprodukcje
źródło
Imponujące skraplanie. Jestem ciekawy, dlaczego 18+3|0?
Mwr247,
@ Mwr247 Oh, duh, to było od kiedy użyłem Math.random(). Chyba teraz nie jest to konieczne.
ETHproductions
5

Perl, 85

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

Ruby, 91 bajtów

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

Common Lisp 106 104 bajtów

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

Działa to tylko na seplenienie, które nie sprawdza prawidłowej sekwencji (np. Cmucl, sbcl, clisp) ccl sprawdzi, czy ma cykliczność i wystąpi błąd na domyślnym poziomie bezpieczeństwa. ecl zapętli się na zawsze.

Wyjaśnienie:

#1=(1 0 . #1#)generuje listę zawierającą okrągłą 1i 0i subseqjest używany do listy długości [3,20] (to jest tylko część nie przenośny, ponieważ subseqwymagana jest tylko przez standard do pracy na odpowiednich (np nieokrągłych) listy).

Nasz format działa teraz na liście 1 0 1 0...długości [3,20]

Objaśnienie formatdyrektyw:

~{ przechodzi przez tę listę

~[po którym następuje dowolna liczba ~;i zakończona ~]znakiem wybierze Nty element na podstawie wartości argumentu format. Używa się go tutaj, aby pierwszą pozycją w ~[etui była „kocha mnie nie”, a drugą „kocha mnie”. Zauważ, że ~[separatorem ~:;wybiera domyślną wielkość liter.

~#[działa jak ~[z wyjątkiem tego, że argument jest liczbą pozostałych argumentów. 0 pozostałych argumentów oznacza, że ​​jesteśmy na końcu, domyślnym przypadkiem jest wydruk...

~:* tworzy kopię zapasową listy argumentów o jedną pozycję, co pozwala nam wydrukować poprawny zwiastun.

Jason
źródło
1
To był wysiłek grupowy kanału #lisp IRC. Ogromne podziękowania dla phf za sprytny iteracyjny ciąg formatu i włamanie do podsekwencji.
Jason
4

Julia, 98 bajtów

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

Nie golfowany:

# 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.
źródło
4

Powłoka UNIX, 193 bajty

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
źródło
4

Java, 210 209 203 200 177 bajtów

  • odwrócił się i%2==0doi%2<1
  • przycięte { ... }szelki dla pętli for, przeniesiono edeklarację do pętli
  • ponownie zamówione warunkowe
  • usunięto modyfikatory i niepotrzebne nawiasy, przerobiono Randomużycie i przyrost dlai

Uwaga: poniżej dodano nową linię do formatowania w tej witrynie, powyższa liczba dotyczy jednej linii.

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

Nie golfowany:

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
źródło
1
Możesz zapisać 13 bajtów, usuwając public.
Luminous
@Luminous Nadal będę musiał zachować tę, main()choć ...
hjk
@ TimmyD Popieram to.
RK.
4

C, 123, 121, 109 106 znaków (108 bajtów)

(z odrobiną oszukiwania ♥♥♥ ♥♥♥)

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

Istnieje również punkt Unicode złamanego serca na 1f494, ale miałem trudności ze znalezieniem czcionki, która go implementuje.

Jens
źródło
To pokazuje 120 znaków i 122 bajtów ...
AdmBorkBork
1
Nie sądzę, że potrzebujesz O=0, ponieważ Cautomatycznie inicjujesz ints 0?
FryAmTheEggman
@FryAmTheEggman Good find! W poprzedniej wersji miałem O w main(o,O)miejscu, w którym trzeba było ją zainicjować.
Jens
Fajnie, lubię to! Nie myślałem o użyciu timejako liczby losowej ... Sprytne!
MatthewRock
@MatthewRock Jeśli się nad tym zastanowić, wszystkie inne używane programy srand(time(0))zmienią swoją odpowiedź z tą samą częstotliwością. Srand jest całkowicie bezużyteczny :-)
Jens
4

Python 2, 161 159 156 144 bajtów

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]

To 39 bajtów, aby uzyskać losową liczbę.

Ogromne podziękowania dla błotniaków , fryamtheeggman i orlp za ich pomoc.

PYG , 109 bajtów

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
źródło
Możesz wykonać instrukcję zakresu w jednym wierszu. możesz też zrobićimport random as r
Blue
możesz także umieścić treść ostatniej instrukcji print w wierszu powyżej.
Niebieski,
Myślę, że można zmienić print'</3'if i%2 else'<3', aby print['<3','</3'][i%2]zapisać 3 bajty.
Kade
Tak, rzeczywiście mogę; dzięki!
Celeo
Dzięki! Co ciekawe import random as r;a=r.randrange(3,21)i import random;a=random.randrange(3,21)mają tę samą długość.
Celeo
3

PowerShell, 121 119 111 bajtów

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

Edycja - w rzeczywistości krótszy, aby wyraźnie zawierać, "Loves me"a nie deklarować$l

Edycja2 - zapomniałem, że mogę grać w golfa w for()pętli przez potokowanie ...

Nieźle. Używa wbudowanych bloków wykonania kodu, $(...)aby dynamicznie dopasowywać drukowany ciąg znaków podczas for()zapętlania. Zauważ, że ponieważ używa to ukrytego Get-przed, Randomaby zaoszczędzić kilka bajtów, może to działać bardzo wolno w niektórych wersjach PowerShell. Odniesienie

Rozszerzono poniżej w celu wyjaśnienia:

# 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
źródło
3

C ++, 210 193 184 168 bajtów

W C ++ .. ponieważ .. Dlaczego nie? :)

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

Relacja na żywo: 210 193 184 168

Mam tylko nadzieję, że żadna z moich zmian nie zależy od platformy.

Dzięki Ben Voigt za pomoc. Ponadto, dzięki wszystkim komentarzom, były bardzo pomocne.

wendelbsilva
źródło
Humn ... właśnie zdaj sobie sprawę, że to 3 do 20. Naprawię to później. Prawdopodobnie doda jeszcze 2 bajty ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva
Można zaoszczędzić zastępując #define c couti using namespace std;przezauto&c=std::cout;
Ben Voigt
Oszczędź także przy pomocyint i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt,
Witaj, znaleziono błąd: ostatnia linia powinna brzmieć „Kocha mnie!”, A nie „Kocha mnie”.
MatthewRock,
1
Powiedziałbym, że jest w porządku - C i C ++ są podobne. I w tej chwili ten kod jest dłuższy niż Java ...
MatthewRock
3

Groovy, 110 bajtów

Groovy rodzaj miłości:

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
źródło
2

Python 2, 117 bajtów

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]

Zauważ, że po każdym Loves me( not)?następuje ...i nowa linia, z wyjątkiem ostatniej. To wygląda na pracę join.

DLosc
źródło
Trochę za późno, ale ".!\n\n<</33"[n%2::2]jest o 2 bajty krótszy.
FryAmTheEggman
@FryAmTheEggman Tak, widziałem to, ale postanowiłem nie kraść tego Loovjo. W międzyczasie ktoś inny opublikował dokładnie to rozwiązanie. [wzrusza ramionami]
DLosc
Nie zauważyłem, że ktoś to opublikował, ale jestem prawie pewien, że mój komentarz był pierwszym, który go miał, więc możesz go użyć, jeśli chcesz: P
FryAmTheEggman
2

R, 141 132 128 114 111 109 bajtów

Kod

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

Bez golfa

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)

Czerpałem inspirację z kodu Erica Brooksa .

Edycja 1: Teraz kod poprawnie wyświetla ostatnią interpunkcję, jak wskazał Martin
Edycja 2: Zmieniłem pętlę for na sapply i umieściłem serca w ciągu ostatniego wiersza.
Edycja 3: Usunąłem {}i zmieniłem +(x==k)*2na +2*!x<k
Edycja 4: Wróć do pętli for i usunąłem ()z (i%%2)+1
Edycja 5: Napisałem me4 razy i usunąłemsep=""

Mutador
źródło
1

R, 119 111 105 bajtów

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

Edycje 1,2: Bezpośrednie kodowanie dwóch opcji oszczędza miejsce.

Eric Brooks
źródło
1
Możesz zapisać bajt, używając =zamiast przypisania, <-i inny, wykonując x%%2>0zamiast x%%2==1. Zauważ też, że nie obsługuje to poprawnie ostatniego wiersza; powinno być .lub !raczej niż .... (Zobacz przykładowe wyniki w pytaniu.)
Alex A.
1
@Alex A. Nie potrzebujesz x%%2>0też; tylkox%%2
Flądrowiec
Dobre punkty, dzięki. Muszę wrócić i naprawić zakończenie
Eric Brooks,
1

C 226 bajtów

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

(Z formatowaniem)

#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
źródło
1
Usuń typ zwracany z main (-5 bajtów), ustaw globalną wartość i i j (domyślnie -8 bajtów, -3 więcej z powodu domyślnego 0 w j), użyj 0 zamiast NULL (-3). Inne rzeczy - użyj tylko jednej zmiennej i może odliczaj pętlę. Importowanie stdio zwykle nie jest potrzebne podczas gry w golfa.
aragaer
1

Python 2, 115 bajtów

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
źródło
1

PHP, 191 187 146 165 bajtów

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

Nie golfowany:

$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 bajtów na pyth i cjam ... wow :)

Marek Bettman
źródło
Zmieniono $ i% 2 == 0 na $ i% 2 <1 (x2) i $ i% 2! = 0 na $ i% 2> 0 (x2)
Marek Bettman
okazuje się, że operatorzy trójskrzydli nie są zawsze najlepszą odpowiedzią :)
Marek Bettman
1

mSL, 178 176 156 154 bajtów

Edycja 1: Zmieniono == 0na < 1
Edycja 2: Usunięto niepotrzebne białe znaki, dzięki AlexA!
Edycja 3: Usunięto nawiasy

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
źródło
1
Twoje rozwiązanie ma obecnie 176 bajtów, a nie 177. Czy wszystkie białe znaki są potrzebne? Jeśli nie, możesz znacznie skrócić swój kod, po prostu usuwając niepotrzebne białe znaki.
Alex A.
@AlexA. Och, nie wiem, dlaczego napisałem 177, a dzięki za wskazanie konieczności spacji, to naprawdę nie jest potrzebne!
Denny,
1

Perl, 97 bajtów

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

Wersja do odczytu:

$_="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
źródło
1

Sód , 265 bajtów

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

Odpowiedź została zagrana w golfa.

Jacob Misirian
źródło
Twoje rozwiązanie ma obecnie 458 bajtów , a nie 523. Możesz poprawić swój wynik, usuwając niepotrzebne białe znaki i skracając nazwy zmiennych. Przykłady można znaleźć w innym roztworze potasu .
Alex A.
1
Jak zauważyłem w drugiej odpowiedzi dotyczącej potasu, generator liczb losowych wydaje się być bardzo stronniczy. Uruchomiłem to 500 razy z najnowszą wersją i dostałem tylko dwa </3.
Dennis,
+ Dennis Generator liczb losowych jest zbudowany bezpośrednio na generatorze liczb losowych C #. Zobacz: github.com/HciumTeam/Hcium/blob/master/src/Hcium/...
Jacob Misirian
3
Wygląda na to, że nie został poprawnie zaszczepiony. Jeśli wykonam rnd = new Random();rnd.next(0,2);1000 razy, dystrybucja jest OK. Jeśli jednak wykonam rnd = new Random();raz i rnd.next(0,2);1000 razy, zawsze otrzymam dokładnie 533 0si 467 1s.
Dennis,
1

C # (160)

Kod jest inspirowany odpowiedzią od hjk , podziękowania należą się mu.

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

Nie golfowany:

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
źródło
1

Lua, 137 132 bajtów

Prawdopodobnie można grać w golfa o wiele więcej, ale teraz jest na razie:

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

Wyjaśnienie kodu i nieprzypisane:

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

Edycja: Odciąłem trochę białych znaków.

TreFox
źródło
1

Galaretka , 55 bajtów (niekonkuruje?)

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

Wypróbuj online!

Jak zwykle galaretka ssie sznurki.

Erik the Outgolfer
źródło
1

PowerShell , 85 88 bajtów

+3 bajty dzięki Veskah: To dobra uwaga.

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

Wypróbuj online!

mazzy
źródło
1
Może to wygenerować komunikat „Kocha mnie, kocha mnie nie </ 3”, który, w oparciu o sposób, w jaki czytałem specyfikację, jest poniżej minimalnej liczby wierszy.
Veskah
Rzeczywiście of *3* to 20 lines inclusive. Dzięki!
mazzy