- Alice (A) i Bob (B) zdecydowali się na bitwę.
- Każdy walczący ma 10 punktów zdrowia.
- Na zmianę rzucają 6-stronną kostką pod kątem obrażeń.
- Obrażenia są usuwane ze zdrowia przeciwnika.
- W końcu albo Alice, albo Bob, pokonają swojego wroga.
Pokaż mi, jak przebiegła bitwa. Wyprowadzanie tych kodów dla działań, które miały miejsce.
Atak
B a A
^ Combatant
^ Action (attack)
^ Target
Rolka
B r 4
^ Combatant
^ Action (roll)
^ Value
Zmiana zdrowia
A h 6
^ Combatant
^ Attribute (health)
^ Value
Zdobyć
A w
^ Combatant
^ Action (win)
Przykładowe dane wyjściowe:
A a B
A r 4
B h 6
B a A
B r 6
A h 4
A a B
A r 6
B h 0
A w
Oto zasady:
- Pisz w dowolnym języku.
- Pojedynczy rzut kości powinien mieć jednakową szansę na uzyskanie dowolnej liczby 1, 2, 3, 4, 5 lub 6.
- Alice zawsze zaczyna się (Bob jest rycerski, w staromodny sposób).
- Wydaj akcję dla każdej tury.
- Musisz zgłosić atak, rzut, obrażenia i wygrać akcje.
- Walczący są wielkimi literami, akcje małymi literami.
- Nie może konsekwentnie dawać tego samego rezultatu.
- Pomiędzy wyjściowym walczącym, akcją i wartością musi być przynajmniej jedna biała postać.
- Wygrana ma miejsce, gdy przeciwnik ma zero lub mniej zdrowia.
- Wszystkie części akcji muszą znajdować się w tej samej linii.
- Powinna być jedna akcja na linię.
- Wygrywa najmniej bajtów.
Mają na to!
Odpowiedzi:
05AB1E , 49 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 3 , 131 bajtów
Wypróbuj online!
-8 bajtów dzięki
Officialaimm -2 bajtów dzięki ChooJeremy
źródło
p=print
zaoszczędzi około 8 bajtów.randint(1,6)
można zastąpićid(X+Y)//3%6+1
, chociaż rozkład nie jest całkiem jednolity.C (gcc) ,
146141 bajtówWypróbuj online!
De-golf:
źródło
a=65+t,b=66-t
?A*B>0
zaoszczędzi ci kilka bajtów.A*B
zaoszczędzi jeszcze więcej, ale trochę mi się spieszy. Będę aktualizować wieczoremPython 3 , 127 bajtów
Jest to poprawka w odpowiedzi @HyperNeutrino , która nie mieści się w komentarzu. Zobacz wyjaśnienie poniżej.
Wypróbuj online!
Epicka wyprawa o krótszy rzut kostką pytona
TL; DR: Możliwe jest ogolenie 4 bajtów ze standardowego rzutu kostką pytona za pomocą szyfrowania RSA.
Chciałem zobaczyć, czy standardowy rzut kostką pytona ( 32 bajty ) może zostać nieco skrócony:
W szczególności
id(x)
dość wygodne jest wprowadzenie do programu pewnej niedeterministycznej wartości. Moim pomysłem było więc jakoś przesłać tę wartość, aby stworzyć rzeczywistą przypadkowość. Próbowałem kilku podejść, a jedno z nich się opłaciło: szyfrowanie RSA .Szyfrowanie RSA, ze względu na swoją prostotę, wymaga jedynie kilka bajtów:
m**e%n
. Następną losową wartość można następnie utworzyć, szyfrując poprzednią. Zakładając, że(e,n)
klucz jest dostępny, rzut kostką można zapisać za pomocą 22 bajtów :Oznacza to, że mamy około 10 bajtów do zdefiniowania prawidłowego klucza RSA. Mam szczęście. Podczas moich eksperymentów zacząłem używać Mersenne Prime M67, aby później uświadomić sobie, że Mersenne popełnił błąd, włączając M67 na swojej liście. Okazuje się, że jest produktem
p=193707721
iq=761838257287
. Znalazłem moduł:Teraz wykładnik i totem Charmichaela
(p-1)*(q-1)
muszą być chronione prawem autorskim . Na szczęście pierwsza liczba pierwsza, która nie dzieli sumy n, ma tylko jedną cyfrę: 7. Rzut kostką można następnie zapisać przy użyciu 28 bajtów (4 bajty mniej niż standardowe podejście):Jedną dobrą rzeczą w przypadku M67 jest to, że generowana losowa wartość ma 66 bitów, czyli więcej niż zwykle 64-bitowe RNG. Ponadto użycie RSA umożliwia cofnięcie się w czasie poprzez kilkakrotne odszyfrowanie bieżącej wartości. Oto klucze szyfrujące i odszyfrowujące:
Zdecydowanie nie jestem ekspertem w dziedzinie statystyki ani kryptografii, więc nie jestem w stanie stwierdzić, czy ten RNG sprawdza kryteria „dobrej losowości”. Napisałem mały test porównawczy, który porównuje standardowe odchylenie występów od 1 do 6 rzutów kości przy użyciu różnych RNG. Wygląda na to, że proponowane rozwiązanie działa tak samo jak inne.
źródło
JavaScript (ES6), 122 bajty
Wypróbuj online!
źródło
Java (JDK 10) , 180 bajtów
Wypróbuj online!
Kredyty
źródło
var
? o.Ô Naprawdę muszę wkrótce sprawdzić niektóre z nowych specyfikacji. W każdym razie możesz zagrać w 4 bajty, zmieniając tablicęv->{var r="";int P[]={65,66},p=0,H[]={10,10},h=0;for(;H[0]*H[1]>0;)r+=r.format("%3$c a %4$c%n%3$c r %d%n%4$c h %d%n",h+=Math.random()*6-h+1,H[p]-=h,P[p],P[p^=1]);return r+=P[p^1]+" w";}
65 w
zamiastA w
. Właśnie dlatego wyodrębniłem go zeint ...
stwierdzenia: golf kilka bajtów ;-)v->{var r="";int p=0,H[]={10,10},h=0;for(;H[0]*H[1]>0;)r+=r.format("%3$c a %4$c%n%3$c r %d%n%4$c h %d%n",h+=Math.random()*6-h+1,H[p]-=h,p+65,(p^=1)+65);return r+(p<1?"B":"A")+" w";}
( 181 bajtów )Perl 5 ,
938887 bajtówWypróbuj online!
źródło
Rubin ,
122 120 96 9291 bajtówZaoszczędzono 1 bajt dzięki Asone Tuhid .
Wypróbuj online!
źródło
["A", "a", "B"]
? Jeśli tak, mam to 96-bajtowe rozwiązanie.?(p [x,?w]):
się?p([x,?w]):
Java 8, 230 bajtów
Uwaga: odpowiedź Java jest już znacznie krótsza, więc pamiętaj o jej głosowaniu ! Stosuję jednak zupełnie inne podejście, więc doszedłem do wniosku, że warto było to również opublikować.
Wyjaśnienie:
Wypróbuj online.
źródło
C (gcc) , 142 bajty
Wypróbuj online!
źródło
Partia, 174 bajty
Objaśnienie:
%
Odwołania do zmiennych są zastępowane w czasie analizy. Ma to dwie przydatne zalety:%d%-=r
odejmujer
od zmiennej o nazwied
(tj. odwołanie pośrednie)set c=%d%&set d=%c%
jest po prostu prostą zamianą.źródło
PHP 7.1: 159 bajtów
Uruchom tutaj w przeglądarce!
PHP 5.6: 156 bajtów
Uruchom tutaj w przeglądarce!
Oto jak wygląda rozwiązanie PHP 5.6 z formatowaniem i komentarzami:
źródło
Bash, 178 bajtów
źródło
F #,
238235 bajtówMyślałem, że mam się dobrze, ale wszyscy daleko mnie zdeklasowaliście!
Wypróbuj online!
Dzięki Rogemowi za genialną poradę, aby użyć A * B> 0 zamiast A> 0 i&B> 0 (usuwa 3 bajty).
Dziękuję również oficjalnemu, który podpowiedź na temat predefiniowania printf w odpowiedzi na Python pomogła mi również zgolić kilka bajtów.
źródło
A*B>0
pozwoli ci zaoszczędzić jeszcze kilka.Haskell , 204 bajty
Moja próba z Haskellem niestety nie była w stanie uczynić go bardziej konkurencyjnym
Wypróbuj online!
Objaśnienia:
źródło
where m=b-x
mogą być wprowadzane do strażnika:|m<-b-x=
.main=putStr=<<q"A "10"B "10.randomRs(1,6::Int)<$>getStdGen
. Możesz także użyć listy i powiązać ją, aby pozbyć się przedefiniowania(++)
. To ostatnie miejsce nie wydaje się korzystne z powodu używaniab-x
wszędzie.Julia 0.6 , 175 bajtów
Wypróbuj online!
Długa, nie golfowa wersja:
źródło
VBA,
222185179 bajtówTo rekursywne rozwiązanie obejmuje 3 okręty podwodne
p jest krótszy niż Debuguj. Drukuj, gdy jest używany więcej niż 3 razy (tylko 4 w tym rozwiązaniu).Edycja: Teraz, gdy dowiedziałem się, żeDebug.?
jest to akceptowalna alternatywaDebug.Print
,Debug.?x
jest krótszy niż wywołanie Sub do wydrukowania.To było zabawne wyzwanie. Jeśli znasz tłumacza internetowego, takiego jak TIO dla VB6 / VBScript / VBA, zostaw komentarz. Następnie mogę opublikować link do działającego rozwiązania.
Jeśli chcesz przetestować ten kod i mieć zainstalowany program Microsoft Excel, Word, Access lub Outlook (tylko Windows), naciśnij klawisze Alt + F11, aby otworzyć VBA IDE. Wstaw nowy moduł kodu (Alt + I, M) i wyczyść opcję Jawne. Następnie wklej kod i naciśnij F5, aby go uruchomić. Wyniki powinny pojawić się w oknie natychmiastowym (naciśnij Ctrl + G, jeśli go nie widzisz).
Edycja 1: Usunięto białe znaki, które edytor VBA automatycznie doda z powrotem. Zmniejszone o 37 bajtów
Edycja 2: Usunięto Sub p () *, aby zapisać 6 bajtów po nauce,
Debug.?
jest akceptowalną alternatywą dlaDebug.Print
. Wywołanie subwoofera do obsługiDebug.?
zapisuje bajty tylko po więcej niż sześciu połączeniach.źródło