Turki Thanksgiving

10

(Semoga ini masih Thanksgiving untuk Anda)

Anda mendapat kalkun untuk makan malam syukur, tetapi Anda tidak tahu bagaimana cara mendistribusikannya secara merata. Masalahnya, beberapa orang makan lebih banyak daripada yang lain, jadi Anda perlu mencari solusinya

Memasukkan

Akan ada dua input. Yang pertama akan menjadi seni ascii dari berbagai orang.

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

spesifikasi ascii-art

Setiap orang mengambil lebar 3 kolom. Setiap orang dipisahkan oleh satu kolom spasi. Bagian paling atas dari setiap orang adalah o. Di bawah o, diimbangi oleh 1dan -1di x, yang \dan /masing-masing. Dari baris oke baris kedua hingga terakhir di input adalah |, jumlah ini per orang adalah "tinggi" mereka. Satu-satunya data yang perlu Anda ekstrak dari setiap orang adalah "tinggi" mereka.


Akan selalu ada setidaknya satu orang. Setiap orang selalu memiliki tinggi setidaknya 2. Ketinggian maksimal yang harus ditangani oleh program Anda setidaknya adalah tinggi 64.

Jika Anda ingin input yang diisi dengan spasi untuk membentuk persegi panjang, harap tentukan ini dalam jawaban Anda.


Input kedua adalah kalkun. Kalkun sebenarnya bukan kalkun, lebih dari NxMdimensi kalkun. Jika input kedua adalah 3x2, maka kalkun memiliki dimensi 3 * 2, dengan total area 6.

Keluaran

Outputnya mungkin berupa daftar atau alternatif terdekat bahasa Anda (mis. Array). Anda juga dapat menampilkan string, dengan nilai yang dipisahkan oleh spasi.

Nilai untuk setiap orang harus berupa output sesuai urutan inputnya.

Tantangan

Tujuan Anda adalah untuk membagi area kalkun di antara orang-orang.

Contoh skenario:

Asumsikan mereka adalah dua orang, dengan ketinggian 3dan 6, masing-masing. Jika ada kalkun 5x3. Luas total kalkun yang perlu didistribusikan adalah 15.

Sekarang bagaimana Anda mendistribusikannya di antara semua orang? Begini caranya:

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

Ini berarti, untuk orang pertama dengan ketinggian 3, mereka akan mendapatkan 3/9*15kalkun, atau 5, orang kedua dengan ketinggian 6mereka akan mendapatkan 6/9*15atau 10kalkun.

Keluaran

Keluaran semata-mata harus terdiri dari angka, dan ., kecuali Anda memilih bonus. Dalam hal itu, itu mungkin hanya terdiri dari angka, spasi ( ), dan garis miring ( /).

Contoh lengkap

Memasukkan:

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

Keluaran:

11.25 18.75

Bonus

-20% Bonus: Anda menghasilkan fraksi (harus disederhanakan), tidak masalah apakah itu fraksi campuran atau tidak tepat.

Mencetak gol

Ini adalah sehingga kode terpendek dalam byte menang!

Downgoat
sumber
Saya mungkin kehilangan sesuatu, tetapi bagaimana kita harus memisahkan output untuk setiap orang dari yang lain? Yaitu apa format yang seharusnya menjadi output?
ETHproduk
@ ETHproductions Anda dapat menampilkan dalam daftar, atau dipisahkan oleh spasi, saya tidak percaya saya lupa menentukan itu.
Downgoat
Apakah ada batas atas pada dimensi kalkun? yaitu apakah setiap dimensi selalu satu digit, atau mungkinkah seperti 11x10 atau lebih tinggi?
Tom Carpenter
@ TomCarpenter mungkin beberapa digit, batas atas adalah apa pun yang didukung bahasa Anda
Downgoat

Jawaban:

3

Pyth, 23 byte

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

Ini tidak berfungsi dalam versi online, karena ini digunakan evaluntuk menentukan ukuran kalkun.

Penjelasan:

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

LabVIEW, 67 Bytes

Saya menghitung setelah apa yang saya usulkan di meta post jadi tidak tetap tapi ya begini.

masukkan deskripsi gambar di sini

input diisi dengan spasi diharapkan.

Saya menghitung kepala dan mendapatkan ukuran orang dari garis di mana kepala berada.

Eumel
sumber
3

Japt , 49 46 byte

Japt adalah versi singkat dari Ja vaScri pt . Penerjemah

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

Output sebagai array. (Perhatikan bahwa Anda harus membungkus masing-masing dari dua input dalam tanda kutip.)

Bagaimana itu bekerja

            // 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
Produksi ETH
sumber
3

MATLAB 109 * 80% = 87,2 byte

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

Jadi ini adalah fungsi MATLAB yang mengambil dua input, yang pertama adalah string untuk ukuran kalkun (misalnya '8x4', dan yang kedua adalah string yang berisi orang-orang. Ia mengembalikan string yang berisi pecahan yang tidak tepat untuk setiap orang.

Ini bisa jadi jauh lebih kecil, tetapi baris baru menjadi rumit. MATLAB dapat dengan mudah mengkonversi string dengan ;sebagai pemisah untuk setiap baris, tetapi mencoba menggunakan baris baru terbukti sulit, dengan biaya 25 karakter:

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

Mendapatkan ukuran orang sebenarnya cukup mudah:

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

Ini mengambil setiap kolom keempat mulai dari kolom kedua (yang akan menjadi semua kolom di mana tubuh orang akan berada), lalu mengonversinya menjadi array yang berisi 1 di mana ada bit tubuh dan 0 di mana tidak ada. Akhirnya jumlah kolom-bijaksana yang menghasilkan array ayang merupakan array 1D yang berisi ukuran setiap orang.

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

Selanjutnya kita mengekstraksi ukuran kalkun dari string input yang ada dalam formulir %dx%d, yaitu satu angka lalu 'x' lalu nomor lain. Array yang dihasilkan dari dua angka dikalikan bersama untuk mendapatkan area turkey.

Ini dikalikan dengan tinggi masing-masing orang, dan juga dibagi dengan tinggi total semua orang untuk mendapatkan porsi kalkun untuk setiap orang sebagai angka desimal.

rats(...)

Langkah terakhir untuk memenuhi syarat bonus - bit ini membuat kode 6 karakter lebih panjang, tetapi bonus itu merobohkan ~ 22 jadi sangat berharga. rats()adalah fungsi yang bagus yang mengubah angka desimal menjadi pecahan tak disederhanakan yang disederhanakan (akurat hingga 13 dp). Memberinya array angka desimal (yaitu jumlah untuk setiap orang) akan mengembalikan string tunggal yang berisi pecahan untuk setiap orang pada gilirannya dipisahkan oleh spasi.

Memang output rats()menambahkan lebih dari satu ruang, tetapi pertanyaannya tidak mengatakan itu tidak bisa - hanya mengatakan string harus berisi digit saja, '' dan '/'.

Ini adalah output dari contoh (tanda kutip yang ditambahkan oleh saya untuk mencegah spasi dihapus, bukan dalam output aktual):

'     45/4          75/4     '

Contoh penggunaan:

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

keluaran:

'     45/4          75/4     '

Ini juga berfungsi (meskipun dengan peringatan) pada penerjemah Oktaf online . Anda bisa mencobanya di sini . Tautan ke ruang kerja dengan ffungsi yang sudah ditentukan dalam file. Jadi Anda harus bisa memasukkan contoh penggunaan di atas saat diminta.

Tom Carpenter
sumber
2

Pyth - 25 byte

Pasti bisa bermain golf beberapa byte darinya. Pendekatan yang cukup mudah.

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

Cobalah online di sini .

Maltysen
sumber
2

Haskell 119 byte

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]

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

nimi
sumber
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)

Mengembalikan array porsi.

Penjelasan

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

Uji

pengguna81655
sumber
1

Python 99 byte

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

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

Keluaran: ['11.25', '18.75']

tongkat
sumber