Ustawa o równoważeniu
Piła (podobno z francuskiego „ci-ça”, co oznacza „to-to”) stanowi jedną trzecią świętej trójcy wyposażenia placów zabaw wraz z podobnie wszechobecną zjeżdżalnią i huśtawką. Piła jest w doskonałej równowadze, jeśli i tylko wtedy, gdy suma momentów z każdej strony jest równoważna. Pilarkę można zatem wyważyć, dodając do boku określoną ilość ciężaru z sumą niższego momentu; osiągnięcie tego jest twoim celem tego wyzwania.
Wyzwanie
Twoim zadaniem jest zobrazowanie piły jako wkładu i wyprowadzenie jej ponownie, z dodanym ciężarem na jednym końcu piły, aby ją zrównoważyć.
Wejście
Twój program musi mieć, w dowolnym rozsądnym formacie, znacznik ASCII, taki jak:
100 100
-------------------
^
Pierwszy wiersz zawiera dwie liczby, z których każda reprezentuje wagi na piły. Dokładnie jeden ciężar jest obecny z każdej strony, z których każdy działa na samym końcu swojej deski. Odważniki są gwarantowane jako liczby całkowite i zawsze są wyrównane z odpowiadającym im końcem deski. Liczby te nigdy nie będą zachodzić na fulcrum ( ^
).
Druga linia reprezentuje „deskę” piły. Każda myślnik ( -
) reprezentuje równą długość myślnika, z wyjątkiem myślnika bezpośrednio nad punktem podrzędnym ( ^
), który nie ma długości.
Trzecia linia przedstawia punkt podparcia piły. Punkt podparcia jest oznaczony jedynym znakiem, który nie jest spacją w tej linii, daszkiem („^”). Punkt podparcia można umieścić w dowolnym miejscu na długości deski na ważnym wejściu, pod warunkiem, że pozostanie wystarczająca ilość miejsca, aby liczby reprezentujące wagi nie zachodziły na punkt podparcia ani na wejściu, ani na wyjściu.
Dane wejściowe mają trzy wiersze i nie zawierają spacji przed znakami tworzącymi saw lub po nich (z wyjątkiem oczywiście trzeciej linii, która tego wymaga).
Wynik
Aby wydrukować, to samo przedstawienie piły powinno być wydrukowane na stdout, ale jeden (i tylko jeden) obciążnik należy zastąpić większym ciężarem, aby wyważyć piłę. Wejścia są gwarantowane, aby umożliwić to za pomocą samych liczb całkowitych. Dlatego wagi muszą być pokazywane bez miejsc po przecinku lub innych podobnych oznaczeń. Jeśli twój język nie używa standardowego wyjścia, powinieneś przejść przez konsensus społeczności / meta co do wyników. Końcowe znaki nowej linii są w porządku, ale wszelkie inne zmiany w formacie obrazu prawdopodobnie nie są w porządku.
Egzemplifikacja
Wejścia testowe i odpowiadające wyjścia
Wejście 1
12 22
--------------------
^
Wyjście 1
12 26
--------------------
^
Wejście 2
42 42
-----------
^
Wyjście 2
42 42
-----------
^
Wejście 3
3 16
----------------
^
Wyjście 3
14 16
----------------
^
Wejście 4
1 56
-------------------
^
Wyjście 4
196 56
-------------------
^
Implementacja referencji - Python 3
# Takes a list of strings as input
def balance_seesaw(lines):
weights = [int(w.strip()) for w in lines[0].split()]
length = len(lines[1])
pivot = lines[2].find("^")
left_length = pivot
right_length = length - 1 - pivot
left_torque = weights[0] * left_length
right_torque = weights[1] * right_length
if left_torque > right_torque:
weights[1] = left_torque // right_length
elif right_torque > left_torque:
weights[0] = right_torque // left_length
weights = [str(w) for w in weights]
string_gap = " " * (length - sum(len(w) for w in weights))
lines[0] = weights[0] + string_gap + weights[1]
print("\n".join(lines))
balance_seesaw(["1 56",
"-------------------",
" ^ "])
Zasady
To jest golf golfowy , więc wygrywa najkrótszy kod liczony w bajtach. Sprawdź meta, jeśli liczenie bajtów jest niezręczne w twoim języku.
Obowiązują standardowe zasady / luki.
Dane wejściowe muszą być pobierane w rozsądnym formacie. Niewyczerpująca lista odpowiednich formatów jest podana w następujący sposób:
- Pojedynczy ciąg znaków z wierszami oddzielonymi znakami nowej linii
- Lista ciągów, każdy ciąg reprezentuje linię
- Tablica 2D lub macierz znaków
Powiązane wyzwania
- Zrównoważyć zestaw ciężarów na piłie - Proponowane przez sierpnia 2015 przez samgak
Odpowiedzi:
05AB1E ,
605150494745 bajtówZaoszczędzono 10 bajtów dzięki Emignie i 1 bajt dzięki Adnan.
Wszystkie wiersze wprowadzania muszą mieć taką samą liczbę znaków.
Wypróbuj online!
Powinny istnieć ogólna zasada, na przykład: „jeśli kod 05AB1E jest dłuższy niż 40 bajtów, prawdopodobnie robisz to źle”. Wydaje się, że gra w golfa, każdy pomysł jest mile widziany!
źródło
¬s¤s\‚
może byćõK
.kD²g->(‚
może być,¡€g
jeśli dodasz brakujące spacje w dolnym rzędzie przypadku testowego31SÍ
z1®‚
:)/ ï
w÷
.?JavaScript (ES6), 136
Prawdopodobnie nie działa w Chrome, ponieważ używa zniszczonego przypisania i parametrów domyślnych.Zauważ, że standardowa metoda wyjściowa JS
alert
jest szczególnie nieodpowiednia do tego zadania, ze względu na zastosowaną czcionkę proporcjonalną.Mniej golfa
Test
źródło
Perl, 149 + 2 = 151 znaków
Wymaga opcji wiersza poleceń
-p0
(daje mi to 2 bajty kary na 149 bajtów w samym programie).Wyjaśnienie:
-p0
Przełącznik odczytuje całą wejście do pierwszego bajta NUL lub EOF. Ten problem nie zezwala na wartości NUL, więc domyślnie uzyskamy całą wartość wejściową w zmiennej$_
używanej do wyrażeń regularnych ..+?
), Ale nie mogę uzyskać jej poniżej 3 znaków, więc równie dobrze mogę użyć oczywistości\d+
. Drugi numer znajduje się na końcu wiersza, więc można go parsować jako.+
(2 znaki). Linia środkowa służy do określenia, jak szerokie są skale; jest analizowany jako-+
(działałoby wiele innych reprezentacji). Spacje przed karetką w ostatniej linii to+
. Po pojawieniu się karetki (lub dowolnego spacji) ignorujemy resztę danych wejściowych.$1
,$2
,$3
,$4
. Podanie wyrażenia regularnego jako argumentumap
dodatkowo wykorzystuje tablicę tych grup jako tablicę do odwzorowania. Dlatego bierzemy ich długości; jest to wygodny sposób na przechowywanie długości$3
i$4
bez koniecznościlength
dwukrotnego pisania . Zastępujemy również$_
długością$1
; tak naprawdę nie dbamy o wartość tego (liczba cyfr na lewym wejściu jest dość bezużyteczna), ale fakt, że jest krótki ($_
długość jest teraz liczbą cyfr w liczbie cyfr w pierwsza waga, która z konieczności jest bardzo mała w porównaniu do szerokości łuski).$r
w jakim podziałki są podzielone.$1*$r>$2
sprawdza, która strona jest cięższa. Nowe ciężary przechowujemy w$x
i$y
; mają one bardzo proste obliczenia, gdy znany jest stosunek wag.$x
,$,
oraz$y
w$_
celu wytworzenia górnym rzędzie, a następnie zachować przestrzenie dodawanie ($"
zawiera pojedynczą przestrzeń domyślnie i jest krótsza niż dosłowną przestrzeń' '
będzie) na$,
aż to ta sama długość jak środkowym rzędzie (czyli ma długość$c
). (Wybrałem zmienną,$,
ponieważ jest to zmienna wbudowana, którą można bezpiecznie zmienić w tym kontekście i domyślnie zaczyna się pusta.) Ponieważ domyślnielength
działa$_
, nie musimy jawnie podawać argumentu. Użyłem warunkowego Yoda, ponieważ wymaga on znacznie mniej jednoznacznej składni, aby poprawnie parsować.$\
), aby zawierała resztę zestawu skal (która jest taka sama jak na wejściu, więc mogę po prostu użyć$3
i$4
bezpośrednio, aby wytworzyć większość). Zauważ, że oznacza to, że w trzeciej linii nie ma końcowych białych znaków; dodanie go sprawi, że program będzie nieco dłuższy i nie wydaje się służyć żadnemu celowi, więc go pominąłem.-p
przełącznik ponownie się uruchamia; tym razem wyświetla wynik,$_
po którym następuje „nowa linia” ($\
). Ponieważ na nowo zdefiniowałem nowy wiersz wyjściowy, te dwa niejawne wydruki generują nowy zestaw skal między nimi (chociaż jako efekt uboczny nie ma nowego wiersza na wydruku).-p
Przełącznik teraz próbuje ponownie odczytać wejście, ale już slurped cały plik, tak to brzmi EOF i kończy program.źródło
PHP,
212209205 bajtówprawdopodobnie gra w golfa
Pobiera dane wejściowe z argumentu wiersza poleceń; uciec od nowych linii. Uruchom z
-r
.Zastąpienie symbolem zastępczym nie działało zgodnie z oczekiwaniami; więc musiałem dodać więcej parens do pierwszego wyrażenia regularnego.
źródło
Befunge,
223217 bajtówWypróbuj online!
źródło
>
jak sądzę, został właśnie ze względów estetycznych. To powiedziawszy, wydaje mi się, że mam w swoich notatkach 215 bajtowe rozwiązanie, więc może być to możliwe (to też mam błędy, które wyjaśniłyby, dlaczego nigdy go nie przesłałem - nie mam czasu na testowanie go teraz).Python 2,
184183 bajtówZdecydowanie do gry w golfa
Całkiem proste. Po prostu weź wyregulowane ciężary, aby wyregulować obie strony, zobacz, który z nich jest większy niż oryginał, i zmień to i wyjdź.
EDYCJA Przełączane mnożenie i dzielenie, ponieważ dzielenie liczb całkowitych jest złe (dzięki @JonathanAllan za zauważenie tego)
EDYCJA -1 bajt zmieniony
i().index('^')
nai().find('^')
(dzięki @JonathanAllan [ponownie!])źródło
a=[w[1]*R/I,w[0]*I/R]
(prosty przykład, że nie byłaby praca1
i2
zI
aR
oba3
). Obecnie 194 nie 184 przy okazji, ponieważ nowe linie liczyć jako bajt każdego, alej
ik
kosztują więcej bajtów niż ich uratować.I=i().find('^')
skrótu__repr__
, aby wykonać ostatnią linięprint`w[0]`+' '*(W-len(`w`)+4)+`w[1]`+'\n'+'-'*W+'\n'+' '*I+'^'
i zejść do 182 - repl.it/EW8fC ++ 14, 482 bajtów
bardziej czytelna wersja:
źródło
Python 3,
235230 bajtów (zminimalizowane odniesienie)Właśnie zminimalizowałem referencje, ponieważ jestem nowy w golfie.
Używasz go dokładnie tak samo jak w przykładzie, ale funkcja jest
s
zamiastbalance_seesaw
.źródło
w[o>p]=[o//k,p//t][o>p]
. Ponadto większość linii można połączyć, aby pozbyć się dodatkowych białych znaków.