Jest taka gra, w którą lubię grać. Dzieje się to na siatce o skończonych rozmiarach (ale jest owinięty jak kula). Na tej siatce wybierany jest losowy (tylko liczba całkowita) punkt. Następnie ja, użytkownik, otrzymuję monit o podanie współrzędnych. Jeśli mój wkład dokładnie pasuje do losowego punktu, powiedziano mi, że wygrałem. W przeciwnym razie powiedziano mi o punktowej odległości między moim wejściem a punktem losowym. Na przykład, jeśli zgadłem, (2,2)
a losowy punkt był w (4,3)
, wtedy odległość byłaby sqrt[(3-2)^2 + (4-2)^2] = sqrt[5]
.
Gra trwa, dopóki gracz nie dotrze do właściwej lokalizacji punktu.
Cel Utwórz funkcjonalną wersję gry opisaną powyżej. Aby to zrobić, musisz utworzyć pełny program. Oto, co powinien zrobić Twój program:
- Poproś o dwa dane wejściowe: wysokość i szerokość tablicy. Początek znajduje się w lewym górnym rogu planszy. Te dane wejściowe nie przekroczą
1024
. - Wybierz losowy punkt na tej planszy; to będzie punkt do zgadnięcia.
- Zaakceptuj wejście symulujące zakręt. Wejście będzie albo oddzieloną spacją liczbą całkowitą, albo dwoma oddzielnymi wejściami całkowitymi. W odpowiedzi na te dane wejściowe program wykona jedną z dwóch czynności:
- Jeśli wejście odpowiada wybranemu losowo punktowi, wyślij komunikat sygnalizujący zwycięstwo użytkownika. Sugerowałbym „Wygrałeś!”.
- W przeciwnym razie wyświetl odległość między punktem wejściowym użytkownika a punktem losowym.
- Gdy użytkownik osiągnie zwycięstwo, wyświetl liczbę wykonanych przez niego obrotów. Program następnie kończy pracę.
Bonusy
Bonusy są stosowane w kolejności, w jakiej występują na tej liście
- -150 bajtów, jeśli twój program przyjmuje całkowitą liczbę wejściową
D
opisującą wymiar, w którym gra się odbywa. Np. JeśliD = 3
, to utworzysz losowy punkt3
liczb całkowitych, weź wartości3
całkowite i wyprowadzisz odległość między tymi punktami. - -50% (lub + 50%, jeśli
score < 0
), jeśli zapewnisz graficzną reprezentację planszy (ASCII lub obraz), która pokazuje, gdzie użytkownik wcześniej odgadł na siatce o podanych wymiarach i licznik obrotów. (Jeśli wybierzesz pierwszą premię, ta premia dotyczy tylko trybów2D
i1D
. Jeśli dodasz wyjście graficzne 3D, otrzymasz dodatkowe -50%.) - -60 bajtów, jeśli możesz podać tryb gry (wybrany przez wejście na początku; to znaczy, jeśli podano
0
, wykonaj zwykły tryb gry; jeśli podano1
, wykonaj ten tryb gry), w którym punkt przesuwa się o 1 jednostkę w losowym kierunku ortogonalnym na turę
Więcej na temat pakowania
Zawijanie następuje tylko wtedy, gdy w trzeciej premii punkt ruchu przesuwa się przez dowolną granicę; w tym przypadku punkt ruchomy jest wypaczony do odpowiedniego punktu, tak jak:
... ...
..R (move right) R..
... ...
To zachowanie owijania nie wpływa na zgadywanie użytkownika, poza tym, że punkt zmienił kierunek.
Tabela liderów
Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
10x10
, losowy punkt to(9,4)
, jak sądzę(2,2)
, odległośćsqrt(13)
lubsqrt(53)
? (Uwaga na przyszłość: jeśli robisz coś dziwnego, nie dołączaj losowości, ponieważ prawie niemożliwe jest dostarczenie przypadków testowych). 2. Czy w trzeciej premii należy obliczyć odległość i wyprowadzić ją przed lub po przesunięciu punktu?Odpowiedzi:
CJam,
-113-139-152-157-159 bajtówProgram ma 51 bajtów długości i kwalifikuje się do premii -150 bajtów i -60 bajtów .
Tryb gry i liczbę wymiarów odczytuje się jako argument wiersza poleceń, wielkość w każdym wymiarze z STDIN. Ponieważ komunikat o zwycięstwie jest arbitralny , program wydrukuje
0.0
(odległość do bramki), aby wskazać, że gra się skończyła.Przebiegi testowe
Jak to działa
źródło
Pyth, 91 (-150 -60) = -119
Stare rozwiązanie: (54-150 = -96)
Wszystkie dane wejściowe odbywają się w nowej linii.
1
lub0
)Pierwszadruga liczba całkowitaD
reprezentuje wymiary gry.D
dane wejściowe reprezentują rozmiar polaD
wejście od tego momentu jest domysłemOdtwarzanie przykładowe (podpowiedzi nie pojawiają się w rzeczywistym programie):
źródło
J=YmOvwvw
zamiastVvwaYOvw;JY
, który jest o 2 bajty krótszy. Nie przejrzałem drugiego kodu, ale myślę, że można tam również skrócić kilka rzeczy.Python 2, 210-150 = 60
Pierwsze wyzwanie tylko do tej pory. Wypróbuj online
źródło
Pip,
4342 bajty - 150 = -108Traktuje wymiary tablicy jako argumenty wiersza poleceń (z D domyślną z liczby argumentów). Przyjmuje domysły jako liczby rozdzielone spacją na standardowym wejściu.
Ten kod w dużym stopniu wykorzystuje funkcje programowania tablic Pipa. Tablica argumentów cmdline jest przechowywana w
g
. Generujemy punkt się domyślić, mapując operatora randrangeRR
nadg
i pociągnąć otrzymanej listy doy
zmiennej. Następnie pojawia się główna pętla while, w której warunek jest następujący:Jeśli odległość była niezerowa, drukuje ją wewnętrzna część pętli. Jeśli było zero, osiągnęliśmy punkt docelowy; pętla zatrzymuje się, a program wyświetla komunikat o zwycięstwie i liczbę zwojów.
Przykładowy przebieg:
źródło
R, 134-150 = -16 bajtów
źródło
Haskell, 240-150 = 90
źródło
Dyalog APL ,
7771–210 = -139Dobrze:
Zauważ, że działa to w indeksie origin 0 (
⎕IO←0
), który jest domyślny w wielu APL-ach.Pobiera tryb logiczny jako prawy argument (
M
), a rozmiary wymiarów jako lewy argument (S
).Liczba wymiarów to
D
, którą należy ustawić (np.D←3
) Przed wywołaniem, zgodnie z OP).P←?S
cel otrzymuje losowy punkt w zakresie 1, choć każda z granic wymiaru{
…}⍣≢C←0
Powtarzaj funkcję, aż wynik będzie inny niżC
, który początkowo otrzymuje0
?2
losową liczbę 0 lub 1¯1 1[
…]
indeks z listy dwóch liczbM×
pomnożonych przez tryb; sprawia0
, że jeśli trybem jest0
D↑
pad z0
s, aby dopasować liczbę wymiarów,(?D)⌽
losowo obracaj listę (od 0 do liczby wymiarów-1)P+
dostosuj aktualnyS|
moduł światowego rozmiaru celuP←
zapisz nowe dane wejścioweC+←1
licznika przyrostu punktu celuP≢G←⎕:
, a jeśli różni się on od punktu celu, to ...P-G
odległości w każdym wymiarze2*⍨
kwadratowym+/
zsumuj je.5*⍨
pierwiastek kwadratowy,⎕←
który0⊣
zwróci 0 (tj. identyczny z wartością początkową, więc powtórz)C
... inaczej, zwróć liczbę domysłów (która różni się od 0, zatrzymuje zapętlenie i zwraca ostatnią wartość)źródło