Thanksgiving Türkei

10

(Hoffentlich ist es immer noch Thanksgiving für dich)

Sie haben einen Truthahn für Ihr Thanksgiving-Abendessen, wissen aber nicht, wie Sie ihn gleichmäßig verteilen sollen. Das Problem ist, dass manche Menschen mehr essen als andere, daher müssen Sie eine Lösung finden

Eingang

Es gibt zwei Eingänge. Die erste wird eine ASCII-Kunst verschiedener Menschen sein.

     o
 o  \|/
\|/  |
 |   |
/ \ / \

ASCII-Art Spezifikationen

Jede Person nimmt eine Breite von 3 Spalten ein. Jede Person ist durch eine einzelne Spalte von Leerzeichen getrennt. Die Spitze jeder Person ist eine o. Unterhalb der odurch Offset 1und -1in der x, \und /sind. Von der obis zur vorletzten Zeile in der Eingabe |ist die Menge dieser pro Person ihre "Größe". Die einzigen Daten, die Sie von jeder Person extrahieren müssen, sind ihre "Größe".


Es wird immer mindestens eine Person geben. Jede Person hat immer mindestens 2 Körpergröße. Die maximale Höhe, die Ihr Programm verarbeiten sollte, beträgt mindestens 64.

Wenn Sie möchten, dass die mit Leerzeichen aufgefüllte Eingabe ein Rechteck bildet, geben Sie dies bitte in Ihrer Antwort an.


Der zweite Eingang ist der Truthahn. Der Truthahn ist nicht wirklich ein Truthahn, eher die NxMDimensionen eines Truthahns. Wenn der zweite Eingang ist 3x2, hat der Truthahn Abmessungen von 3 * 2 mit einer Gesamtfläche von 6.

Ausgabe

Die Ausgabe kann eine Liste oder die nächstgelegene Alternative Ihrer Sprache sein (z. B. Array). Sie können auch eine Zeichenfolge ausgeben, deren Werte durch Leerzeichen getrennt sind.

Die Werte für jede Person sollten in der Reihenfolge ausgegeben werden, in der sie eingegeben wurden.

Herausforderung

Ihr Ziel ist es, den Bereich der Türkei unter den Menschen aufzuteilen.

Ein Beispielszenario:

Angenommen , es sind zwei Menschen, mit Höhen von 3und 6verbunden. Wenn es einen Truthahn von gibt 5x3. Die Gesamtfläche des Truthahns, die verteilt werden muss, beträgt 15.

Wie würden Sie es nun unter allen verteilen? Hier ist wie:

                    the_persons_height
TurkeyForAPerson = -------------------- * turkey_area
                    sum_of_all_heights

Das bedeutet, dass für die erste Person mit einer Höhe von 3, werden sie bekommen 3/9*15Truthahn, oder 5, die zweite Person mit einer Höhe von 6sie bekommen 6/9*15oder 10Truthahn.

Ausgabe

Die Ausgabe muss ausschließlich aus Ziffern bestehen, und es .sei denn, Sie entscheiden sich für den Bonus. In diesem Fall darf es nur aus Ziffern, Leerzeichen ( ) und einem Schrägstrich ( /) bestehen.

Vollständiges Beispiel

Eingang:

6x5
     o 
     | 
 o  \|/
\|/  | 
 |   | 
 |   | 
/ \ / \

Ausgabe:

11.25 18.75

Boni

-20% Bonus: Sie geben einen Bruch aus (muss vereinfacht werden), es spielt keine Rolle, ob es sich um einen gemischten oder einen falschen Bruch handelt.

Wertung

Dies ist also gewinnt der kürzeste Code in Bytes!

Downgoat
quelle
Ich vermisse vielleicht etwas, aber wie sollen wir die Ausgabe für jede Person von den anderen trennen? Dh in welchem ​​genauen Format sollte die Ausgabe sein?
ETHproductions
@ETHproductions Sie können in einer Liste oder durch Leerzeichen getrennt ausgeben. Ich kann nicht glauben, dass ich vergessen habe, dies anzugeben.
Downgoat
Gibt es eine Obergrenze für die Truthahnabmessungen? dh ist jede Dimension immer eine Ziffer oder könnte sie 11x10 oder höher sein?
Tom Carpenter
@ TomCarpenter es kann mehrstellig sein, die Obergrenze ist, was auch immer Ihre Sprache unterstützt
Downgoat

Antworten:

3

Pyth, 23 Bytes

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

Dies funktioniert in der Online-Version nicht, da evalhiermit die Größe des Truthahns bestimmt wird.

Erläuterung:

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
quelle
4

LabVIEW, 67 Bytes

Ich zähle nach dem, was ich im Meta-Post vorgeschlagen habe, also ist es nicht behoben, aber ja, hier geht es weiter.

Geben Sie hier die Bildbeschreibung ein

Eine mit Leerzeichen aufgefüllte Eingabe wird erwartet.

Ich zähle Köpfe und erhalte die Größe der Leute von der Linie, an der sich die Köpfe befinden.

Eumel
quelle
3

Japt , 49 46 Bytes

Japt ist eine verkürzte Version von Ja vaScri pt . Dolmetscher

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

Ausgaben als Array. (Beachten Sie, dass Sie jede der beiden Eingaben in Anführungszeichen setzen müssen.)

Wie es funktioniert

            // 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
ETH-Produktionen
quelle
3

MATLAB 109 * 80% = 87,2 Bytes

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

Dies ist also eine MATLAB-Funktion, die zwei Eingaben benötigt, die erste ist eine Zeichenfolge für die Truthahngröße (z. B. '8x4'und die zweite ist die Zeichenfolge, die die Personen enthält. Sie gibt eine Zeichenfolge zurück, die für jede Person falsche Brüche enthält.

Dies hätte viel kleiner sein können, aber die neuen Zeilen wurden schwierig. MATLAB konnte leicht eine Zeichenfolge ;als Trennzeichen für jede Zeile konvertieren , aber der Versuch, eine neue Zeile zu verwenden, erwies sich als schwierig und kostete 25 Zeichen:

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

Die Größe der Leute zu bekommen ist eigentlich ganz einfach:

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

Dies dauert jede vierte Spalte beginnend mit der zweiten (das sind alle Spalten, in denen sich Körper von Menschen befinden) und konvertiert diese dann in ein Array mit Einsen, in denen Körperbits vorhanden sind, und Nullen, in denen keine vorhanden sind. Schließlich summiert es spaltenweise, was dazu führt, dass das Array aein 1D-Array ist, das die Größe jeder Person enthält.

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

Als nächstes extrahieren wir die Größe des Truthahns aus der Eingabezeichenfolge, die in der Form vorliegt %dx%d, dh eine Zahl, dann 'x', dann eine andere Zahl. Das resultierende Array von zwei Zahlen wird miteinander multipliziert, um die Putenfläche zu erhalten.

Dies wird mit jeder Körpergröße multipliziert und auch durch die Gesamthöhe aller Menschen dividiert, um den Truthahnanteil für jede Person als Dezimalzahl zu erhalten.

rats(...)

Der letzte Schritt, um den Bonus zu qualifizieren - dieses Bit verlängert den Code um 6 Zeichen, aber der Bonus schlägt ~ 22 ab, es lohnt sich also. rats()ist eine nette Funktion, die eine Dezimalzahl in einen vereinfachten falschen Bruch umwandelt (genau auf 13 dp). Wenn Sie ein Array mit Dezimalzahlen eingeben (dh den Betrag für jede Person), wird eine einzelne Zeichenfolge zurückgegeben, die Brüche für jede Person enthält, die wiederum durch Leerzeichen getrennt sind.

Zugegeben, die Ausgabe von rats()fügt mehr als ein Leerzeichen hinzu, aber die Frage sagt nicht, dass dies nicht möglich ist - nur, dass die Zeichenfolge nur die Ziffern '' und '/' enthalten darf.

Dies ist die Ausgabe des Beispiels (von mir hinzugefügte Anführungszeichen, um zu verhindern, dass Leerzeichen entfernt werden, nicht in der tatsächlichen Ausgabe):

'     45/4          75/4     '

Anwendungsbeispiel:

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

Ausgabe:

'     45/4          75/4     '

Es funktioniert auch (wenn auch mit Warnungen) auf dem Online- Octave- Interpreter. Sie können es hier versuchen . Der Link führt zu einem Arbeitsbereich, dessen fFunktion bereits in einer Datei definiert ist. Sie sollten also in der Lage sein, die obige Beispielverwendung an der Eingabeaufforderung einzugeben.

Tom Carpenter
quelle
2

Haskell 119 Bytes

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]

Anwendungsbeispiel: "6x5" # " o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\\n"-> [11.25,18.75].

Nimi
quelle
2

JavaScript (ES6), 131 Byte

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

Gibt ein Array von Teilen zurück.

Erläuterung

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

Prüfung

user81655
quelle
1

Python 99 Bytes

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

Eingang:' o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\','6*5'

Ausgabe: ['11.25', '18.75']

Stange
quelle