Lễ Tạ ơn


10

(Hy vọng nó vẫn là Lễ Tạ ơn cho bạn)

Bạn có một con gà tây cho bữa tối tạ ơn của bạn nhưng bạn không biết cách phân phối đều. Vấn đề là, một số người ăn nhiều hơn những người khác, vì vậy bạn cần tìm một giải pháp

Đầu vào

Sẽ có hai đầu vào. Đầu tiên sẽ là một nghệ thuật ascii của nhiều người.

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

thông số kỹ thuật ascii

Mỗi người chiếm một chiều rộng 3 cột. Mỗi người được ngăn cách bởi một cột không gian. Đỉnh cao của mỗi người là một o. Bên dưới o, bù đắp bằng 1-1trong x, đang \/, tương ứng. Từ hàng othứ hai đến hàng cuối cùng trong đầu vào là |, số lượng của mỗi người là "chiều cao" của họ. Dữ liệu duy nhất bạn cần trích xuất từ ​​mỗi người là "chiều cao" của họ.


Sẽ luôn có ít nhất một người. Mỗi người luôn có ít nhất 2 chiều cao. Chiều cao tối đa mà chương trình của bạn nên xử lý ít nhất là chiều cao 64.

Nếu bạn muốn đầu vào được đệm bằng khoảng trắng để tạo thành một hình chữ nhật, vui lòng chỉ định điều này trong câu trả lời của bạn.


Đầu vào thứ hai là gà tây. Gà tây không thực sự là một con gà tây, nhiều NxMkích thước của một con gà tây. Nếu đầu vào thứ hai là 3x2, thì gà tây có kích thước 3 * 2, với tổng diện tích là 6.

Đầu ra

Đầu ra có thể là một danh sách hoặc ngôn ngữ thay thế gần nhất của bạn (ví dụ Mảng). Bạn cũng có thể xuất ra một chuỗi, với các giá trị được phân tách bằng dấu cách.

Các giá trị cho mỗi người nên được xuất theo thứ tự mà họ đã nhập.

Thử thách

Mục tiêu của bạn là phân chia diện tích gà tây cho mọi người.

Một kịch bản ví dụ:

Giả sử họ là hai người, với chiều cao của 36, tương ứng. Nếu có một con gà tây của 5x3. Tổng diện tích của gà tây sẽ cần được phân phối là 15.

Bây giờ bạn sẽ phân phối nó như thế nào với mọi người? Đây là cách thực hiện:

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

Điều này có nghĩa, đối với người đầu tiên có chiều cao 3, họ sẽ nhận được 3/9*15gà tây, hoặc 5, người thứ hai có chiều cao 6họ sẽ nhận được 6/9*15hoặc 10gà tây.

Đầu ra

Đầu ra phải chỉ bao gồm các chữ số, và ., trừ khi bạn chọn đi lấy tiền thưởng. Trong trường hợp đó, nó chỉ có thể bao gồm các chữ số, dấu cách ( ) và dấu gạch chéo ( /).

Ví dụ đầy đủ

Đầu vào:

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

Đầu ra:

11.25 18.75

Tiền thưởng

-20% Bonus: Bạn ra một phần nhỏ (phải được đơn giản hóa), nó không quan trọng cho dù đó là một phần nhỏ hỗn hợp hoặc không đúng.

Chấm điểm

Đây là để mã ngắn nhất trong byte thắng!


Tôi có thể đang thiếu một cái gì đó, nhưng chúng ta nên tách đầu ra cho mỗi người như thế nào? Tức là định dạng chính xác đầu ra phải ở?
Sản phẩm ETH

@ETHproductions Bạn có thể xuất ra trong một danh sách hoặc cách nhau bởi khoảng trắng, tôi không thể tin rằng mình đã quên chỉ định điều đó.
Hạ cấp

Có giới hạn trên về kích thước gà tây? tức là mỗi chiều luôn là một chữ số, hoặc có thể giống như 11x10 hoặc cao hơn?
Tom Carpenter

@TomCarpenter nó có thể có nhiều chữ số, giới hạn trên là bất cứ điều gì ngôn ngữ của bạn hỗ trợ
Downgoat

Câu trả lời:


3

Bình thường, 23 byte

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

Điều này không hoạt động trong phiên bản trực tuyến, vì nó sử dụng evalđể xác định kích thước của gà tây.

Giải trình:

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 byte

Tôi đang đếm sau những gì tôi đề xuất trong bài viết meta để nó không cố định nhưng vâng ở đây đi.

nhập mô tả hình ảnh ở đây

đầu vào đệm với không gian dự kiến.

Tôi đang đếm đầu và nhận được kích thước của mọi người từ dòng người đứng đầu.


3

Japt , 49 46 byte

Japt là phiên bản rút gọn của Ja vaScri pt . Thông dịch viên

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

Đầu ra như một mảng. (Lưu ý rằng bạn sẽ cần phải bọc từng trong hai đầu vào trong dấu ngoặc kép.)

Làm thế nào nó hoạt động

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

Vì vậy, đây là một hàm MATLAB có hai đầu vào, đầu tiên là một chuỗi cho kích thước gà tây (ví dụ '8x4', và thứ hai là chuỗi chứa mọi người. Nó trả về một chuỗi chứa các phân số không chính xác cho mỗi người.

Điều này có thể đã nhỏ hơn rất nhiều, nhưng các dòng mới trở nên khó khăn. MATLAB có thể dễ dàng chuyển đổi một chuỗi với ;tư cách là dấu phân cách cho mỗi dòng, nhưng cố gắng sử dụng một dòng mới tỏ ra khó khăn, tốn 25 ký tự:

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

Lấy kích thước của mọi người thực sự khá dễ dàng:

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

Điều này sẽ lấy mỗi cột thứ tư bắt đầu từ cột thứ hai (sẽ là tất cả các cột có thân người), sau đó chuyển đổi nó thành một mảng chứa 1 trong đó có các bit cơ thể và 0 ở nơi không có. Cuối cùng, nó tổng hợp cột-khôn ngoan dẫn đến mảng alà mảng 1D chứa kích thước của mỗi người.

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

Tiếp theo, chúng tôi trích xuất kích thước của gà tây từ chuỗi đầu vào có dạng %dx%d, tức là một số rồi 'x' rồi đến một số khác. Mảng kết quả của hai số được nhân với nhau để có được diện tích gà tây.

Điều này được nhân với mỗi chiều cao của mọi người, và cũng được chia cho tổng chiều cao của tất cả mọi người để lấy phần gà tây cho mỗi người dưới dạng số thập phân.

rats(...)

Bước cuối cùng để đủ điều kiện nhận tiền thưởng - bit này làm cho mã 6 ký tự dài hơn, nhưng phần thưởng giảm đi ~ 22 vì vậy nó xứng đáng. rats()là một hàm đẹp có thể chuyển đổi một số thập phân thành một phần không chính xác được đơn giản hóa (chính xác thành 13 dp). Cung cấp cho nó một mảng các số thập phân (tức là số tiền cho mỗi người) sẽ trả về một chuỗi chứa các phân số cho mỗi người lần lượt được phân tách bằng dấu cách.

Đã cấp đầu ra của rats()nhiều hơn một khoảng trắng, nhưng câu hỏi không nói là không thể - chỉ nói rằng chuỗi phải chỉ chứa các chữ số, '' và '/'.

Đây là đầu ra từ ví dụ (dấu ngoặc kép được tôi thêm vào để ngăn không gian bị xóa, không phải trong đầu ra thực tế):

'     45/4          75/4     '

Ví dụ sử dụng:

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

đầu ra:

'     45/4          75/4     '

Nó cũng hoạt động (mặc dù có cảnh báo) trên trình thông dịch Octave trực tuyến . Bạn có thể thử nó ở đây . Liên kết là một không gian làm việc với fchức năng được xác định trong một tệp. Vì vậy, bạn sẽ có thể chỉ cần nhập sử dụng ví dụ ở trên tại dấu nhắc.



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]

Ví dụ sử dụng: "6x5" # " o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\\n"-> [11.25,18.75].


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)

Trả về một mảng các phần.

Giải trình

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

Kiểm tra


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

Đầu vào:' o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\','6*5'

Đầu ra: ['11.25', '18.75']

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.