Dlaczego symulator?
Dzieci w dzisiejszych czasach nie mają czasu ani ambicji, aby chodzić i układać pudełka na pilarce lub bawić się równoważeniem przedmiotów fizycznych. To pozostawia wiele miejsca na rynku oprogramowania dla Lever Simulator, który według moich modeli będzie sprzedawać się jak szalony!
Potrzebna pomoc w programowaniu
Złożyłem patent na taką grę (w toku), ale potrzebuję specjalistycznego programisty, aby napisał dla mnie logikę gry. Z mojego zrozumienia, standardową praktyką jest kompensowanie programistów na podstawie wielkości w bajtach końcowego programu. W związku z tym zawrę ten lukratywny kontrakt z najniższą ceną.
Specyfikacja
Dźwignia to seria pudeł lub pustych przestrzeni, które są zrównoważone przez punkt podparcia. Każde pudełko ma określoną wagę od jednego do dziewięciu, a spacje nie mają wagi. Jak wiadomo, ciężar pudełka na dźwigni jest wprost proporcjonalny do odległości tego pudełka od punktu podparcia. Skrzynia ciężaru, 4
która znajduje się na trzecim polu od punktu podparcia, wniesie 12
skuteczne jednostki siły do tej strony dźwigni.
Potrzebuję programu, który, biorąc pod uwagę dźwignię wejściową, wyświetli, czy dźwignia będzie przechylać się w lewo, w prawo, czy będzie idealnie wyważona.
Wytyczne I / O
- Napisz mi program.
- Dane wejściowe będą zawierać jeden wiersz tekstu.
- Dane wejściowe będą pochodzić z
stdin
lub jako jeden ciąg wiersza polecenia. - Pola będą reprezentowane przez znaki
1
„do9
”. Te postacie reprezentują ich wagi. Puste miejsce będzie reprezentowane przez spację ''. Punkt podparcia będzie reprezentowany przez karetkę '
^
'.
Przykładowa dźwignia wprowadzania może wyglądać następująco: 8 2^ 941
Ta dźwignia jest idealnie wyważona: (4*8) + 0 + 0 + (1*2) == 0 + (2*9) + (3*4) + (4*1) == 34
- Nie będzie spacji wiodących ani końcowych. Nie będzie końca nowej linii.
- Nie trzeba obsługiwać źle sformułowanych danych wejściowych, dane wejściowe zawsze będą miały dokładnie jeden punkt podparcia, a jedynie liczby i spacje.
- Dane wyjściowe wskażą, czy dźwignia jest ciężka w lewo, prawa w prawo, czy zrównoważona.
- Twój program musi mieć dokładnie 3 możliwe wyniki, które mogą wynikać z dobrze sformułowanego wejścia. Możesz wybrać, jakie to są.
- Dane wyjściowe muszą być wydrukowane
stdout
lub być kodem zwrotnym programu.
Przypadki testowe
Tutaj używam L
, R
, B
oznacza lewy ciężki prawym ciężki, zbilansowany:
Wejście:
11 ^9
Wyjście:B
Wejście:
321^ 12
Wyjście:L
Wejście:
9^ 1
Wyjście:R
(Jeśli ktoś ma jakieś „trudniejsze” przypadki testowe, możesz je edytować).
Bibliografia
Niekoniecznie zainspirowany, ale związany z Równowagą zestawu ciężarów na huśtawce
źródło
The output must either be print to stdout or be the return code of the program.
Cóż, teraz prosisz mnie o zrobienie dystrybucji Linuksa, która używa notacji huśtawki dla kodów wyjścia.^16
,16^
lub^
? (Załóżmy, że może)Odpowiedzi:
Python 2, 69 bajtów
Moduł
ord(c)%16
wyodrębnia wartość znaku cyfry, otrzymując 0 dla spacji. Dla każdego znaku jego udział momentu obrotowego jest obliczany jako waga razy iloczyn oznaczonej odległości do osi obrotui-s.find('^')
, a następnie są one sumowane i porównywane z 0, dając jeden z nich-1,0,1
.^
Obliczona postać ma wagę 14, ale to nie ma znaczenia, ponieważ znajduje się na osi obrotu.18-bajtowy Pyth portu przez Maltysen:
W przypadku kodu Python, jeśli wymagany jest pełny program, oto 79 bajtów. Chodzi o to, aby rozpocząć
i
przesunięcie indeksus.find('^')
i pozwolić mu odliczać.źródło
JavaScript ES6, 62 bajty
-1
jeśli pozostawiony jest cięższy0
jeśli zrównoważony1
jeśli prawo jest cięższeNie golfowany:
Uruchamianie testowe (przypisywanie funkcji anonimowej
f
):R B L
na-1 0 1
e.split``
na[...e]
(dzięki @ Vɪʜᴀɴ)~~'^'
ocenia na0
...)źródło
f=
i powiedzieć, że generuje on anonimową funkcję. (-2 bajty FYI)Japt , 22 bajty
Japt to skrócona wersja Ja vaScri pt . Interpretator
Zwraca
-1
zaL
,0
zaB
i1
zaR
.Jak to działa
źródło
APL,
3930 bajtówPo ponownym przeczytaniu reguł zmieniłem to na wyjście
-1
0
1
zamiastL
B
R
, oszczędzając dziewięć bajtów.Wypróbuj tutaj .
źródło
Pyth, 20 bajtów
Zestaw testowy
-1
dla stronniczości z lewej strony,0
dla równowagi,1
dla stronniczości z prawej strony.Jak to działa:
źródło
Haskell,
116968276 bajtówWyjście jest
0
dla zbalansowanego,-1
dla lewych ciężkich i1
dla prawych ciężkich.Przykład użycia:
f "321^ 12"
->-1
Jak to działa: znajdź część przed
^
. Pomnóż ciąg wejściowy i listę wag, które zaczynają się od- length-of-first-part
.^
Ma masę równą 0 i nie dodawać do sumy. Używam sztuczki mod @ xnor 16 do konwersji cyfr / spacji na wartości całkowite. Jeśli suma jest ujemna (dodatnia), dźwignia jest ciężka w lewo (prawa-ciężka) i zrównoważona, jeśli suma wynosi 0.źródło
TeaScript , 23 bajty
25Próbowałem napisać odpowiedź w języku Pyth, ale poszło to okropnie: \
To
²
wygląda tak nie na miejscu, ale pozwala zaoszczędzić 1 bajt, więc go zatrzymam.Wypróbuj online!
Przetestuj wszystkie przypadki
Do schematu wyjściowego wybrałem:
-1
jeśli lewy jest cięższy niż prawy (L
)0
jeśli lewy jest tak ciężki jak prawy (B
)1
jest lewy jest mniej ciężki niż prawy (R
)Niegolfowane i objaśnienia
Używa map i zmniejsza, aby wykonać zadanie.
źródło
pb ,
349329 bajtówTo było trudne. PB nie został zaprojektowany, aby być dobrym w tego typu rzeczach.
Nie ma nawet mnożenia .Ale hej, to działa.Najtrudniejszą częścią było, po uzyskaniu sum (waga * odległość) dla każdej strony, w rzeczywistości określenie, którą literę wydrukować. PB nie ma
>
ani<
operatorów, tylko==
i!=
. Nie ma łatwego sposobu na określenie, która wartość jest większa. Nie mogę nawet odjąć i porównać z 0 ... chyba że zrobię coś naprawdę głupiego.Następnie po prostu przejdź do X = (lewa strona - prawa strona) i tam jest twoja odpowiedź! Usuń wszystko w tym wierszu, aby wyczyścić, a następnie wydrukuj wartość znalezioną w (0, 0).
... Ale jest nieco krótsza droga. Zamiast używać „L”, „B” i „R”, użyj tych wartości - „B” i dodaj ponownie „B” podczas drukowania. W ten sposób nie musisz nigdy ustawiać „B” na X = 0, po prostu pozostawiasz ją jako 0, którą już było. Jedynym problemem jest to, że po wykonaniu tej czynności program staje się bardzo głupi w trybie zegarka.
'L'-'B'==76-66==10=='\n'
. Wydaje się, że wszystko działa dobrze, dopóki nagle nie wydrukowano ogromnej liczby nowych linii i nie można śledzić, co się dzieje: D W zwykłym trybie wykonywania pbi wszystko działa jednak dobrze, ponieważ nowe linie są usuwane, zanim cokolwiek zostanie wydrukowane na konsola.źródło
Perl 5, 72 bajtów
źródło
MATLAB 91, 57, 55Oktawa, 50 bajtówNie spodziewałem się grać w golfa dalej, ale przejście na Octave pozwoliło zaoszczędzić 5 dodatkowych bajtów! Wow, ten zajął trochę czasu ...
Wysyła go
-Inf, NaN, Inf
doL, B, R
odpowiednio.Zestaw testowy!
Wyjaśnienie:
Jest to z pewnością trudny do odczytania kod, ale postaram się wyjaśnić najlepiej, jak potrafię. Będę przełączać się między objaśnieniem bloku kodu a tekstem.
Spójrzmy na to, co dzieje się w nawiasach:
Ten jest nieco trudny:
Liczby po każdej stronie drabiny należy pomnożyć przez odległość od karetki. Jeśli użyjemy liczb ujemnych po lewej stronie, a liczb dodatnich po prawej stronie, możemy po prostu zsumować wektor, aby zobaczyć, która strona jest najcięższa.
Załóżmy, że ciąg wejściowy jest:
'321^ 12'
. Chcemy, co następuje:3*(-3)+2*(-2)+1*(-1)+1*3+2*4
. Wektor, który wykonaliśmy w nawiasach, zaczyna się od1-i
, czyli w tym przypadku-3
, ponieważ daszek znajduje się na 4 pozycji. Idziennz(x)-i
w krokach co jeden. Możemy użyćnnz(x)
zamiastnumel(s)
, ponieważx
jest to ciąg nie zawierający zer.W związku z tym:
Teraz możemy dokonać mnożenia elementarnego
s.*[...]
i zsumować to. Ale ponieważ mamy dwa wektory, możemy również mutliplys
przez transponowanie[...]
i obliczenie sumy za pomocą mnożenia macierzy:To daje nam albo liczbę ujemną, co oznacza, że lewa strona jest cięższa, zero, co oznacza, że jest wyważona, lub liczby dodatnie, co oznacza, że prawa strona jest cięższa. Zamiast naiwnego podejścia
sign(...)
pomnożymy toinf
, co da nam albo,-Inf
alboInf
odpowiednio lewą i prawą. OtrzymujemyNaN
za0*inf
, ponieważ jest niezdefiniowany.To daje nam trzy różne wartości dla trzech możliwych wyników.
źródło
𝔼𝕊𝕄𝕚𝕟, 22 znaki / 38 bajtów
Try it here (Firefox only).
źródło
JavaScript, 146 bajtów
Całkiem masywne.
Demo .
źródło
function t(s){
może się staćt=>{
isplit('^')
może stać sięsplit`^`
Rubin,
111108 bajtówWyjaśnienie
Podsumowuje ważoną wartość każdej liczby z każdej strony. Następnie używa rubinowego operatora statku kosmicznego, aby zapewnić 1,0, -1 równości / nierówności dwóch stron, która jest indeksem tablicy z poprawnym wyjściem.
źródło
PowerShell,
8373 bajtówDzięki TessellatingHeckler dla golfa.
Używa zasadniczo tego samego algorytmu, co poniższy starszy kod, ale tutaj iterujemy kolejno znaki w ciągu wejściowym zamiast iteracji przez indeks, który oszczędza garść bajtów. Nadal wyświetla ten sam spektakularny komunikat o błędzie, gdy algorytm osiąga
^
- nie wpływa na STDOUT.Poprzedni
Używa tego samego niesamowitego algorytmu, co doskonała odpowiedź Dendrobium , a zatem używa tego samego wyjścia,
-1 / 0 / 1
jeśli wejściowyleft-heavy / balanced / right-heavy
.Ugh. Długo z powodu
dziwnejfunkcji rzutowania, którą posiada PowerShell. Najbardziej istotne jest tutajchar
pomnożenie przezint
funkcje. Biorąc indeks tablicystring
wyników wchar
obiekcie. PowerShell konwertuje nachar
odpowiednią wartość ASCII (zamiast dosłownie) przed pomnożeniem. Więc coś$a='012'[0];[int]$a*2
w tym skutkuje96
.Oznacza to, że musimy ponownie rzucić go z powrotem jako ciąg. Jednak samo robienie
string
czasówint
daje namstring
tyle razy. Na przykład$a='0';$a*2
spowodowałoby00
.Oznacza to, że musimy rzucić
char
tylną częśćstring
przed ponownym rzutowaniem, ponieważint
wtedy może nastąpić zwielokrotnienie, zanim dodamy go do naszego akumulatora$x
.Połączmy to z długim sposobem iteracji po łańcuchu i wywołaniem .NET w celu wyprowadzenia znaku, a otrzymamy dość długi fragment kodu.
NB - Spowoduje to spektakularny błąd, gdy dojdzie
^
do łańcucha, stwierdzając, że nie można go przekonwertować naint
. Nie wpływa na STDOUT.źródło
param($b)$i=-$b.indexOf('^');[char[]]$b|%{$x+=$i++*+"$_"};[math]::Sign($x)
74 bajty. Trwało to długo i kilka prób podejścia. matematyka :: znak wygląda tak długo, ale nie widzę żadnego sposobu, aby to poprawić.$i++*+"$_"
jest równoważny z$i++*"$_"
if$i
jest int.CJam, 29 bajtów
Wypróbuj online
Wynik jest
-1
dla lewych ciężkich,0
dla zrównoważonych,1
dla prawych ciężkich.Wydawało się to nieco długie, ale wypróbowałem kilka alternatywnych rozwiązań, które skończyły od 29 do 33 bajtów. Jednym z problemów jest to, że nie mogłem znaleźć sposobu na konwersję łańcucha na wartości, które automatycznie spowodowałyby 0 dla spacji. Skończyłem więc jawnie, zastępując spacje znakami „0”, co oczywiście zwiększa długość kodu.
Wypróbowane alternatywy:
ee
operatora dodaj indeks do listy wartości.Wyjaśnienie:
źródło
Python 3,
196114 bajtówZwykły kod:
Wyjaśnienie:
stdin
.Ogromne podziękowania dla @ThomasKwa za przycinanie 82 bajtów (ponad 40%) taniej!
źródło
print('LBR'[(B>D)-(B<D)])
na koniec iB=D=0
na początku.^
. To też cię oszczędzaabs()
.C,
140139138134100 100 bajtówPowrót:
Biegać:
Jak mamy ASCII:
Otrzymujemy:
Następnie sumuj według współczynnika odległości do
^
.źródło
SpecBAS - 140 bajtów
t
jest sumą bieżącą, wartości są ujemne, gdy pozycja postaci jest większa niż pozycja karat. Na końcu sprawdza, czy suma jest ujemna, zero lub dodatnia i wypisuje odpowiedni znak R, B lub L.Mógłbym ogolić kilka bajtów po prostu wypisując -1, 0 lub 1, jak niektóre inne odpowiedzi.
źródło
Java, 83 bajty
źródło