Zaimplementuj klasyczne nożyczki z papieru kamiennego.
Warunki:
- użytkownik wprowadzi „r”, „p” lub „s”
- program wyświetli „r”, „p” lub „s” i wynik
- wybór programu („r”, „p” lub „s”) musi być pseudolosowy ( patrzę na ciebie Howard )
- wynik może być reprezentowany dowolnym znakiem do wydrukowania, zawsze powinny istnieć trzy możliwe wyniki tego, co użytkownik wprowadził (użytkownik wygrywa, przegrywa lub jest remis).
- co się stanie, jeśli użytkownik nic nie wprowadzi lub coś innego, że „r”, „p” lub „s” nie powinny być ważne.
Musisz:
- Podaj kod do gry w golfa.
- Nieskluczony kod
- Jak wywołać program
- Przykładowy przebieg
Wybiorę odpowiedź z mniejszą liczbą postaci, jeśli remis zostanie wybrany, zostanie wybrana najbardziej głosowana odpowiedź.
Dobry golf i może być szczęście na twoją korzyść.
Będę publikować odpowiedź w języku Java.
Dla tych, którzy mieszkają w górach pod skałą:
r = kamień
p = papier
s = nożyczki
rock: wygrywa z nożyczkami, przegrywa z papierem, krawat ze skały.
papier: wygrywa do skały, przegrywa nożyczkami, krawat z papierem.
nożyczki: wygrywa na papier, przegrywa ze skałą, krawat z nożyczkami.
Obecne pozycje:
- UN: nazwa użytkownika
- PL: Język programowania
- CC: liczba znaków
- UV: Zwiększenie liczby głosów
╔══════════════════╦════════════╦══════╦════╗ ║ UN ║ PL ║ CC ║ UV ║ ╠══════════════════╬════════════╬══════╬════╣ ║ Howard ║ GolfScript ║ 6 ║ 15 ║ ║ primo ║ Perl ║ 27 ║ 7 ║ ║ TwiNight ║ APL ║ 31 ║ 4 ║ ║ primo ║ Perl ║ 33 ║ 7 ║ ║ marinus ║ APL ║ 36 ║ 5 ║ ║ primo ║ Perl ║ 38 ║ 7 ║ ║ primo ║ Perl ║ 48 ║ 7 ║ ║ manatwork ║ Ruby ║ 54 ║ 13 ║ ║ w0lf ║ GolfScript ║ 62 ║ 4 ║ ║ tmartin ║ K ║ 67 ║ 2 ║ ║ Abhijit ║ Python 3 ║ 74 ║ 5 ║ ║ beary605 ║ Python 3 ║ 76 ║ 4 ║ ║ rlemon ║ javascript ║ 85 ║ 4 ║ ║ ugoren ║ C ║ 86 ║ 3 ║ ║ Egor Skriptunoff ║ LUA ║ 87 ║ 4 ║ ║ Shmiddty ║ javascript ║ 87 ║ 3 ║ ║ Fors ║ Befunge ║ 107 ║ 3 ║ ║ Briguy37 ║ javascript ║ 117 ║ 2 ║ ║ Vi. ║ Clojure ║ 129 ║ 1 ║ ║ Henrik ║ C# ║ 167 ║ 4 ║ ║ dystroy ║ Go ║ 169 ║ 1 ║ ║ Praveen ║ javascript ║ 250 ║ 0 ║ ║ ryan ║ javascript ║ 256 ║ 1 ║ ║ primo ║ ferNANDo ║ 259 ║ 5 ║ ║ anakata ║ Java ║ 259 ║ 1 ║ ║ epoch ║ Java ║ 387 ║ 1 ║ ║ jdstankosky ║ LOLCODE ║ 1397 ║ 15 ║ ╚══════════════════╩════════════╩══════╩════╝
Nie mogę wybrać odpowiedzi Howardsa, ponieważ była to (udana) próba zgięcia reguł, ale zmieniam je, aby były bardziej wyraźne.
Odpowiedź primo 27 znaków nie może zostać wybrana, ponieważ sama w sobie nie jest pseudolosowa
primo -p odpowiedz, pójdę z „-p będzie liczony jako 3 bajty: jeden dla -, jeden dla p, i jeszcze jeden niezbędny biały znak”.
Dzięki wszystkim, którzy odpowiedzieli, mam nadzieję, że dobrze się bawiłeś!
UWAGA: Będę próbował edytować to co drugi tydzień, aby dostosować tabelę i zmienić moją wybraną odpowiedź, jeśli ktoś pobije obecną, więc jeśli właśnie tu dotarłeś, opublikuj swoją odpowiedź, jeśli chcesz!
-p
byłyby liczone jako 3 bajty: jeden dla-
, jeden dlap
i jeszcze jeden niezbędny biały znak . Jednak wiele innych konkursów na CG.SE liczyło każdą opcję jako jeden bajt. Zazwyczaj to autor pytania decyduje, który system honorować.Odpowiedzi:
APL, 31
x←'rps'
Przypisz ciąg'rps'
dox
(?3)⌷
Wybierz losową liczbę całkowitą 1 ~ 3, wybierz ten indeksx
⍞,
Przygotuj dane wejściowe użytkownika do wyboru maszyny⎕←
Wynikowy ciąg znakówx⍳
Konwertuj na tablicę numeryczną według indexOf wx
-/
Różnica dwóch liczb1+|3
Moduł 3 i plus 1'TWL'[...]
indeksowanie od'TWL'
Próba
Użytkownik wybiera kamień, program wybiera papier: Lose
źródło
LOLCODE, 1397
Uwaga: przesłałem to, zanim zauważyłem, że wymaganie wygranej zostało zmienione z popularności w przypadku remisu golfowego na golfa z remisem popularności.
Tak naprawdę nie ma ścisłej składni, ale jestem pewien, że jest to dopuszczalne.
Jeśli
RockPaperScissors.LOL
miałoby to zostać pomyślnie wykonane jako , oto niektóre możliwe losowe wyniki:Rock
- Wyjście:I GUESSED SCIZZORS U WONNED
Paper
- Wyjście:I GUESSED PAPER NOWAI TIED
Scissors
- Wyjście:I GUESSED ROCK LOL U LOZED
Tuna
- Wyjście:WHAT U SAYZ? YOU BURNTED MAH TREAT!
źródło
GolfScript
Powyższy kod implementuje wymaganą funkcjonalność. Dodatkowo zapewnia, że gracz nigdy nie będzie zły, ponieważ (postrzegana) niesprawiedliwość strategii komputera.
Wersja bez golfa
Jak wywołać program
Dane wejściowe (pojedynczy znak „r”, „p”, „s”) należy podać na STDIN, ewentualnie zakończone znakiem nowej linii.
Przykładowy przebieg
Objaśnienie kodu
Dla wszystkich tych, którzy nie znają GolfScript, dodam szczegółowe objaśnienie działania tego kodu. Kod zasadniczo składa się z trzech części.
Notatki
Ponieważ nie jest to golf golfowy, ale konkurs popularności, nie wybrałem najkrótszej wersji. Może w przypadku remisu krótszy kod znokautuje moje rozwiązanie. Niemniej jednak dla osób zainteresowanych golfem istnieją następujące możliwości:
0
jako wyjście dla losowania. Zatem najkrótszym prawidłowym programem jest kod jednoznakowy0
.źródło
n"d"
, ponieważ pytanie mówiło, że wynik musi być dowolnym znakiem do wydrukowania, nie mówi nic o używaniu pełnych słów.Rubin:
6154 znakówJakoś wyjaśnione:
Cały problem sprowadza się do obliczenia następujących wyników:
Gdzie liczby oznaczają:
W tym celu użyłem wzoru: machine_choice - human_choice. Czasami powoduje to ujemną wartość, ale ponieważ jest używana tylko jako indeks, a ujemny indeks jest liczony do tyłu, wybierze właściwy element tablicy.
Zastosowane metody (inne wówczas
Fixnum
oczywiste):inspect
po którym następuje nowa linia standardowego wyjścia programu. ”max.to_i.abs == 0
, rand zwróci pseudolosową liczbę zmiennoprzecinkową między 0,0 a 1,0, w tym 0,0 z wyłączeniem 1,0.”Nie golfowany:
Przykładowy przebieg:
źródło
[(c-o.index($_)+3)%3]
można zastąpić[c.-o.index$_]
na 7 bajtów. Powinieneś również dodać dwa do swojego wyniku-nl
przynajmniej.c.
wskazówkę..-
. Kropkowane operatory mają znacznie niższy priorytet niż ich odpowiedniki bez kropek. Na przykłada/(b+c)
można zastąpića./b+c
.C # (167 znaków)
Moja pierwsza próba gry w golfa.
Grał w golfa
using System;class P{static void Main(string[] i){var m="rspr";var a=m[Environment.TickCount%3];Console.WriteLine(a+" "+(i[0][0]==a?"T":m.Contains(i[0]+a)?"W":"L"));}}
Nie grał w golfa
Przykładowy przebieg Aplikacja wymaga wprowadzenia pojedynczego znaku jako argumentu 1 do aplikacji albo
r
,s
albop
.Wszystkie możliwe wyniki
cmd > app.exe r
daje wynikr T
(rock, remis)cmd > app.exe r
daje wynikp L
(papier, zgubiony)cmd > app.exe r
daje wyniks W
(nożyczki, wygrana)cmd > app.exe p
daje wynikr W
(rock, win)cmd > app.exe p
daje wynikp T
(papier, krawat)cmd > app.exe p
daje wyniks L
(nożyczki, zgubiony)cmd > app.exe s
daje wynikr L
(rock, lost)cmd > app.exe s
daje wynikp W
(papier, wygrana)cmd > app.exe s
daje wyniks T
(nożyczki, krawat)źródło
Perl 48 bajtów
Skrypt wypisuje wynik z perspektywy komputera, na przykład jeśli gracz wybierze,
r
a komputer wybierzes
, wynikiem jestLose
.$%
(Formatuj numer strony) służy do przechowywania ruchu komputera, ponieważ może zawierać tylko wartość całkowitą, która zapisuje rzutowanie int.Nie golfowany:
Przykładowe użycie:
Skrypt można również uruchomić interaktywnie, wpisując swój ruch, a następnie Enter:
Rozciąganie reguł
Perl 35 +3 bajtów
Wymaga
-p
przełącznika wiersza poleceń (liczonego jako 3 bajty). Każdy z efektówWin
,Lose
aDraw
zostały odwzorowane naW
,L
,D
. Nowa linia między wyborem komputera a wynikiem została wykluczona.Przykładowe użycie:
Perl 30 +3 bajtów
Jeszcze raz wymaga
-p
. TutajWin
,Lose
aDraw
zostały odwzorowane na2
,1
i0
odpowiednio. Jest to nadal technicznie zgodne, ponieważ są to znaki do wydrukowania.Przykładowe użycie:
Perl 24 +3 bajtów
Wymaga
-p
, WLD odwzorowane na2
,1
,0
jak wcześniej. Każdy^T
powinien zostać zastąpiony dosłownym znakiem ascii 20. Ten jest wprawdzie nieco rozciągnięty;$^T
zwraca liczbę sekund od epoki od uruchomienia skryptu. Wszystkie wyniki są możliwe, ale nie do końca kwalifikuje się jako pseudolosowe.Przykładowe użycie:
źródło
APL (
3836)Wysyła „T”, „W” i „L” dla remisu, wygranej i przegranej.
Przykładowy przebieg:
(Typy użytkownika „p” dla papieru. Komputer wybiera „r” (kamień), użytkownik wygrywa)
Wyjaśnienie:
⌽↑⌽∘'TWL'¨⍳3
: generuje następującą macierz:⍞⍳⍨c←'rps'
: ustawc
na ciąg'rps'
, odczytaj dane wejściowe użytkownika i uzyskaj indeks danych wejściowych użytkownika w ciągu (będzie to wartość od 1 do 3). Ten indeks jest używany jako współrzędna Y w macierzy.i←?3
: zdobądź losową liczbę od 1 do 3 i zapisz jąi
, wybór należy do komputera. Jest to używane jako współrzędna X w matrycy.c[i]
: użyji
jako indeksu doc
, wyświetlając wybór komputera jako „r”, „p” lub „s”.źródło
ferNANDo 1184 (259 golfowych) bajtów
Tłumacz napisany w języku Python można znaleźć na dole połączonej strony.
ferNANDo jest językiem ezoterycznym, który obsługuje tylko jeden typ zmiennej, boolean i tylko jedną operację, NAND. Jak można sobie wyobrazić, może to prowadzić do dość długiej logiki do wykonywania pozornie prostych zadań. Obsługuje odczytywanie ze stdin (jeden bajt na raz), pisanie na stdout (także jeden bajt na raz), pętle warunkowe, a także losowy generator boolean.
Nie ma żadnych słów kluczowych; wszystko jest zmienną. Funkcja instrukcji zależy wyłącznie od liczby zawartych w niej zmiennych. Nie ma też komentarzy, więc dołożyłem wszelkich starań, aby kod sam się komentował. Ostatnie cztery linie mogą być nieco mylące, ale będzie to prawdopodobnie wystarczy powiedzieć, że drukuje
Win!
,Lose
lubDraw
w zależności od wyników.Skrypt można uruchomić interaktywnie, wpisując swój ruch, a następnie Enter.
Przykładowe użycie (zakładając, że nazwałeś tłumacza
nand.py
):Edycja: Aby udowodnić, że ferNANDo może konkurować z Javą, oto wersja „golfowa” o wielkości 259 bajtów . Logika jest wyraźnie inna; sprawdza
not win
inot tie
, co oszczędza kilka bramek NAND (ponieważ wtedy potrzebuję tylkonot
wersji ruchów gracza i ponieważnot lose
nie było to wymagane do wyjścia). Jednak nie tak interesujące do przeczytania.źródło
o_shi- o_shi- o_shi-
To było przezabawne komentowanie.q
, ale robi rozsądną rzecz i wraca.Python 3.x: 74 znaków
Jak to działa
Na podstawie losu określa, jaki powinien być jego wybór na podstawie formuły
Wersja bez gry w golfa
Przykładowy przebieg
źródło
Lua, 87
Stosowanie:
Nie golfowany:
źródło
GolfScript 62
Alternatywne rozwiązanie GolfScript, o wiele bardziej nudne niż Howarda :).
Program wybiera ruch losowo i wyświetla wynik z perspektywy użytkownika.
Kod
Przykładowy przebieg
Test online
Możesz uruchomić program i eksperymentować z różnymi danymi wejściowymi tutaj: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwqdcJ0xvc2UnJ1dpbidpZn17EzFD
Zauważ jednak, że parametr (ruch użytkownika), który zwykle jest przekazywany w wierszu poleceń, jest teraz dodawany do stosu w samym kodzie (nie ma możliwości podania „rzeczywistych” parametrów wiersza poleceń w tym narzędziu online).
Wersja „bez golfa”
Nie mam pojęcia, co ungolfed środki, jeśli chodzi o GolfScript, więc próbowałem dodawać komentarze. Mamy nadzieję, że wyjaśni to działanie kodu i uczyni go nieco bardziej czytelnym:
źródło
C,
9286 znakówDrukuje wybór komputera i wynik z punktu widzenia użytkownika - W = wygrywasz, L = przegrywasz, T = remis.
Prosta formuła
x-y
, biorąc pod uwagę wartości ASCII wyborów, daje 0 przy losowaniu (oczywiście) i niepowtarzalną wartość w każdym innym przypadku.źródło
Python 2 (
86848078), Python 3-76 znaków0 - remis, 1 - przegrana, 2 - wygrana
Nie golfił
Jak uruchomić:
python file_name_here.py
Problemy:
AI komputera: 35 znaków
źródło
A
jednak potrzebował i możesz uratować kolejny znakfrom random import*
.from random
, bo myślałem, że to nie zmieniło ...Najpierw spróbuj bez recenzowania innych.
grał w golfa:
10785 bajtówwyjście to [npc-wybór] [1: wygrana, 2: przegrana, 3: remis]
bez golfa:
źródło
PowerShell:
1441331171119273Kod do gry w golfa:
Można uruchomić bezpośrednio z konsoli.
Niegolfowany, z komentarzami:
Niektóre próbki działają na konsoli:
źródło
JAVA 259 :(
Kod wysoce nie golfowy:
Przykładowe przebiegi:
źródło
Befunge: 107 znaków
Nieznacznie niezgrabny. Można go zmniejszyć, pytanie o to, ile.
źródło
JavaScript (87)
Gra w golfa:
Nie golfowany:
Możesz po prostu wkleić kod w konsoli javascript przeglądarki, aby go uruchomić.
Jeśli mogę wydrukować wynik przed wydrukowaniem wyboru komputera (83) :
źródło
K, 67
Drukuje W, L, D dla wygranej / przegranej / remisu.
Nie golfowany:
Lub w Q, który jest bardziej czytelny:
Przykładowy przebieg:
źródło
JavaScript, 117 znaków
Oto podejście problemu oparte na danych. Prawdopodobnie można to zoptymalizować, generując dane wygranej / przegranej / losowania zamiast ręcznie mapować, ale to jest początek :)
Gra w golfa:
Nie golfowany:
Wreszcie, oto skrzypce z obu.
źródło
JavaScript: 256
grał w golfa:
bez golfa:
źródło
Clojure:
Wersja mini (129 znaków kodowych):
źródło
JAVA (387) pierwszy kod golfa!
Nie golfił
Gra w golfa (odstępy / wcięcia)
Nie najkrótszy kod, ale moja pierwsza próba
źródło
import java.util.*
2)HashMap l
->Map l
3) rzuć na(int)
zamiast(Integer)
4)new Random().nextInt(3)
5) pomińnew int[][]
6) usuń rzuty na(Character)
7) użyj ints zamiast znaków.Idź (169)
Gra w golfa:
Niegolfowany (w formacie sformatowanym przez
go fmt
):Biegać :
źródło
Pyth , 23
Dane wyjściowe mają postać:
Remis: 0 Wygrana: 1 Przegrana: 2
Wyjaśnienie:
Uruchom w następujący sposób:
Tylko dla 4 dodatkowych postaci możemy użyć T dla remisu, W dla wygranej i L dla przegranej:
Wszystko jest takie samo aż do różnicy indeksów, w którym to momencie używamy różnicy jako indeksu w ciągu
"TWL"
.Uwaga: chociaż rozwijałem ten język po opublikowaniu wyzwania, nie widziałem go do dziś. Wyzwanie nie wpłynęło na żaden aspekt języka.
źródło
Groovy, 89
Jako argument przyjmuje wybór użytkownika. Przykład:
źródło
C # i LinqPad 133
grał w golfa:
bez golfa:
przykładowe wyjście (dane wejściowe były): r> L // Komputer wybiera rock (r) -> więc przegraliśmy
źródło
JavaScript (79)
Wpadłem na stary, ale zaczynamy ...
Z dodatkową premią, że możesz użyć dowolnej skały, którą lubisz pegnatite, piroksenit, scoria, sovite, kimberlite, trondjemite, tuf lub dowolny inny. Jedynym ograniczeniem jest to, że nie możesz używać
p
lubs
;-)Kod do gry w golfa:
Główne stosowane sztuczki to:
1. u = ~~{}[prompt()]
Korzystanie z obiektu
{}
i pobieranie wartości z danych wejściowych użytkownikaprompt()
. Jak na razie dobrze. Zamiast tegor : 0
możemy zmusić go do konwersji0
za pomocą~~
operatora NOT. Jest to często wykorzystywane do numerów podłogowych, ale także ma (korzyść) z nie wracaNaN
, gdy inni operatorzy, jak np+{a:1, b:2}['c']
.2. c = new Date%3
Data jest często oszukiwana, np
+new Date
. Poprzez bezpośrednie przekonwertowanie jej na znacznik czasu, w przeciwnym razie można uzyskać ciąg znaków. Tutaj przy użyciu mod można osiągnąć ten sam efekt.3. 'rps'[c]
Indeksowany dostęp do ciągu znaków, umożliwiający komputerom wybór
0 = r
,1 = p
lub2 = s
.4. (u==c ? 2 : !u&c>1 | u&!c | u>1&c )
Nieskluczony kod może wyglądać mniej więcej tak:
źródło
Golfscript - 29
To jest faktyczna odpowiedź tym razem (patrząc na ciebie
n"Draw"
: P).Nie golfowany:
Możesz go uruchomić za pomocą
ruby golfscript.rb MyCode.txt
, gdzieMyCode.txt
jest kod programu.Przykładowe przebiegi (wszystkie z wejściem „r”, ale działa ze wszystkim) (remis to 0, wygrana to 2, strata to 1):
Jeśli chcesz wyjaśnić którąkolwiek wersję i / lub zobaczyć potencjalną poprawę, powiedz mi.
źródło
JavaScript,
657170Bez wyjścia komputerowego: 65
Wystarczy przetestować, czy to rozwiązanie jest poprawne:
Z wyjściem komputerowym: 71
70
i test:
źródło