Przegląd
Biorąc pod uwagę ciąg 3 linii, dowiedz się, czy struktura spada w lewo, balansuje lub spada w prawo.
Struktura wejściowa
Możesz sobie wyobrazić tę konstrukcję jako metalowy pręt z elementami na górze, wszystkie wyważone na pionowym pręcie.
1 7 4 a
===============
|
Pierwszy wiersz to pozycje. Waga każdego przedmiotu jest obliczana jako wartość ascii znaku minus 32. (Znaki poniżej 32 nie są brane pod uwagę, a spacje ważą 0). Pamiętaj, że siła przedmiotu na pręcie to jego waga razy odległość do punktu obrotu.
Druga linia to pręt. Każda długość pręta sama waży 1 jednostkę. Ta linia jest wyłącznie równa znakom ( =
).
Trzecia linia to punkt obrotu. Można go umieścić w dowolnym miejscu i jest reprezentowany przez pewną liczbę spacji, po których występuje pojedynczy |
znak pipe ( ).
Przykłady
Wkład:
===== |
Wyjście: Balance
Wkład:
===== |
Wyjście: spada w lewo
Wkład:
% ===== |
Wyjście: Balance (ponieważ %
waży wystarczająco dużo, aby przeciwdziałać ciężarowi lewej strony pręta)
Wkład:
aa ======= |
Wyjście: spada w prawo (ponieważ a
po prawej stronie znajduje się dalej od punktu obrotu)
Wkład:
1 7 4 A
===============
|
Wyjście: spada w lewo
Wkład:
1 7 4 a
===============
|
Wyjście: spada w prawo (małe litery są ciężkie!)
Wkład:
$ ~
===============
|
Wyjście: Balance
Notatki
- Końcowe białe znaki są dozwolone, wiodące białe znaki nie.
- Twój program może wyświetlać dane w dowolnym formacie, pod warunkiem, że istnieją 3 różne wyjścia dla lewego, balansu i prawego.
- Twój program musi zaakceptować format pokazany jako dane wejściowe.
Odpowiedzi:
JavaScript (ES6),
116111108106 bajtów-5 bajtów przez zsumowanie przez
eval(array.join`+`)
zamiastarray.reduce()
.-3 bajty domyślnie
1
zamiast32 - 31
, co pozwala na usunięcie nawiasów.-2 bajty, ponieważ punkt obrotu jest długością ostatniej linii - 1
Wyjścia
-1
,0
lub1
na lewo, zrównoważony, lub w prawo, odpowiednio. Skończyło się podobnie do odpowiedzi pytona Chasa Browna , więc trafia się tam.Można zapisać 4 bajty, jeśli pierwsza linia jest wypełniona, aby dopasować długość pręta za pomocą
(31-t.charCodeAt(i))*(b.length+~i)
.Test Snippet
Obejmuje dodatkowe dane wyjściowe (
Left
/Balanced
/Right
) wraz z liczbą.Kolejna metoda 106-bajtowa
Zamiast
join
ingerować w tablicę+
s, tworzymy ciąg liczb, każdy z prefiksem+
. Prowadzenie+
zostaje zignorowane.źródło
(b.length+~i)
może pomóc uratować bajt. (Również nie rozumiem, dlaczego masz||1
.)b.length+~i
zwraca minusi-b.length+1
; to mogłoby pomóc, gdybym mógł zaprzeczyć drugiej części. A jeśli chodzi o to||1
, to dlatego, że zakładałem, że pierwsza linia nie była wyściełana, aby pasowała do długości wędki, więct.charCodeAt(i)
wrócęNaN
poza koniec pierwszej linii.Python 2 ,
112110 bajtówWypróbuj online!
EDYCJA: W końcu udało się wyeliminować
enumerate
irjust
za marne 2 bajty ... meh!Wciąga sznur; wyjścia -1,0 lub 1 dla odpowiednio spadków w lewo, równowagi, spadków odpowiednio w prawo.
Pierwszy przebieg przy 112 bajtach to:
źródło
(ord(c)-31)
Zajęło mi trochę czasu, aby zdać sobie sprawę, że tak naprawdę obejmuje to ciężar samej wędki wraz z przedmiotami. Bardzo mądry!return
zprint
na -1 bajt (choć tak naprawdę nie grać ładnie z aktualnym kodem TIO).Haskell,
212171 bajtów (188 jeśli weź dane wejściowe jako jeden ciąg)Wariant 171 bajtów
Wariant 188 bajtów
Wyjaśnienie
źródło
fromEnum
zamiastord
i upuścićimport
.c
można go uprościć doc p=max(ord p-32)0
(lub zfromEnum
), a ponieważ używasz go tylko raz, wstaw go.c
można nawet uprościć (znaki poniżej 32 nie są brane pod uwagę)c p=ord p-32
.p
Jest także w zasadzielength
(minus 1), więc teżp x=length x-1
by działał (i można go również wstawić). Zobacz także moje rozwiązanie, w jaki sposób korzystamsignum
- możesz zrobić,r o l s = signum $ 2 * z ...
które zwraca0,1,-1
B, L, R.[3,4,7]
i przyjmuje 3 ciągi zamiast jednego. (patrzlines
).Galaretka , 30 bajtów
Pakiet testowy
Wyjścia 0 dla zbalansowanego, 1 dla prawego i -1 dla lewego.
Jak to działa
źródło
Galaretka , 24 bajty
Wypróbuj online!
-1
do opadania w lewo,0
do równoważenia,1
do opadania w prawo (pełny program).[-1]
do opadania w lewo,[0]
do równoważenia,[1]
do opadania w prawo (funkcja).Pierwsza linia musi mieć końcowe spacje, ostatnia linia nie może.
Objaśnienie (zaczynamy od dolnej linii):
Po pierwsze, pracujemy z poszczególnymi liniami, więc musimy jakoś je zdobyć. To jest praca dla
Ỵ
. Następnie musimy traktować\n
wersję -split wejścia tak, jakby była to oryginalna, więc używamyµ
aby monadyczny łańcuch zastosowano do bieżącej wartości.Teraz zaczynamy prawdziwą pracę, a naszą pierwszą pracą będzie obliczanie współczynników wag. Zasadniczo jest to zakres [odległość od skrajnej lewej do osi obrotu .. 0 .. odległość od osi do skrajnej prawej strony]. Przede wszystkim musimy znaleźć indeks przestawny oparty na 1, który jest zasadniczo długością ostatniego wiersza bez spacji końcowych. Więc wstawiamy ostatnią linię (linię przestawną) z naszej oryginalnej listy
Ṫ
, ponieważ nie będziemy jej już potrzebować, a następnie bierzemy jej długośćL
. Następnie musimy wziąć długość wędki, dla której robimy to samo z ostatnią linią (linią wędki)ṪL$
. Wreszcie, aby uzyskać zasięg, mapujemy | x - y | na [1.. długość produktu], gdzie x jest indeksem przestawnym, ayto każdy element listy, na której mapujemy. Robimy to za pomocąạЀ
, gdzieạ
oblicza | x - y | iЀ
tworzy zakres od 1 do długości pręta włącznie. Teraz będziemy mieć odpowiedni zasięg.Następnie musimy pomnożyć każdą liczbę całkowitą, reprezentującą kawałek pręta, z odpowiadającym mu ciężarem. Aby obliczyć wagi, używamy
Ç
, przechodząc do górnej linii naszego kodu. Bierzemy pozostałą linięṪ
, jej kody za pomocąO
, a następnie obliczamy x - 31 za pomocą_31
, gdzie x jest każdym kodem znaków. Następnie przypisujemy spację do wagi 1 (0 + kawałek pręta = 1),!
do wagi 2 (1 + 1) itd. Skończyliśmy z górną linią, więc terazÇ
zwróciłoby listę wag, które mnożymy przez odpowiedni liczby całkowite reprezentujące kawałki pręta z×
.Następnie dzielimy się
ṣ0
na punkt obrotu reprezentowany przez 0 (ponieważ żadna waga nie wpłynie na wynik), w wyniku czego powstaje lista postaci [[1. waga, 2. waga ... waga tuż przed osią obrotu] , [waga tuż po osi obrotu, waga po poprzedniej ... ostatniej wadze]]. Te listy reprezentują boki pręta, lewy i prawy. Teraz sumujemy każdą z list za pomocą,S€
aby uzyskać całkowitą wagę z każdej strony, i używamyI
do wzięcia delty, która będzie ujemna, jeśli lewa strona jest cięższa, zero, jeśli są równe, i dodatnia, jeśli prawa strona jest cięższa . Tak więc, aby przywrócić wynik końcowy przy użyciu tego poprawnie na naszą korzyść, bierzemy znak zṠ
.źródło
APL (Dyalog) , 43 bajty *
Wypróbuj online!
⊆⊢
podziel argument na ciągi znaków, które są⎕TC[2]∘≠
różni się od 2- giej litery C terminala sterującego (podawanie liniowe ) **{
…}
Zastosuj następującą anonimową funkcję na liście ciągów:⊃⌽⍵
w pierwszym ciągu odwróconej listy (tj. ostatnim)'|'⍳⍨
znajdź końcówkę punktu obrotu(
…)-
Odejmij to od następującej listy:⊃⍵
pierwszy ciąg≢
jego długość⍳
wszystkie ɩ ndices tego(
…)+.×
Suma ważona z tymi wagami i następującymi wartościami:⊃⍵
pierwszy ciąg⎕UCS
Punkty kodu w U niversal C haracter S i¯31+
dodaj ujemny trzydzieści jeden (32 dla wymaganego przesunięcia minus jeden dla pręta)×
podpis tego* Dla 1 bajtu na znak, użyj
{×(¯31+⎕UCS↑⍵)+.×(⍳≢↑⍵)-'|'⍳⍨↑⌽⍵}⎕TC[3]∘≠⊂⊢
z⎕ML←3
. Wypróbuj online!**
⎕TC
jest przestarzałe i używane tutaj tylko do celów golfowych. W kodzie produkcyjnym należy użyć⎕UCS 10
.źródło
Haskell (Lambdabot), 142 bajty
Wypróbuj online!
Wersja bez golfa:
źródło
Python 2 , 90 bajtów
Oczekuje, że linie wejściowe zostaną wypełnione (spacjami) do odpowiedniej długości. Wyjścia
-1
dla spadków w lewo ,0
dla zrównoważonych i1
dla spadków w prawo .Wypróbuj online!
94 bajty
Dla +4 bajtów możemy mieć wersję, która za pomocą
while
pętli wymaga linii rozebranych , a nie linii dopełnionych :Wypróbuj online!
źródło
Rubinowy, 543 bajty
źródło
C (gcc) , 106
107121123124129131bajtyZwraca 0 za upadek w lewo, 1 za równowagę i 2 za upadek w prawo.
Wymagaj, aby wszystkie trzy linie miały tę samą długość i kończą się,
\n
aby określić długość łańcucha.Wypróbuj online!
źródło
Mathematica, 91
92bajtyPierwsza linia powinna mieć tę samą długość z wędką. Trzeci wiersz nie powinien zawierać spacji końcowych.
Zwróć -1, 0, 1 za upadek w lewo, równowagę i upadek w prawo.
źródło
C # (.NET Core) ,
1279590 + 18 = 108 bajtówDla tej funkcji pierwsza linia musi być odpowiednio wypełniona spacjami, aby mieć taką samą długość jak pręt, a trzecia linia nie może mieć przestrzeni próbnych. Te warunki są dozwolone (patrz komentarze do pytania).
Wypróbuj online!
Wyjścia:
-1 dla końcówki w lewo
0 dla równowagi
1 dla końcówki w prawo
źródło
Python 3, 217 bajtów
Działa również w Pythonie 2.7
Zwraca 1 dla lewej strony, -1 dla prawej strony lub zero, jeśli jest zrównoważony.
Wersja do odczytu:
źródło
sum([...])
, możesz po prostu miećsum(...)
i[c:].find(e)
możnai.find(e,c)
, używaji,m,n=s.split('\n')
i unikajs
w ogóle potrzeby , używaj,return 2*(r>l) or l>r
aby radykalnie obniżyć koszty testu na końcu (wartość zwracana jest liczbowo równoważna, ale jestTrue
zamiast1
iFalse
zamiast0
), lub naprawdę, użyj innego zestawu zwrotu wartości i wykonaj,return (l>r)-(r>l)
aby zwrócić 1, 0 lub -1, tak jakcmp
zrobiła to stara funkcja.i[c:]
ponieważ krótsza droga spowodowała dziwny problem off-by-one dla niektórych danych wejściowych w rogu (spróbuj umieścić|
dokładnie na środku - powyżej paska).PHP, 105 bajtów
drukuje
-1
/0
/1
dla left / balance / right. Uruchom jako potok z-nR
lub spróbuj online .awaria
źródło
Węgiel drzewny , 31 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjścia 0 dla równowagi lub -1 lub 1 dla spadku w lewo lub w prawo. Edycja: Zmiany w węglu drzewnym oznaczają teraz, że
≔ΣEθ×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
działa na 24 bajty: Wypróbuj online! Link jest do pełnej wersji kodu. Uwaga: Obie odpowiedzi wymagają wprowadzania wypełnionego, ale można je dostosować tak, aby akceptowały dane niepodawane przy koszcie 3 bajtów:≔⁰ξFLη≔⁺ξ×⁻ι⌕ζ|⁻℅§◨θLηι³¹ξI⁻›ξ⁰‹ξ⁰
Wypróbuj online!≔ΣE◨θLη×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
Wypróbuj online! Linki są do pełnej wersji kodu.źródło