ไก่งวงวันขอบคุณพระเจ้า


10

(หวังว่ามันยังคงเป็นวันขอบคุณพระเจ้าสำหรับคุณ)

คุณมีไก่งวงสำหรับอาหารค่ำวันขอบคุณพระเจ้าของคุณ แต่คุณไม่ทราบวิธีกระจายอย่างสม่ำเสมอ ปัญหาคือบางคนกินมากกว่าคนอื่นดังนั้นคุณต้องหาทางออก

อินพุต

จะมีสองอินพุต ครั้งแรกจะเป็นศิลปะ ASCII ของคนต่าง ๆ

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

ข้อมูลจำเพาะศิลปะ

แต่ละคนใช้ความกว้าง 3 คอลัมน์ แต่ละคนถูกคั่นด้วยคอลัมน์ของช่องว่างเดียว oด้านบนสุดของแต่ละคนเป็น ด้านล่างo, ชดเชยด้วย1และ-1ใน x, คือ\และ/, ตามลำดับ จากแถวที่หนึ่งoถึงสองในแถวสุดท้ายของอินพุทคือ|จำนวนของสิ่งเหล่านี้ต่อคนคือ "ความสูง" ของพวกเขา ข้อมูลเดียวที่คุณจะต้องดึงออกมาจากแต่ละคนคือ "ความสูง" ของพวกเขา


จะมีอย่างน้อยหนึ่งคน แต่ละคนมีความสูงอย่างน้อย 2 ตัวเสมอ ความสูงสูงสุดที่โปรแกรมของคุณควรจัดการเป็นอย่างน้อยความสูง 64

หากคุณต้องการให้การป้อนข้อมูลเต็มไปด้วยช่องว่างในรูปแบบสี่เหลี่ยมผืนผ้าโปรดระบุสิ่งนี้ในคำตอบของคุณ


อินพุตที่สองคือไก่งวง ไก่งวงไม่ได้เป็นไก่งวงจริงNxMขนาดของไก่งวง หากอินพุตที่สองคือ3x2ไก่งวงจะมีขนาด 3 * 2 พร้อมพื้นที่ทั้งหมด 6

เอาท์พุต

ผลลัพธ์อาจเป็นรายการหรือทางเลือกที่ใกล้เคียงที่สุดกับภาษาของคุณ (เช่น Array) นอกจากนี้คุณยังสามารถส่งออกสตริงโดยมีค่าคั่นด้วยช่องว่าง

ค่าสำหรับแต่ละคนควรส่งออกตามลำดับที่พวกเขาป้อนข้อมูล

ท้าทาย

เป้าหมายของคุณคือการแบ่งพื้นที่ของไก่งวงในหมู่คน

ตัวอย่างสถานการณ์:

สมมติว่าพวกเขาเป็นคนสองคนที่มีความสูง3และ6ตามลำดับ 5x3หากมีไก่งวง พื้นที่ทั้งหมดของไก่งวงที่จะต้องมีการแจกจ่ายคือ15พื้นที่ทั้งหมดของไก่งวงที่จะต้องมีการกระจาย

ตอนนี้คุณจะกระจายมันอย่างไรในทุกคน? นี่คือวิธี:

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

ซึ่งหมายความว่าสำหรับคนแรกที่มีความสูงของ3พวกเขาจะได้รับ3/9*15ไก่งวงหรือ5คนที่สองที่มีความสูงของ6พวกเขาจะได้รับ6/9*15หรือ10ไก่งวง

เอาท์พุต

ผลลัพธ์จะต้องประกอบด้วยตัวเลขเท่านั้นและ.เว้นแต่คุณเลือกที่จะรับโบนัส ในกรณีนี้อาจประกอบด้วยตัวเลขช่องว่าง ( ) และเครื่องหมายทับ ( /)

ตัวอย่างเต็ม

การป้อนข้อมูล:

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

เอาท์พุท:

11.25 18.75

โบนัส

-20% โบนัส:คุณส่งออกเศษส่วน (ต้องง่ายขึ้น) มันไม่สำคัญว่าจะเป็นเศษส่วนแบบผสมหรือไม่เหมาะสม

เกณฑ์การให้คะแนน

นี่คือสั้นที่สุดในหน่วยไบต์!


ฉันอาจจะพลาดอะไรบางอย่าง แต่เราจะแยกเอาท์พุทของแต่ละคนออกจากคนอื่นได้อย่างไร? นั่นคือรูปแบบที่แน่นอนผลลัพธ์ควรอยู่ใน?
ETHproductions

@ETHproductions คุณสามารถแสดงผลในรายการหรือคั่นด้วยช่องว่างฉันไม่อยากจะเชื่อว่าฉันลืมระบุ
Downgoat

มีการ จำกัด ขนาดของขนาดไก่งวงหรือไม่? คือแต่ละมิติมีหนึ่งหลักเสมอหรือเป็น 11x10 หรือสูงกว่าได้หรือไม่
Tom Carpenter

@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

Japt , 49 46 ไบต์

Japtเป็นรุ่นสั้นJa vaScri พอยต์ ล่าม

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

เอาต์พุตเป็นอาร์เรย์ (โปรดทราบว่าคุณจะต้องรวมสองอินพุตในเครื่องหมายคำพูด)

มันทำงานอย่างไร

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

นี่คือฟังก์ชัน MATLAB ซึ่งรับสองอินพุตส่วนแรกคือสตริงสำหรับขนาดไก่งวง (เช่น '8x4'และที่สองคือสตริงที่บรรจุคน) มันส่งคืนสตริงที่มีเศษส่วนที่ไม่เหมาะสมสำหรับแต่ละคน

นี่อาจเล็กกว่านี้มาก แต่เส้นใหม่นั้นยุ่งยาก MATLAB สามารถแปลงสตริงได้อย่างง่ายดายด้วย;เป็นตัวคั่นสำหรับแต่ละบรรทัด แต่พยายามใช้การขึ้นบรรทัดใหม่ที่พิสูจน์แล้วว่ายากซึ่งมีราคา 25 อักขระ:

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

การเพิ่มขนาดของคนนั้นค่อนข้างง่าย:

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

การดำเนินการนี้จะใช้เวลาทุกคอลัมน์ที่สี่เริ่มต้นจากคอลัมน์ที่สอง (ซึ่งจะเป็นคอลัมน์ทั้งหมดที่ร่างกายของผู้คนจะเป็น) จากนั้นแปลงให้เป็นอาร์เรย์ที่มี 1 ซึ่งมีบิตของร่างกายและ 0 ซึ่งไม่มี ในที่สุดมันก็สรุปคอลัมน์ที่ชาญฉลาดซึ่งส่งผลให้อาร์เรย์aซึ่งเป็นอาร์เรย์ 1D ที่มีขนาดของแต่ละคน

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

ต่อไปเราจะแยกขนาดของไก่งวงจากสตริงอินพุตซึ่งอยู่ในรูปแบบ%dx%dนั่นคือตัวเลขหนึ่งแล้ว 'x' จากนั้นอีกจำนวนหนึ่ง อาร์เรย์ที่เป็นผลลัพธ์ของตัวเลขสองตัวถูกคูณเข้าด้วยกันเพื่อให้ได้พื้นที่ไก่งวง

สิ่งนี้จะถูกคูณด้วยความสูงของแต่ละคนและหารด้วยความสูงรวมของทุกคนเพื่อรับส่วนของไก่งวงสำหรับแต่ละคนเป็นตัวเลขทศนิยม

rats(...)

ขั้นตอนสุดท้ายในการรับโบนัส - บิตนี้จะทำให้รหัสยาวขึ้น 6 ตัวอักษร แต่โบนัสล้มลง ~ 22 ดังนั้นมันจึงคุ้มค่า rats()เป็นฟังก์ชั่นที่ดีซึ่งจะแปลงตัวเลขทศนิยมให้เป็นเศษส่วนที่ไม่เหมาะสมแบบง่าย (แม่นยำถึง 13 dp) ป้อนจำนวนทศนิยม (เช่นจำนวนเงินสำหรับแต่ละคน) จะส่งกลับสตริงเดียวที่มีเศษส่วนสำหรับแต่ละคนโดยคั่นด้วยช่องว่าง

ได้รับผลลัพธ์จากการrats()เพิ่มมากกว่าหนึ่งช่องว่าง แต่คำถามไม่ได้บอกว่ามันไม่สามารถ - เพียงแค่บอกว่าสตริงจะต้องมีตัวเลขเท่านั้น '' และ '/'

นี่คือผลลัพธ์จากตัวอย่าง (เครื่องหมายคำพูดที่เพิ่มโดยฉันเพื่อป้องกันการลบช่องว่างไม่ใช่ในเอาต์พุตจริง):

'     45/4          75/4     '

ตัวอย่างการใช้งาน:

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

เอาท์พุท:

'     45/4          75/4     '

นอกจากนี้ยังใช้งานได้ (แม้ว่าจะมีคำเตือน) ในล่ามอ็อกเตฟออนไลน์ คุณสามารถทดลองใช้งานได้ที่นี่ ลิงก์คือเวิร์กสเปซที่มีfฟังก์ชันที่กำหนดไว้ในไฟล์แล้ว ดังนั้นคุณควรจะสามารถป้อนตัวอย่างการใช้งานด้านบนได้ที่พรอมต์


2

Pyth - 25 ไบต์

สามารถตีกอล์ฟสองสามไบต์ได้อย่างแน่นอน วิธีการตรงไปตรงมาสวย

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

ลองมันออนไลน์ได้ที่นี่


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.