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


42

Programlama Bulmacaları ve Kod Golf , yeni bir moderatör olmak üzere , Dennis ! Bu zorluk, kendimize ve diğer aktif (veya yakın zamanda aktif) moderatörlerimize bir hediyedir : Doorknob , Martin Büttner ve Chris Jester-Young . Görev, Pepto Bismol şarkısının melodilerine okunacak .

Temelde, biz pizza için hepsini tedavi için gidiyoruz On dokuzuncu Pizzeria Bite , ama emin onlar oldukça çünkü paylaşmak yapmak gerekir bazı ait mods Pizza bağımlıları olduğu bilinen!

Pizzacı tarafından satılan pizzaların hepsi metnin dikdörtgen bloklarıdır. Bir pizzanın genişliği ve uzunluğu, ürünleri dörte bölünebildiği sürece, negatif olmayan herhangi bir tam sayı olabilir. Metin pizza bloğundaki her ızgara alanı bir dilimi temsil eder, bu nedenle dilimleri dört eşit gruba ayırmak her zaman mümkündür.

Mods toplu olarak tek bir pizza sipariş edecek ve genişlik ve uzunluk parametrelerini sunucularına uygun herhangi bir formatta sunacak [width],[length]. Pizza masalarına gelmeden hemen önce, her dilimi eşit şekilde paylaşmalarını sağlamak için yiyebilecekleri modun baş harfleriyle etiketlemeniz gerekir. Herkes aynı sayıda dilime sahip olmalı.

  • E Dennis için
  • D Doorknob için
  • M Martin için
  • C Chris için

Bununla birlikte, modlar biraz titizdir ve ilgili dilimler kümelerinin yola bağlı olmasını gerektirir; yani, diğer dilimlerinden birinin üstünden geçmeyerek yukarı, aşağı, sola ve sağa hareket ettirilerek tüm dilimlerinden birbirlerinden ulaşılabilir olması gerekir. dilimler (ve çapraz hareket etmiyor). Bunu yaptığın sürece nasıl yaptığın umrunda değil .

Her dilimi doğru şekilde etiketledikten sonra, isteğe bağlı izleyen bir yeni satırla pizzaları modlara getirin.

Etiketleyiciniz bir program veya işlev olabilir ve etiketli pizza yazdırabilir veya iade edebilir. Isırıklardaki en kısa etiketleme kazanır.

Örnekler

örnek 1

Sipariş: 4,1

Bazı Olası Etiketli Pizzalar:

EDMC
MEDC
CDEM

Örnek 2

Sipariş: 4,4

Bazı Olası Etiketli Pizzalar:

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

Örnek 3

Sipariş: 8,3

Bazı Olası Etiketli Pizzalar:

MMMMMMCC
DDDDCCCC
DDEEEEEE
DDDCMMMM
DCDCMEEE
DCCCMEEE

Örnek 4

Sipariş: 20,5

Olası Bir Etiketli Pizza:

DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC

( DBurada basitçe bağlı değil ama sorun yok.)


12
@ BetaDecay Temelde bir ishal kafiye cihazıdır.
Calvin'in Hobileri

28
Onlar dilim kendi setleri yolu bağlantılı olmasını gerektirir . Benim hakkımda bunu bilmen biraz korkutucu ...
Dennis,

22
Tamam, ne ile bana verdiğin bu garip dikdörtgen-anahat şeklinde pizza dilimi? Para iadesi istiyorum!
Doorknob

12
@flawr Sizin gibi değil, mod dışı.
Calvin'in Hobileri

14
" Isırıklardaki en kısa etiketleyici kazanıyor" - Orada ne yaptığını anladım.
DankMemes

Yanıtlar:


21

CJam, 20 bayt

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

Bunun çalışması gerektiğini düşünüyorum :)

Çevrimiçi deneyin

Açıklama:

Bu ilk önce CC… EE… DD… MM… etiketli bir pizza yapar, soldan sağa ve yukarıdan aşağıya, ardından her bir sırayı alfabetik sıraya göre sıralar. CE bağlantısı ile ED sınırı veya ED sınırı ile DM sınırı arasında yalnızca kopukluklar olabilir (eğer bitişik sıralara düşerse). Ancak sıralama, E'nin sağ tarafa gitmesini ve D'nin, C <E> D <M olarak sola gitmesini sağlar, böylece E'ler ve D'ler bağlı kalır.

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
Doorknob ve ben tarafından paylaşılan satırları seçerek tersine çevir. Bu akıllıca bir kullanım $!
Dennis,


7

K, 61 bayt

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

Örnekler:

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$ 

Bu şeyleri dilimlemek zorunda olan kişi olmaktan nefret ediyorum ...


Görünüşe göre zikzak zıplıyor, yukarıdan aşağıya. Bu doğru mu? (Çalışacak 1,8mı?)
Calvin'in Hobileri

@ Calvin's Hobbies Bu girdi için çalışıyor gibi görünüyor.
kirbyfan64sos 28:15

1
Aynı yaklaşımı kullanacaktım ve işe yaradığından eminim. Yine de C hris.
Dennis,

@Dennis Whoops. Sabit.
kirbyfan64sos

7

Pyth, 20 bayt

VceQs*L/*FQ4"CEDM"SN

@ Aditsu'nun sıralama hilesini kullanır.

Gösteri.

Bunu golf oynamaya çalışırken aynı uzunlukta çok sayıda alternatif program buldum:

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

Sıkışmış , 42 33

Dönüyor! Ve çok uzun bir biçimde. :( - Aditsu'nun 9 byte tasarruf etme fikrini çaldım :)

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

Açıklama:

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.

Örnek giriş:

20|5

Örnek çıktı:

CCCCCCCCCCCCCCCCCCCC
CCCCCEEEEEEEEEEEEEEE
DDDDDDDDDDEEEEEEEEEE
DDDDDDDDDDDDDDDMMMMM
MMMMMMMMMMMMMMMMMMMM

Bunun basitçe bağlanacağından emin misin 8|3?
yo'

@ yo 'Evet. Çıktıları CCCCCCEE\nDDDDEEEE\nDDMMMMMM.
Kade

/ me_stupid, bunun için üzgünüm.
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]);}

1 baytlık bir kaydetme için, bu sürüm herhangi bir tek sayıda satır için orta dilim dilimi tersine çevirir (sadece).

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

Buradaki birçok cevap zikzaktır, ancak çoğu durumda harfleri sırasıyla (soldan sağa, yukarıdan aşağıya) sırayla vermek yeterlidir:

1,2 veya 4 yükseklikleri için zikzak yapmaya gerek yok

4'ten büyük yüksekliklerde zikzak yapmaya gerek yok (her bir modun pizza kısmı sarılacak.)

Bu nedenle sadece yükseklik 3 olduğunda zikzak yapmamız gerekir ve ardından sadece orta sırayı tersine çeviririz.

Görünen o ki, Dennis ve Doorknob bu sıradaki tek modlar. Ve XORing ile ASCII kodlarını 1 ile değiştirebilirler.

Bu, C dilinde bir dizgiyi ters çevirmenin kolay bir yolu olmadığı göz önüne alındığında kullanışlıdır.

Test programında Ungolfed

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

Harika bir açıklama.
trichoplax

1

JavaScript (ES6) 107

Zikzak çözümü. Şablon dizesini kullanarak, yeni satır anlamlı ve sayılır.

Snippet'in FireFox ile çalışmasını test edin.

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 bayt

Bu cevapta kullanılan özellikler bu zorluktan daha yenidir (önemli değil ...). Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

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

Çevrimiçi deneyin!

Bu, aditsu'nun yeni sıralama aşamaları sayesinde artık biraz uygun olan çözümünü uygulamaktadır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.