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 golf golfowy , więc wygrywa najkrótszy wpis!
Także moje pierwsze wyzwanie :) Powodzenia!
źródło
[3, 20)
) czy 3 do 20 ([3, 20]
)?Odpowiedzi:
Pyth,
5453515048 bajtówźródło
%2tWZ"<</33
oszczędza druk serca 1. Nie jestem przekonany, że to najlepszy sposób.%
.@".!"Z%hZ"</3
zapisuje dwa bajtyCJam,
535049 bajtówDzięki Dennisowi za zaoszczędzenie 1 bajtu.
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:
źródło
Brainfuck, 2766 bajtów (obecnie nieprawidłowy)
Właśnie dlatego. Później dodam wersję bez golfa.
Kod
Pseudo kod
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)
Seed: 3 (losowa liczba to 20, zajmuje 463 253 048 operacji)
Sugeruję, abyś nie używał nasion
6
, ponieważ2,105,900,375
obliczenia 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:
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:
źródło
JavaScript (ES6),
1191049998 bajtówźródło
new Date
podstępu w mojej odpowiedzi?Loves me not... Loves me... Loves me not! <3
iLoves 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.Python, 147
Używa
from random import*
zamiastimport random
irandint
zamiast,randrange
aby zapisać kilka bajtów. Prawdopodobnie zostało jeszcze kilka bajtów.źródło
"LLoovveess mmee n o t"[i%2::2].strip()
wydaje się niepotrzebnie skomplikowana. Nie możesz po prostu zrobić"Loves me"+~i%2*" not"
?["Loves me","Loves me not"][i%2]
jest bardziej optymalny, ponieważ marnujesz teraz znaki.strip()
i kilka spacji. Ale tak, użyj koduJavaScript (ES6),
110102 bajtówTo 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:Darn JS 5 + -char wbudowane nazwy. No cóż. Sugestie mile widziane!
źródło
18+3|0
?Math.random()
. Chyba teraz nie jest to konieczne.Perl, 85
źródło
Ruby, 91 bajtów
źródło
Common Lisp
106104 bajtówDział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łą1
i0
isubseq
jest używany do listy długości [3,20] (to jest tylko część nie przenośny, ponieważsubseq
wymagana 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
format
dyrektyw:~{
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.źródło
Julia, 98 bajtów
Nie golfowany:
źródło
Powłoka UNIX, 193 bajty
źródło
Java,
210209203200177 bajtówodwrócił sięi%2==0
doi%2<1
{ ... }
szelki dla pętlifor
, przeniesionoe
deklarację do pętliRandom
użycie i przyrost dlai
Uwaga: poniżej dodano nową linię do formatowania w tej witrynie, powyższa liczba dotyczy jednej linii.
Nie golfowany:
źródło
main()
choć ...C,
123, 121, 109106 znaków (108 bajtów)(z odrobiną oszukiwania ♥♥♥ ♥♥♥)
Istnieje również punkt Unicode złamanego serca na 1f494, ale miałem trudności ze znalezieniem czcionki, która go implementuje.
źródło
O=0
, ponieważC
automatycznie inicjujesz ints0
?main(o,O)
miejscu, w którym trzeba było ją zainicjować.time
jako liczby losowej ... Sprytne!srand(time(0))
zmienią swoją odpowiedź z tą samą częstotliwością. Srand jest całkowicie bezużyteczny :-)Python 2,
161159156144 bajtówTo 39 bajtów, aby uzyskać losową liczbę.
Ogromne podziękowania dla błotniaków , fryamtheeggman i orlp za ich pomoc.
PYG , 109 bajtów
źródło
import random as r
print'</3'if i%2 else'<3'
, abyprint['<3','</3'][i%2]
zapisać 3 bajty.import random as r;a=r.randrange(3,21)
iimport random;a=random.randrange(3,21)
mają tę samą długość.PowerShell,
121119111 bajtówEdycja - 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 podczasfor()
zapętlania. Zauważ, że ponieważ używa to ukrytegoGet-
przed,Random
aby zaoszczędzić kilka bajtów, może to działać bardzo wolno w niektórych wersjach PowerShell. OdniesienieRozszerzono poniżej w celu wyjaśnienia:
źródło
C ++,
210193184168 bajtówW C ++ .. ponieważ .. Dlaczego nie? :)
Relacja na żywo:
210193184168Mam 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.
źródło
j=3+(int)(rand()*17.0/RAND_MAX)
#define c cout
iusing namespace std;
przezauto&c=std::cout;
int i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Groovy, 110 bajtów
Groovy rodzaj miłości:
źródło
Python 2, 117 bajtów
Zauważ, że po każdym
Loves me( not)?
następuje...
i nowa linia, z wyjątkiem ostatniej. To wygląda na pracęjoin
.źródło
".!\n\n<</33"[n%2::2]
jest o 2 bajty krótszy.R,
141132128114111109 bajtówKod
Bez golfa
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)*2
na+2*!x<k
Edycja 4: Wróć do pętli for i usunąłem
()
z(i%%2)+1
Edycja 5: Napisałem
me
4 razy i usunąłemsep=""
źródło
R,
119111105 bajtówEdycje 1,2: Bezpośrednie kodowanie dwóch opcji oszczędza miejsce.
źródło
=
zamiast przypisania,<-
i inny, wykonującx%%2>0
zamiastx%%2==1
. Zauważ też, że nie obsługuje to poprawnie ostatniego wiersza; powinno być.
lub!
raczej niż...
. (Zobacz przykładowe wyniki w pytaniu.)x%%2>0
też; tylkox%%2
C 226 bajtów
(Z formatowaniem)
źródło
Python 2, 115 bajtów
źródło
PHP,
191187146165 bajtówNie golfowany:
48,49 bajtów na pyth i cjam ... wow :)
źródło
mSL,
178176156154 bajtówEdycja 1: Zmieniono
== 0
na< 1
Edycja 2: Usunięto niepotrzebne białe znaki, dzięki AlexA!
Edycja 3: Usunięto nawiasy
źródło
Perl, 97 bajtów
Wersja do odczytu:
źródło
Sód , 265 bajtów
Odpowiedź została zagrana w golfa.
źródło
</3
.rnd = new Random();rnd.next(0,2);
1000 razy, dystrybucja jest OK. Jeśli jednak wykonamrnd = new Random();
raz irnd.next(0,2);
1000 razy, zawsze otrzymam dokładnie 5330
si 4671
s.C # (160)
Kod jest inspirowany odpowiedzią od hjk , podziękowania należą się mu.
Nie golfowany:
źródło
Lua,
137132 bajtówPrawdopodobnie można grać w golfa o wiele więcej, ale teraz jest na razie:
Wyjaśnienie kodu i nieprzypisane:
Edycja: Odciąłem trochę białych znaków.
źródło
Galaretka , 55 bajtów (niekonkuruje?)
Wypróbuj online!
Jak zwykle galaretka ssie sznurki.
źródło
PowerShell ,
8588 bajtów+3 bajty dzięki Veskah: To dobra uwaga.
Wypróbuj online!
źródło
of *3* to 20 lines inclusive
. Dzięki!