Święto Dziękczynienia Turcji

10

(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 1i -1w X, są \i /, odpowiednio. Od odrugiego 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 NxMwymiarami 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 3i 6odpowiednio. 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*15indyka, lub 5, drugą osobę o wysokości 6dostaną 6/9*15lub 10indyka.

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 więc wygrywa najkrótszy kod w bajtach!

Downgoat
źródło
Być może czegoś mi brakuje, ale w jaki sposób powinniśmy oddzielić wyniki dla każdej osoby od innych? Czyli jaki dokładnie format powinien mieć wynik?
ETHprodukcje
@ETHproductions Możesz wyprowadzać dane na liście lub być oddzielone spacjami, nie mogę uwierzyć, że zapomniałem tego określić.
Downgoat
Czy istnieje górna granica wymiarów indyka? tzn. czy każdy wymiar jest zawsze jedną cyfrą, czy może być jak 11x10 lub więcej?
Tom Carpenter
@TomCarpenter może składać się z wielu cyfr, górny limit to cokolwiek, co obsługuje Twój język
Downgoat

Odpowiedzi:

3

Pyth, 23 bajty

mc*vXzG\*dsN=N-/R\|C.z0

Nie działa to w wersji online, ponieważ służy evaldo określania wielkości indyka.

Wyjaśnienie:

mc*vXzG\*dsN=N-/R\|C.z0   implicit: z = first input line
                    .z    read all other lines
                   C      transpose them
               /R\|       count the "|"s in each column
              -       0   remove 0s in this list (columns with no "|"s)
            =N            assign the resulting list to N
m                         map each value d in N to:
    XzG\*                    replace every letter in z with a "*"
   v                         evaluate the result (does the multiplication)
  *      d                   multiply with d
 c        sN                 divide by sum(N)
Jakube
źródło
4

LabVIEW, 67 bajtów

Liczę po tym, co zaproponowałem w meta postu, więc to nie jest naprawione, ale tak, proszę.

wprowadź opis zdjęcia tutaj

oczekiwane jest wejście wypełnione spacjami.

Liczę głowy i liczę ludzi z linii, w której są głowy.

Eumel
źródło
3

Japt , 49 46 bajtów

Japt to skrócona wersja Ja vaScri pt . Interpretator

W=UqR y f@Y%4¥1 £Xq'| l -1)£Vq'x r@X*Y,1 *X/Wx

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

            // Implicit: U = stick-figures, V = turkey size
W=UqR y     // Assign variable W to: split U at newlines, transpose rows with columns,
f@Y%4==1    // take each stick-figure body,
m@Xq'| l -1 // and count the number of "|"s.
)m@Vq'x     // Now map each item X in W to: V split at "x",
r@X*Y,1     // reduced by multiplication, starting at 1,
*X/Wx       // multiplied by X and divided by the total of W.
            // Implicit: output last expression
ETHprodukcje
źródło
3

MATLAB 109 * 80% = 87,2 bajtów

function o=f(t,p);p=char(strsplit(p,'\n'));a=sum(p(:,2:4:end)=='|');o=rats(prod(sscanf(t,'%dx%d'))*a/sum(a));

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:

p=char(strsplit(p,'\n')); % Converts the input person string to a 2D array

Zwiększenie rozmiarów ludzi jest w rzeczywistości dość łatwe:

a=sum(p(:,2:4:end)=='|');

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ę, aktóra jest tablicą 1D zawierającą rozmiar każdej osoby.

prod(sscanf(t,'%dx%d'))*a/sum(a)

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ą.

rats(...)

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):

'     45/4          75/4     '

Przykładowe użycie:

f('6x5',['     o ' 10 '     | ' 10 ' o  \|/' 10 '\|/  | ' 10 ' |   | ' 10 ' |   | ' 10 '/ \ / \'])

wynik:

'     45/4          75/4     '

Działa również (choć z ostrzeżeniami) w internetowym tłumaczu Octave . Możesz spróbować tutaj . Łącze prowadzi do obszaru roboczego z ffunkcją zdefiniowaną już w pliku. Powinieneś być w stanie po prostu wpisać powyższe przykładowe użycie w wierszu polecenia.

Tom Carpenter
źródło
2

Pyth - 25 bajtów

Zdecydowanie potrafi golfa kilka bajtów. Całkiem proste podejście.

KfT/R\|C.z*R*FsMcz\xcRsKK

Wypróbuj online tutaj .

Maltysen
źródło
2

Haskell 119 bajtów

import Data.List
g x=sum[1|y<-x,y>'{']
s#p|(h,_:t)<-span(<'x')s=[g x*read h*read t/g p|x<-transpose$lines p,any(>'{')x]

Przykład użycia: "6x5" # " o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\\n"-> [11.25,18.75].

nimi
źródło
2

JavaScript (ES6), 131 bajtów

(t,p)=>eval(`h=[];for(s=0;m=r.exec(p);s++)h[i=m.index%l/4|0]=~~h[i]+1;h.map(v=>v/s*${t.replace("x","*")})`,l=p.search`
`+1,r=/\|/g)

Zwraca tablicę porcji.

Wyjaśnienie

(t,p)=>                      // t = turkey equation, p = ASCII art of people
  eval(`                     // use eval to enable for loop without {} or return
    h=[];                    // h = array of each person's height
    for(s=0;m=r.exec(p);s++) // for each match of "|", s = sum of all heights
      h[i=m.index%l/4|0]=    // i = person index of this match
        ~~h[i]+1;            // increment person's height (~~ casts undefined to 0)
    h.map(v=>v/s*            // divide each height by the sum and multiply by turkey area
      ${t.replace("x","*")}  // since this is inside an eval just convert t to an equation
    )`,                      // implicit: return array of each person's portion

    // These are executed BEFORE the eval (escaping characters would mean more bytes)
    l=p.search`
`+1,                         // l = line length
    r=/\|/g                  // r = regex to match height markers
  )

Test

użytkownik 81655
źródło
1

Python 99 bajtów

lambda a,b: [`(''.join(i)).count('|')*1.0/a.count('|')*eval(b)` for i in zip(*a.split('\n'))[1::4]]

Wejście:' o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\','6*5'

Wynik: ['11.25', '18.75']

Pręt
źródło