(Mam nadzieję, że nadal jest to dla Ciebie Święto Dziękczynienia)
Dostałeś indyka na obiad z okazji Święta Dziękczynienia, ale nie wiesz, jak go równomiernie rozprowadzić. Problem polega na tym, że niektórzy ludzie jedzą więcej niż inni, więc musisz znaleźć rozwiązanie
Wejście
Będą dwa wejścia. Pierwsza będzie sztuką ascii różnych ludzi.
o
o \|/
\|/ |
| |
/ \ / \
specyfikacje ascii-art
Każda osoba zajmuje szerokość 3 kolumn. Każda osoba jest oddzielona pojedynczą kolumną spacji. Na szczycie każdej osoby jest o
. Poniżej o
, skompensowane 1
i -1
w X, są \
i /
, odpowiednio. Od o
drugiego do ostatniego rzędu na wejściu są |
to ich „wysokość”. Jedyne dane, które będziesz musiał wydobyć od każdej osoby, to jej „wysokość”.
Zawsze będzie co najmniej jedna osoba. Każda osoba ma zawsze co najmniej 2 wysokości. Maksymalna wysokość, którą powinien obsługiwać program, wynosi co najmniej 64.
Jeśli chcesz, aby dane wejściowe wypełnione spacjami tworzyły prostokąt, podaj to w swojej odpowiedzi.
Drugim wejściem jest indyk. Indyk nie jest tak naprawdę indykiem, a bardziej NxM
wymiarami indyka. Jeśli drugim wejściem jest 3x2
, to indyk ma wymiary 3 * 2, o łącznej powierzchni 6.
Wynik
Wynikiem może być lista lub najbliższa alternatywa dla twojego języka (np. Array). Możesz również wyprowadzić ciąg znaków, a wartości oddzielone spacjami.
Wartości dla każdej osoby powinny być wyprowadzane w kolejności, w jakiej zostały wprowadzone.
Wyzwanie
Twoim celem jest podzielenie obszaru indyka między ludzi.
Przykładowy scenariusz:
Załóżmy, że są to dwie osoby o wysokościach 3
i 6
odpowiednio. Jeśli jest indyk z 5x3
. Całkowita powierzchnia indyka, która będzie musiała zostać rozdzielona, wynosi 15
.
Jak więc podzieliłbyś go między wszystkich? Oto jak:
the_persons_height
TurkeyForAPerson = -------------------- * turkey_area
sum_of_all_heights
Oznacza to, że dla pierwszej osoby, z wysokości 3
, będą one uzyskać 3/9*15
indyka, lub 5
, drugą osobę o wysokości 6
dostaną 6/9*15
lub 10
indyka.
Wynik
Dane wyjściowe muszą składać się wyłącznie z cyfr i .
, chyba że zdecydujesz się skorzystać z premii. W takim przypadku może składać się tylko z cyfr, spacji ( ) i ukośnika (
/
).
Pełny przykład
Wejście:
6x5
o
|
o \|/
\|/ |
| |
| |
/ \ / \
Wynik:
11.25 18.75
Bonusy
-20% Premia: Wyprowadzasz ułamek (musisz uprościć), nie ma znaczenia, czy jest to ułamek mieszany czy niewłaściwy.
Punktacja
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach!
Odpowiedzi:
Pyth, 23 bajty
Nie działa to w wersji online, ponieważ służy
eval
do określania wielkości indyka.Wyjaśnienie:
źródło
LabVIEW, 67 bajtów
Liczę po tym, co zaproponowałem w meta postu, więc to nie jest naprawione, ale tak, proszę.
oczekiwane jest wejście wypełnione spacjami.
Liczę głowy i liczę ludzi z linii, w której są głowy.
źródło
Japt ,
4946 bajtówJapt to skrócona wersja Ja vaScri pt . Interpretator
Dane wyjściowe jako tablica. (Pamiętaj, że będziesz musiał zawinąć każde z dwóch danych wejściowych w cudzysłów).
Jak to działa
źródło
MATLAB 109 * 80% = 87,2 bajtów
Jest to więc funkcja MATLAB, która pobiera dwa dane wejściowe, pierwszy to ciąg znaków wielkości indyka (np
'8x4'
. Drugi to ciąg zawierający osoby. Zwraca ciąg zawierający niewłaściwe ułamki dla każdej osoby.To mogło być znacznie mniejsze, ale nowe linie stały się trudne. MATLAB może łatwo przekonwertować ciąg znaków
;
jako separator dla każdej linii, ale próba użycia nowej linii okazała się trudna, kosztuje 25 znaków:Zwiększenie rozmiarów ludzi jest w rzeczywistości dość łatwe:
Zajmuje to co czwartą kolumnę, zaczynając od drugiej (będą to wszystkie kolumny, w których znajdują się ciała ludzi), a następnie konwertuje ją na tablicę zawierającą 1, gdzie są bity ciała i 0, gdzie nie ma. Wreszcie sumuje się według kolumn, co daje tablicę,
a
która jest tablicą 1D zawierającą rozmiar każdej osoby.Następnie wyodrębniamy rozmiar indyka z ciągu wejściowego, który ma postać
%dx%d
, tj. Jedną liczbę, a następnie „x”, a następnie inną liczbę. Wynikowa tablica dwóch liczb jest mnożona razem, aby uzyskać obszar indyka.Mnoży się to przez wysokość każdego ludu, a także dzieli przez całkowitą wysokość wszystkich ludzi, aby uzyskać porcję indyka dla każdej osoby jako liczbę dziesiętną.
Ostatni krok do zakwalifikowania bonusu - ten bit powoduje, że kod jest dłuższy o 6 znaków, ale bonus zrzuca ~ 22, więc warto.
rats()
jest ładną funkcją, która konwertuje liczbę dziesiętną na uproszczoną niepoprawną część (dokładność do 13 dp). Podanie jej tablicy liczb dziesiętnych (tj. Kwoty dla każdej osoby) zwróci pojedynczy ciąg zawierający ułamki dla każdej osoby z kolei oddzielone spacjami.Przyznane wyjście
rats()
dodaje więcej niż jedną spację, ale pytanie nie mówi, że nie może - po prostu mówi, że ciąg musi zawierać tylko cyfry „” i „/”.Oto dane wyjściowe z przykładu (dodane przeze mnie cudzysłowy, aby zapobiec usuwaniu spacji, a nie rzeczywiste dane wyjściowe):
Przykładowe użycie:
wynik:
Działa również (choć z ostrzeżeniami) w internetowym tłumaczu Octave . Możesz spróbować tutaj . Łącze prowadzi do obszaru roboczego z
f
funkcją zdefiniowaną już w pliku. Powinieneś być w stanie po prostu wpisać powyższe przykładowe użycie w wierszu polecenia.źródło
Pyth - 25 bajtów
Zdecydowanie potrafi golfa kilka bajtów. Całkiem proste podejście.
Wypróbuj online tutaj .
źródło
Haskell 119 bajtów
Przykład użycia:
"6x5" # " o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\\n"
->[11.25,18.75]
.źródło
JavaScript (ES6), 131 bajtów
Zwraca tablicę porcji.
Wyjaśnienie
Test
Pokaż fragment kodu
źródło
Python 99 bajtów
Wejście:
' o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\','6*5'
Wynik:
['11.25', '18.75']
źródło