Dennis, Doorknob, Martin Büttner, Chris Jester-Young - Piza!


42

Lập trình Câu đố & Code Golf sắp có người điều hành mới , Dennis ! Thử thách này là một sự tôn vinh đối với anh ấy và những người điều hành hoạt động (hoặc hoạt động gần đây) khác của chúng tôi: Doorknob , Martin BüttnerChris Jester-Young . Tiêu đề thử thách có nghĩa là được đọc theo giai điệu của bài hát Pepto Bismol .

Về cơ bản, chúng ta sẽ đối xử với họ tất cả để bánh pizza tại XIX Bite Pizzeria , nhưng chúng ta cần phải chắc chắn rằng họ chia sẻ nó một cách công bằng vì một số của các mods được biết đến là người nghiện bánh pizza!

Các pizza được bán bởi các cửa hàng pizza là tất cả các khối văn bản hình chữ nhật. Chiều rộng và chiều dài của một chiếc bánh pizza có thể là bất kỳ số nguyên không âm nào miễn là sản phẩm của họ chia hết cho bốn. Mỗi không gian lưới trong khối bánh pizza văn bản đại diện cho một lát, do đó, luôn có thể chia các lát thành bốn nhóm bằng nhau.

Các mod sẽ cùng nhau đặt mua một chiếc bánh pizza, cung cấp các tham số chiều rộng và chiều dài của nó cho máy chủ của họ ở bất kỳ định dạng hợp lý nào, chẳng hạn như [width],[length]. Ngay trước khi pizza đến bàn của họ, bạn cần dán nhãn cho từng lát với chữ cái đầu tiên của người mod ăn nó để đảm bảo tất cả họ đều chia sẻ công bằng. Mọi người nên có cùng số lát.

  • E dành cho Dennis
  • D dành cho Doorknob
  • M dành cho Martin
  • C là dành cho Chris

Tuy nhiên, các mod hơi khó hiểu và yêu cầu các bộ lát tương ứng của chúng được kết nối với nhau , nghĩa là tất cả các lát của chúng có thể chạm tới nhau bằng cách di chuyển lên, xuống, trái và phải, không vượt qua bất kỳ ai khác lát (và không di chuyển chéo). Đừng quan tâm làm thế nào bạn làm điều này miễn là nó được thực hiện.

Khi bạn đã dán nhãn chính xác cho từng lát, hãy giao pizza cho các mod với một dòng mới tùy chọn.

Nhãn của bạn có thể là một chương trình hoặc một chức năng và có thể in hoặc trả lại bánh pizza được dán nhãn. Người ghi nhãn ngắn nhất trong các trận thắng.

Ví dụ

ví dụ 1

Đặt hàng: 4,1

Một số bánh pizza có thể dán nhãn:

EDMC
MEDC
CDEM

Ví dụ 2

Đặt hàng: 4,4

Một số bánh pizza có thể dán nhãn:

MMMM
CCCC
DDDD
EEEE
DEMC
DEMC
DEMC
DEMC
CCCC
DEEM
DEEM
DDMM

Ví dụ 3

Đặt hàng: 8,3

Một số bánh pizza có thể dán nhãn:

MMMMMMCC
DDDDCCCC
DDEEEEEE
DDDCMMMM
DCDCMEEE
DCCCMEEE

Ví dụ 4

Đặt hàng: 20,5

Pizza có thể dán nhãn:

DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC

(Ở Dđây không được kết nối đơn giản nhưng không sao.)


12
@BetaDecay Nó chủ yếu là một thiết bị gieo vần tiêu chảy.
Sở thích của Calvin

28
Họ yêu cầu các bộ lát tương ứng của chúng được kết nối với đường dẫn . Thật đáng sợ khi bạn biết điều đó về tôi ...
Dennis

22
Được rồi, những gì với miếng bánh pizza hình chữ nhật kỳ lạ này bạn đã cho tôi? Tôi muốn hoàn lại tiền!
Doorknob

12
@flawr Không dành cho bạn, không phải mod.
Sở thích của Calvin

14
"-Máy dán nhãn Shortest trong cắn thắng" - Tôi xem những gì bạn đã làm ở đó.
DankMeme

Câu trả lời:


21

CJam, 20 byte

q~1$*4/"CEDM"e*/:$N*

Tôi nghĩ rằng điều này sẽ làm việc :)

Dùng thử trực tuyến

Giải trình:

Điều này đầu tiên làm cho một chiếc bánh pizza có nhãn CCTH EE 'DD DD MM MM từ trái sang phải và từ trên xuống dưới, sau đó sắp xếp từng hàng theo thứ tự bảng chữ cái. Việc ngắt kết nối duy nhất có thể xảy ra giữa viền CE và viền ED, hoặc viền ED và viền DM (nếu chúng nằm trên các hàng liền kề). Nhưng việc sắp xếp đảm bảo rằng E đi về phía bên phải và D đi về phía bên trái, vì C <E> D <M, do đó, E và D vẫn được kết nối.

q~          read and evaluate the input
1$          copy the width
*4/         multiply with the height and divide by 4
"CEDM"e*    repeat each letter in "CEDM" that many times
/           split into rows of the given width
:$          sort each row
N*          join with newlines

1
Chọn hàng đảo ngược được chia sẻ bởi Doorknob và tôi. Đó là một cách sử dụng thông minh $!
Dennis


7

K, 61 byte

{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}

Ví dụ:

ryan@DevPC-LX:~/golf$ rlwrap k2
K 2.8 2000-10-10 Copyright (C) 1993-2000 Kx Systems
Evaluation. Not for commercial use. 
\ for help. \\ to exit.

  `0:{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}[4;1]
EDMC
  `0:{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}[4;4]
EEEE
DDDD
MMMM
CCCC
  `0:{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}[8;3]
EEEEEEDD
MMMMDDDD
MMCCCCCC
  `0:{[a;b]{((+:;|:)@x!2)[r@x]}'!#r:(b;a)#,/{(_(a*b)%4)#x}'"EDMC"}[20;5]
EEEEEEEEEEEEEEEEEEEE
DDDDDDDDDDDDDDDEEEEE
DDDDDDDDDDMMMMMMMMMM
CCCCCMMMMMMMMMMMMMMM
CCCCCCCCCCCCCCCCCCCC

ryan@DevPC-LX:~/golf$ 

Tôi ghét phải là người phải cắt những thứ này ...


Hình như nó ngoằn ngoèo qua lại, từ trên xuống dưới. Đúng không? (Nó có hoạt động 1,8không?)
Sở thích của Calvin

@ Calvin'sHob sở thích Nó hoạt động cho đầu vào đó.
kirbyfan64sos

1
Tôi sẽ sử dụng cách tiếp cận tương tự và tôi khá chắc chắn rằng nó hoạt động. Đó là C hris mặc dù.
Dennis

@Dennis Rất tiếc. Đã sửa.
kirbyfan64sos

7

Bình thường, 20 byte

VceQs*L/*FQ4"CEDM"SN

Sử dụng thủ thuật sắp xếp của @ aditsu.

Trình diễn, thuyết trình.

Tôi đã nghĩ ra một số lượng lớn các chương trình thay thế có cùng độ dài trong khi cố gắng chơi gôn này:

VceQs*L/*FQ4"CEDM"SN
VceQsCm"CEDM"/*FQ4SN
VceQs*L*FQ"CEDM"%4SN
VceQ%4s*L*FQ"CEDM"SN
VcQs*L/*Qvz4"CEDM"SN    (Newline separated input)
jbSMceQs*L/*FQ4"CEDM
Vcs*L/*FQ4"CEDM"hQSN

6

Bị mắc kẹt , 42 33

Nó trở lại! Và ở dạng rất dài. :( - Tôi đã đánh cắp ý tưởng sắp xếp của aditsu để tiết kiệm 9 byte :)

t;g*4/[4*"CEDM"z"];F*":j0GK'$:Nj

Giải trình:

t;g*4/                              # Take |-separated input,
                                    #   store the first value in var stack,
                                    #   multiply the two numbers and divide by 4.
      [4*"CEDM"z                    # Wrap that value in an array, make 3 copies
                                    #   to get a list of length 4, zip with "EDMC"
                "];F*":j0GK         # For each item, multiply letter by value to
                                    #   to get string, join the result, split into
                                    #   segments the size of the saved variable.
                            '$:Nj   # For each item, sort so the letters are in the correct
                                    #   order, join by newline, print.

Ví dụ đầu vào:

20|5

Ví dụ đầu ra:

CCCCCCCCCCCCCCCCCCCC
CCCCCEEEEEEEEEEEEEEE
DDDDDDDDDDEEEEEEEEEE
DDDDDDDDDDDDDDDMMMMM
MMMMMMMMMMMMMMMMMMMM

Bạn có chắc chắn nó sẽ được kết nối đơn giản cho 8|3?
yo '

@yo 'Vâng. Nó đầu ra CCCCCCEE\nDDDDEEEE\nDDMMMMMM.
Kade

/ me_stool, xin lỗi vì điều đó.
yo '

4

Rev 1 C, 74

i;f(w,h){for(i=w*h;i--;i%w||puts(""))putchar(h-i/w*2==1^"CDEM"[i*4/w/h]);}

Để tiết kiệm 1 byte, phiên bản này đảo ngược (chỉ) hàng giữa các lát cho bất kỳ số hàng lẻ nào.

Rev 0 C, 75

i;f(w,h){for(i=w*h;i--;i%w||puts(""))putchar(h==3&i/w==1^"CDEM"[i*4/w/h]);}

Nhiều câu trả lời ở đây ngoằn ngoèo, nhưng trong hầu hết các trường hợp, chỉ cần xuất các chữ cái theo thứ tự (trái sang phải, từ trên xuống dưới) hoạt động tốt:

Không cần ngoằn ngoèo cho độ cao 1,2 hoặc 4

Không cần phải ngoằn ngoèo cho chiều cao lớn hơn 4 (khẩu phần pizza của mỗi mod sẽ bao quanh.)

Do đó, chúng ta chỉ thực sự cần ngoằn ngoèo khi chiều cao là 3, và sau đó chúng ta chỉ cần đảo ngược hàng giữa.

Hóa ra, Dennis và Doorknob là những mod duy nhất trên hàng đó. Và chúng có thể được hoán đổi bằng cách XOR mã ASCII của chúng với 1.

Điều này rất hữu ích khi không có cách nào dễ dàng đảo ngược chuỗi trong C.

Ungolfed trong chương trình thử nghiệm

i;
f(w,h){
  for(i=w*h;i--;i%w||puts(""))            //loop through all squares. puts inserts a newline at the END of each line.
  putchar(h==3&i/w==1^"CDEM"[i*4/w/h]);   //put the letter, XORing D and E for the middle row of height 3.
}

W,H;
main(){
  scanf("%d%d",&W,&H);
  f(W,H);
} 

Giải thích tuyệt vời.
trichoplax

1

JavaScript (ES6) 107

Dung dịch ngoằn ngoèo. Sử dụng chuỗi mẫu, dòng mới là quan trọng và được tính.

Kiểm tra chạy đoạn mã với FireFox.

f=(w,h)=>{for(i=o=r='',z=l=1;--l?l:c='CDEM'[l=w*h/4,i++];r[w-1]&&(o+=r+`
`,r='',z=!z))r=z?r+c:c+r;return o}


//TEST

(test=_=>([w,h]=I.value.match(/\d+/g),O.innerHTML=f(w,h)))()
<input id=I value='8 3'><button onclick='test()'>-></button>
<pre id=O></pre>


0

Võng mạc , 83 byte

Các tính năng được sử dụng trong câu trả lời này mới hơn thử thách này (không phải là vấn đề ...). Số lượng byte giả định mã hóa ISO 8859-1.

\d+
$*#
#(?=.*¶(.+))
$1
\G####
CDEM
S_`((.)+?(?=.*¶(?<-2>#)+$))|\D
O`.
T`DE`ED
O%`.

Hãy thử trực tuyến!

Điều này thực hiện giải pháp của aditsu hiện đang khả thi nhờ các giai đoạn sắp xếp mới.

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.