Rozważ tę wersję ASCII mechanizmu podobnego do maszyny do fasoli lub gry Plinko / Pachinko :
O
^
\ ^
^ ^ \
\ ^ / ^
U U U U U
1 2 3 4 5
O
Jest piłka, która spada w dół.
- Kiedy trafi w
^
, istnieje 50-50 szans, że pójdzie w lewo lub w prawo. - Kiedy uderza w
/
, zawsze idzie w lewo. - Kiedy uderza w
\
, zawsze idzie dobrze.
Piłka ostatecznie wpada do jednej z ponumerowanych U
korytek na dole. Pytanie brzmi: jakie jest prawdopodobieństwo, że skończy w każdej niecce?
W tym konkretnym przypadku, to prawdopodobieństwo 0.0
, 0.1875
, 0.5625
, 0.125
i 0.125
, dla korytek 1 do 5 odpowiednio.
Oto kolejny przykład z 3 niecek zamiast 5. są szanse 0.5
, 0.5
oraz 0.0
:
O
/
^ ^
U U U
1 2 3
W tym wyzwaniu uogólnimy ten problem na mechanizm z dowolną liczbą warstw skonfigurowanych w dowolny sposób.
Wyzwanie
Napisz program lub funkcję, która przyjmuje reprezentację ASCII struktury piramidy mechanizmu. (Wprowadzane przez stdin / wiersz poleceń / funkcję arg.)
Możesz albo założyć, że wchodzi ze spacjami, które nadają mu odpowiedni kształt, np
^
\ ^
^ ^ \
\ ^ / ^
Możesz też założyć, że wchodzi bez spacji, np
^
\^
^^\
\^/^
(W razie potrzeby możesz założyć, że istnieje nowa linia i / lub jakiś spójny wzór spacji końcowych).
Struktura piramidy wejściowej może mieć dowolną liczbę poziomów (czyli linii), w tym zero. Każdy poziom zawiera jeden ^
, /
lub \
od poprzedniego, a są levels + 1
niecki na dnie (nie będące częścią wejściu).
Twój program / funkcja musi wydrukować / zwrócić listę prawdopodobieństw, że kula wyląduje w każdej z koryt (w kolejności od lewej do lewej do lewej). Powinny to być wartości zmiennoprzecinkowe, które po wydrukowaniu mają co najmniej 3 miejsca po przecinku (zbędne zera lub kropki po przecinku nie są wymagane; 1
jest w porządku dla 1.000
, .5
jest w porządku 0.500
itp.). Jeśli napisałeś funkcję, możesz wydrukować wartości lub zwrócić listę / tablicę liczb zmiennoprzecinkowych.
Każdy rozsądny format listy drukowanej jest w porządku. np 0.5 0.5 0.0
, [0.5 0.5 0.0]
, [0.5, 0.5, 0.0]
, {0.5, 0.5, 0.0}
, lub 0.5\n0.5\n0.0
będzie wszystko w porządku.
Przykłady
0 poziomów: (sprowadza się do jednego trywialnego U
)
Wejście: [no input/empty string given]
Wyjście:1.0
1 poziom:
Wejście: ^
Wyjście:0.5 0.5
Wejście: /
Wyjście:1.0 0.0
Wejście: \
Wyjście:0.0 1.0
2 poziomy: (drugi przykład powyżej)
Wejście:
/
^ ^
Wynik: 0.5 0.5 0.0
3 poziomy:
Wejście:
^
^ ^
^ ^ ^
Wynik: 0.125 0.375 0.375 0.125
Wejście:
\
/ \
/ / \
Wynik: 0.0 0.0 0.0 1.0
4 poziomy: (pierwszy przykład powyżej)
Wejście:
^
\ ^
^ ^ \
\ ^ / ^
Wynik: 0.0 0.1875 0.5625 0.125 0.125
7 poziomów:
Wejście:
^
/ ^
^ ^ /
/ \ / \
^ ^ / ^ \
^ \ ^ \ / ^
\ ^ ^ ^ \ ^ /
Wynik: 0.0 0.09375 0.28125 0.4375 0.1875 0.0 0.0 0.0
Punktacja
Najkrótsza odpowiedź w bajtach wygrywa. Tiebreaker jest wcześniejszym postem.
źródło
Odpowiedzi:
CJam,
50 48 45 44 4240 bajtówOczekuje to, że dane wejściowe będą pozbawione spacji i będą miały końcowy znak nowej linii. Na przykład:
Algorytm
Podstawową ideą jest to, że nadal analizujesz każdy znak (są tylko 4 różne znaki) i wykonujesz różne operacje na rozkładzie prawdopodobieństwa (początkowo tablica zawierająca 1 element o wartości 1). Dla każdego wiersza znaków wejściowych (zaczynając od pierwszego znaku w pierwszym rzędzie) utrzymujemy tablicę prawdopodobieństwa o tym samym rozmiarze. Każda postać działa na podstawie pierwszego prawdopodobieństwa z listy i przesuwa wynikową parę na koniec listy. Po każdej linii sumujemy pary z listy, aby uzyskać dokładną liczbę pozycji jako pozycji w następnym wierszu.
Oto cztery znaki i wymagane czynności odpowiadające każdej z nich:
^
: Kiedy ta postać występuje, dzielisz obecne prawdopodobieństwo na dwie części. Na przykład, jeśli mamy to w pierwszym wierszu, musimy przekonwertować[1]
na[0.5 0.5]
/
: Kiedy wystąpią te znaki, musimy umieścić<current probability> 0
w tablicy aktualne prawdopodobieństwo.\
: Kiedy wystąpią te znaki, musimy umieścić0 <current probability>
w tablicy aktualne prawdopodobieństwo.\n
: Kiedy pojawia się ten znak, mamy nową linię. W ten sposób grupujemy wszystkie pary powyżej 3 znaków i sumujemy je, aby uzyskać prawdopodobieństwo każdego elementu w następnym wierszu. Np.[0 0.5 0.25 0.25]
zostaje przekonwertowany na[0 0.75 0.25]
. Zauważ, że pierwszy i ostatni element mają ukrytą parę (o wartości 0) przed nimi i po nich.Teraz musimy tylko zidentyfikować odpowiednią postać i wykonać właściwą akcję. Wykorzystajmy tutaj zwykłe matematyki. Kody ASCII
^
,\
,/
i\n
są94
,92
,47
, i10
. Po kilku próbach otrzymujemy to proste równanie, aby przekonwertować te liczby na 0, 1, 2 i 3:daje:
W tablicy o długości 4 ostatnia
4f%
byłaby domyślna. Więc po prostu wykonujemy%13
kod ASCII znaku i wybieramy odpowiednią akcję z szeregu akcji.Objaśnienie kodu :
Wypróbuj online tutaj
źródło
Ruby 140
Funkcja, która przyjmuje jako dane wejściowe ciąg znaków (może być ładnie sformatowany jako piramida) i zwraca tablicę liczb zmiennoprzecinkowych.
Przetestuj online: http://ideone.com/kmsZMe
Dość prosta implementacja. Tutaj nie jest golfem:
źródło
Rubinowy, 140
158bajtówNie kontynuuj głosowania, gdy jest lepsza wersja ruby .Oto więcej sztuczek dla Ciebie.Funkcja bez nazwy z jednym argumentem. Nie może zawierać spacji. Może lub nie może zawierać końcowy znak nowej linii.
Marnuje 9 bajtów na konieczność obsługiWszystkie przypadki testowe działają poprawnie, patrz tutaj w ideone .0 levels
(pusty ciąg).źródło
split
.Pyth,
434241 bajtówOczekuje się, że wejście będzie bez spacji. Wypróbuj online: Pyth Compiler / Executor
Pyth, 40 bajtów (wątpliwy)
Dzięki @isaacg za zaoszczędzenie jednego bajtu. Zauważ, że ta wersja tak naprawdę nie działała w wersji Pyth, kiedy zadano pytanie. W kompilatorze był mały błąd. Pomimo tego, że ten kod nie używa żadnych nowych funkcji Pyth (tylko rzeczy, które były w dokumentach Pyth przez długi czas i powinny powinny działać), może to nie być poprawna odpowiedź. Zdecyduj sam.
Wypróbuj online: Pyth Compiler / Executor
Wyjaśnienie:
Na przykład, jeśli obecnie mam prawdopodobieństwa wejściowe
G = [0.5, 0.5, 0.0]
i wierszH = "^/^"
dzieje się tak:[(0.5,"^"), (0.5,"/"), (0.0,"^")]
[[0.25,0.25], [0.5,0.0], [0.0, 0.0]]
[0, 0.25, 0.25, 0.5, 0.0, 0.0, 0.0]
[0,0.25], [0.25,0.5], [0.0,0.0], [0.0]]
[0.25, 0.75, 0.0, 0.0]
źródło
hk
.,K@[ZJhkcJ2)x"\/"ek-JK
C #,
274247 bajtówNic szczególnego, kompletny program, który odczytuje wiersze (ze spacjami lub bez, po prostu je rozdziela) ze STDIN i drukuje wyniki rozdzielone spacjami do STDOUT.
Kod Tidier z komentarzami:
źródło
Python 3, 113
Wielokrotnie aktualizuje wektor prawdopodobieństwa
P
w odpowiedzi na każdą linię. Ten nowy wektor prawdopodobieństwaQ
jest tworzony pojedynczo. Iteruje przez nowe gniazda i oblicza wkładkę z kołka po prawej stronie asr
, a także oblicza pozostałą część do nadchodzącego gniazda jakop-r
.Oczekuje, że każda linia zakończy się co najmniej jedną spacją, aby uniknąć problemu, w którym linie kończą się odwrotnym ukośnikiem.
źródło
input()
mógł sobie z tym poradzić.Python 3, 138 bajtów
Działa z dowolnymi białymi spacjami, ponieważ wszystkie są odfiltrowywane (według
if'!'<e
).Metoda:
r
prawdopodobieństw dotarcia do przeszkód i ukrytych dolin poniżej nich. Zaczynamy od listy[1]
.0
do listy dla wiodącej rynny. Decydujemy, czy jest to pierwsza przeszkoda, porównując jej indeksp
z kolejną liczbą trójkątnąt*-~t/2
.^:0.5 0.5; /:1 0; \:0 1
). Używamy następującej metody:v = ord(char) mod 7 + 1
plonowanie^:4 /:6 \:2
v div 3 / 2
daje pierwszą frakcję (^:0.5 /:1 \:0
)v mod 3 / 2
daje drugą frakcję (^:0.5 /:0 \:1
)t + 1
elementem końcowej listyr
.2 bajty dzięki poradom na czacie @ Sp3000.
źródło
Perl, 78
Pobiera dane wejściowe bez spacji.
Spróbuj mnie .
źródło
TI-BASIC,
7376Pobiera dane wejściowe po jednym wierszu i kończy się, gdy spacja jest wprowadzana samodzielnie, ponieważ ani łamanie wierszy w łańcuchach, ani puste ciągi znaków nie są dozwolone w TI-BASIC.
Jestem prawie pewien, że mam odpowiedni rozmiar (TI-BASIC jest tokenizowany, więc każde polecenie zajmuje jeden lub dwa bajty - seq () zajmuje jeden, inString () zajmuje dwa, dim () bierze jeden itd. I ręcznie policzyłem rozmiar.)
Chociaż znak odwrotnego ukośnika jest prawidłowy w ciągu, pamiętaj, że nie można wprowadzić go z poziomu programu, chyba że zmodyfikowałeś kalkulator.
źródło
JavaScript - 117
Próbowałem użyć rekurencji, ale to było za długo ...
Czapka dla Xnora za pomysł odejmowania, który ogolił kilkanaście lub więcej postaci.
Nie golfowany:
źródło