感謝祭の七面鳥


10

(うまくいけば、それはまだあなたのための感謝祭です)

感謝祭のディナーに七面鳥を手に入れましたが、均等に分配する方法がわかりません。問題は、他の人よりも多く食べる人がいるので、解決策を見つける必要があるということです

入力

2つの入力があります。最初は様々な人々のアスキーアートになります。

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

ascii-art仕様

各人は3列の幅を占めます。各人は、1列のスペースで区切られています。各人の最上部はoです。以下の下o、によってオフセット1及び-1Xは、であり\、および/それぞれ。からo入力の2行目から最後の行までは|、1人あたりのこれらの量が「高さ」です。各人から抽出する必要がある唯一のデータは、その「身長」です。


常に少なくとも一人はいるでしょう。各人は常に少なくとも 2つの高さを持っています。プログラムが処理する最大の高さは、少なくとも 64の高さです。

入力にスペースを埋めて長方形を形成したい場合は、回答でこれを指定してください。


2番目の入力は七面鳥です。七面鳥は実際には七面鳥ではなく、七面鳥のより多くのNxM次元です。2番目の入力がの場合、3x2トルコの寸法は3 * 2で、合計面積は6です。

出力

出力は、リストまたは言語の最も近い代替(例:配列)です。値をスペースで区切った文字列を出力することもできます。

各人の値は、入力された順に出力されます。

チャレンジ

あなたの目標は、トルコの地域を人々の間で分割することです。

シナリオ例:

身長がそれぞれ3との2人であると想定し6ます。の七面鳥がある場合5x3。配布する必要がある七面鳥の総面積は15です。

では、どうやってそれをみんなに分配しますか?方法は次のとおりです。

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

つまり、最初の人の身長がの3場合、彼らは3/9*15七面鳥を取得します。または5、2番目の人の身長がの6場合6/9*1510七面鳥を取得します。

出力

.ボーナスを受け取ることを選択しない限り、出力は数字のみで構成されている必要があります。その場合、数字、スペース()、およびスラッシュ(/)のみで構成されます。

完全な例

入力:

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

出力:

11.25 18.75

ボーナス

-20%ボーナス:分数を出力します(簡略化する必要があります)。それが混合分数でも不適切分数でもかまいませ

得点

これはので、バイト単位の最短コードが優先されます!


何か不足している可能性がありますが、各人の出力を他の人からどのように分離する必要がありますか?つまり、出力はどの形式である必要がありますか?
ETHproductions、2015年

@ETHproductionsリストに出力したり、スペースで区切ったりして、指定するのを忘れたとは思えません。
Downgoat

七面鳥の寸法に上限はありますか?つまり、各次元は常に1桁ですか、それとも11x10以上になるでしょうか。
トムカーペンター

@TomCarpenterそれは複数の桁であるかもしれません、上限はあなたの言語がサポートするものです
Downgoat

回答:


3

Pyth、23バイト

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

eval七面鳥のサイズを決定するために使用するため、これはオンラインバージョンでは機能しません。

説明:

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)

4

LabVIEW、67バイト

私はメタ投稿で提案したものを数えているので修正されていませんが、そうです。

ここに画像の説明を入力してください

スペースが埋め込まれた入力が必要です。

私は頭を数え、頭が並んでいるラインから人のサイズを取得します。


3

Japt49 46バイト

JaptJa vaScri ptの短縮バージョンです。通訳

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

配列として出力します。(2つの入力のそれぞれを引用符で囲む必要があることに注意してください。)

使い方

            // 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

3

MATLAB 109 * 80%= 87.2バイト

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

したがって、これは2つの入力を受け取るMATLAB関数です。1つ目は七面鳥のサイズの文字列です(たとえば、 '8x4'、2つ目は人を含む文字列です。各人の不適切な分数を含む文字列を返します。

これはずっと小さいかもしれませんが、新しいラインは扱いにくくなりました。MATLABは;、各行の区切りとしてを使用して文字列を簡単に変換できますが、改行を使用しようとすると、25文字のコストがかかります。

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

人のサイズを取得することは実際には非常に簡単です。

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

これは、2番目から始まる4番目の列(人の体が配置されるすべての列になります)を取得し、それを、体のビットがある場合は1を、存在しない場合は0を含む配列に変換します。最後に、列ごとに合計しa、各人のサイズを含む1D配列である配列を生成します。

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

次に、フォームの入力文字列から七面鳥のサイズを抽出します%dx%d。つまり、1つの数値、次に「x」、次に別の数値です。結果として得られる2つの数値の配列を掛け合わせて、トルコの面積を取得します。

これに各人の身長を掛け、すべての人の合計の高さで割ると、各人の七面鳥の部分が10進数として得られます。

rats(...)

ボーナスを獲得するための最後のステップ-このビットはコードを6文字長くしますが、ボーナスは〜22を打ち消すので価値があります。rats()10進数を単純化された不適切な分数(13 dpに正確)に変換する素晴らしい関数です。10進数の配列(つまり、各人の金額)を渡すと、各人の分数を含む単一の文字列がスペースで区切られて返されます。

の出力がrats()複数のスペースを追加することを許可しましたが、質問はそれができないことを示していません-文字列は数字、「」および「/」のみを含む必要があると述べています。

これは例の出力です(実際の出力ではなく、スペースが削除されないようにするために私が追加した引用符):

'     45/4          75/4     '

使用例:

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

出力:

'     45/4          75/4     '

また、警告はありますが、オンラインOctaveインタープリターでも機能します。こちらでお試しいただけます。リンクは、f関数がすでにファイルで定義されているワークスペースへのリンクです。したがって、上記の使用例をプロンプトに入力するだけで済みます。



2

Haskell 119バイト

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]

使用例:"6x5" # " o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\\n"-> [11.25,18.75]


2

JavaScript(ES6)、131バイト

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

部分の配列を返します。

説明

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

テスト


1

Python 99バイト

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

入力:' o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\','6*5'

出力: ['11.25', '18.75']

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.