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


42

Programming Puzzles & Code Golf akan mendapatkan moderator baru , Dennis ! Tantangan ini merupakan penghargaan kepadanya dan moderator aktif kami yang lain (atau yang baru-baru ini aktif): Doorknob , Martin Büttner , dan Chris Jester-Young . Judul tantangan dimaksudkan untuk dibaca sesuai dengan lagu Pepto Bismol .

Pada dasarnya, kita akan memperlakukan mereka semua untuk pizza di The Nineteenth Bite Pizzeria , tapi kami perlu memastikan mereka berbagi cukup karena beberapa dari para mods diketahui pecandu pizza!

Pizza yang dijual oleh restoran pizza adalah semua blok teks persegi panjang. Lebar dan panjang pizza bisa berupa bilangan bulat non-negatif selama produknya dapat dibagi empat. Setiap ruang kisi di blok pizza teks mewakili sebuah irisan, jadi selalu mungkin untuk membagi irisan menjadi empat grup yang sama.

Mod secara kolektif akan memesan pizza tunggal, memberikan parameter lebar dan panjangnya ke server mereka dalam format apa pun yang masuk akal seperti [width],[length]. Tepat sebelum pizza tiba di meja mereka, Anda perlu memberi label setiap irisan dengan inisial mod yang akan memakannya untuk memastikan mereka semua berbagi secara adil. Setiap orang harus mendapatkan jumlah irisan yang sama.

  • E adalah untuk Dennis
  • D untuk Doorknob
  • M adalah untuk Martin
  • C untuk Chris

Namun, mod-mod tersebut sedikit persnickety, dan mensyaratkan bahwa masing-masing set irisannya harus terhubung dengan jalur , yaitu, bahwa semua slice mereka dapat dicapai dari satu sama lain dengan bergerak ke atas, bawah, kiri, dan kanan, tidak melintasi milik orang lain. irisan (dan tidak bergerak diagonal). Tidak peduli bagaimana Anda melakukan ini selama ini dilakukan.

Setelah Anda memberi label akurat pada setiap irisan, kirimkan pizza ke mod dengan baris tambahan opsional.

Labeler Anda dapat berupa program atau fungsi dan dapat mencetak atau mengembalikan pizza berlabel. Labeler terpendek dalam gigitan menang.

Contohnya

Contoh 1

Memesan: 4,1

Beberapa pizza berlabel yang mungkin:

EDMC
MEDC
CDEM

Contoh 2

Memesan: 4,4

Beberapa pizza berlabel yang mungkin:

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

Contoh 3

Memesan: 8,3

Beberapa pizza berlabel yang mungkin:

MMMMMMCC
DDDDCCCC
DDEEEEEE
DDDCMMMM
DCDCMEEE
DCCCMEEE

Contoh 4

Memesan: 20,5

Pizza berlabel yang mungkin:

DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC

(Yang Ddi sini bukan hanya terhubung tetapi tidak apa-apa.)


12
@BetaDecay Ini terutama perangkat berima diare.
Calvin Hobbies

28
Mereka mengharuskan set irisannya masing-masing terhubung dengan jalur . Agak menakutkan kalau Anda tahu tentang saya ...
Dennis

22
Oke, ada apa dengan potongan pizza berbentuk persegi panjang aneh yang telah Anda berikan kepada saya? Saya ingin pengembalian uang!
Gagang Pintu

12
@ flawr Bukan untuk orang-orang seperti Anda, non-mod.
Calvin Hobbies

14
"Labeller terpendek dalam gigitan menang" - Saya melihat apa yang Anda lakukan di sana.
DankMemes

Jawaban:


21

CJam, 20 byte

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

Saya pikir ini harus berhasil :)

Cobalah online

Penjelasan:

Ini pertama-tama membuat pizza berlabel CC ... EE ... DD ... MM ... dari kiri ke kanan dan atas ke bawah, kemudian mengurutkan setiap baris dalam urutan abjad. Satu-satunya pemutusan dapat terjadi antara perbatasan CE dan perbatasan ED, atau perbatasan ED dan perbatasan DM (jika jatuh pada baris yang berdekatan). Tapi penyortiran memastikan bahwa E pergi ke sisi kanan dan D pergi ke sisi kiri, seperti C <E> D <M, sehingga E dan D tetap terhubung.

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
Secara selektif membalikkan baris yang dibagikan oleh Doorknob dan saya. Itu salah satu penggunaan cerdas $!
Dennis


7

K, 61 byte

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

Contoh:

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$ 

Aku benci menjadi orang yang harus mengiris ini ...


Sepertinya itu zig-zag bolak-balik, dari atas ke bawah. Apakah itu benar? (Apakah akan berhasil 1,8?)
Hobi Calvin

@ CalvinHobbies Tampaknya berhasil untuk input itu.
kirbyfan64sos

1
Saya akan menggunakan pendekatan yang sama dan saya cukup yakin itu berhasil. Tapi C hris.
Dennis

@ Dennis Whoops. Tetap.
kirbyfan64sos

7

Pyth, 20 byte

VceQs*L/*FQ4"CEDM"SN

Gunakan trik penyortiran @ aditsu.

Demonstrasi.

Saya datang dengan sejumlah besar program alternatif dengan panjang yang sama ketika mencoba bermain golf ini:

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

Terjebak , 42 33

Ia kembali! Dan dalam bentuk yang sangat panjang. :( - Saya mencuri ide semacam aditsu untuk menghemat 9 byte :)

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

Penjelasan:

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.

Input contoh:

20|5

Contoh output:

CCCCCCCCCCCCCCCCCCCC
CCCCCEEEEEEEEEEEEEEE
DDDDDDDDDDEEEEEEEEEE
DDDDDDDDDDDDDDDMMMMM
MMMMMMMMMMMMMMMMMMMM

Apakah Anda yakin itu akan terhubung dengan mudah 8|3?
yo

@yo 'Ya. Ini menghasilkan CCCCCCEE\nDDDDEEEE\nDDMMMMMM.
Kade

/ me_stupid, maaf untuk itu.
yo

4

Wahyu 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]);}

Untuk penghematan 1 byte, versi ini membalikkan (hanya) baris tengah irisan untuk setiap jumlah baris ganjil.

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

Banyak jawaban di sini zigzag, tetapi dalam kebanyakan kasus, hanya mengeluarkan huruf-huruf secara berurutan (kiri ke kanan, atas ke bawah) berfungsi dengan baik:

Tidak perlu zigzag untuk ketinggian 1,2 atau 4

Tidak perlu zig-zag untuk ketinggian lebih dari 4 (ransum pizza masing-masing mod akan membungkus.)

Karena itu kita hanya perlu zigzag ketika tingginya 3, dan kemudian kita hanya perlu membalikkan baris tengah.

Ternyata, Dennis dan Doorknob adalah satu-satunya mod di baris itu. Dan mereka dapat dipertukarkan dengan XORing kode ASCII mereka dengan 1.

Ini berguna mengingat tidak ada cara mudah untuk membalikkan string dalam C.

Tidak terkurung dalam program uji

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

Penjelasan yang bagus.
trichoplax

1

JavaScript (ES6) 107

Solusi Zigzag. Menggunakan string template, baris baru signifikan dan dihitung.

Tes menjalankan cuplikan dengan 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

Retina , 83 byte

Fitur yang digunakan dalam jawaban ini lebih baru daripada tantangan ini (bukan berarti penting ...). Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Cobalah online!

Ini mengimplementasikan solusi aditsu yang sekarang agak layak berkat tahap sortir baru.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.