デニス、ドアノブ、マーティン・ブットナー、クリス・ジェスター・ヤング-ピッツェリア!


42

プログラミングパズルとコードゴルフは、新しいモデレーターデニスを獲得しようとしています!この課題は、彼と私たちの他のアクティブな(または最近アクティブ)モデレーターへのオマージュであるドアノブマーティンBüttner、そしてクリス・ジェスター・ヤング。チャレンジタイトルはペプトビスモルの歌の曲を読むことを意図しています。

基本的に、我々はすべてのピザにそれらを扱うつもりPizzeriaの一口十九、しかしので、我々は確かに彼らはかなりそれを共有するために必要ないくつかの改造がピザ中毒であることが知られています!

ピッツェリアが販売するピザは、すべて長方形のテキストブロックです。ピザの幅と長さは、その製品が4で割り切れる限り、任意の非負の整数にできます。テキストピザのブロック内の各グリッドスペースはスライスを表すため、スライスを常に4つの等しいグループに分割することができます。

MODは単一のピザをまとめて注文し、その幅と長さのパラメーターをなどの合理的な形式でサーバーに提供します[width],[length]。ピザがテーブルに到着する直前に、すべてのスライスが公平に共有されるように、各スライスに食べられるmodのイニシャルをラベル付けする必要があります。全員が同じ数のスライスを取得する必要があります。

  • E デニス用です
  • D ドアノブ用
  • M マーティン用です
  • C クリスのためです

ただし、MODは少し手間がかかり、それぞれのスライスセットがパス接続されている必要があります。つまり、すべてのスライスは、他の人のクロスを越えずに上下左右に移動することで互いに到達できる必要があります。スライス(対角線を移動しない)。それが行われている限り、これをどうやってやっても構いません。

各スライスに正確にラベルを付けたら、オプションの末尾の改行を付けてピザをmodに配信します。

ラベラーはプログラムまたは関数であり、ラベル付けされたピザを印刷または返却できます。一口の最短ラベラーが勝ちます。

例1

注文: 4,1

いくつかの可能なラベル付きピザ:

EDMC
MEDC
CDEM

例2

注文: 4,4

いくつかの可能なラベル付きピザ:

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

例3

注文: 8,3

いくつかの可能なラベル付きピザ:

MMMMMMCC
DDDDCCCC
DDEEEEEE
DDDCMMMM
DCDCMEEE
DCCCMEEE

例4

注文: 20,5

考えられるラベル付きピザ:

DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC

(ここのD'sは単純に接続されているわけではありませんが、大丈夫です。)


12
@BetaDecayそれは主に下痢の韻を踏む装置です。
カルビンの趣味

28
彼らは、スライスのそれぞれのセットがパスに接続されていることが必要です。あなたが私のことを知っているのは少し怖いです
デニス

22
さて、何あなたは私を与えてくれたこの奇妙な矩形のアウトライン型ピザスライス?払い戻しが欲しい!
ドアノブ

12
@flawrあなたの好きな人のためではなく、非mod。
カルビンの趣味

14
噛み付いた最も短いラベラー勝ちます」-あなたがそこで何をしたかわかります。
-DankMemes

回答:


21

CJam、20バイト

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

これはうまくいくと思う:)

オンラインで試す

説明:

これは、最初にCC…EE…DD…MM…というラベルのピザを左から右、上から下に作成し、次に各行をアルファベット順に並べ替えます。CEボーダーとEDボーダー、またはEDボーダーとDMボーダーの間でのみ切断が発生する可能性があります(隣接する行に該当する場合)。ただし、C <E> D <Mのように、ソートにより、Eが右側に、Dが左側に移動するため、EとDは接続されたままになります。

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と私が共有する行を選択的に反転します。これは賢い使い方の1つ$です。
デニス


7

K、61バイト

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

例:

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$ 

私はこれらのものをスライスしなければならない人になりたくない...


上下にジグザグに動いているように見えます。あれは正しいですか?(それは動作し1,8ますか?)
カルビンの趣味

@ Calvin'sHobbiesその入力に対して動作するようです。
kirbyfan64sos

1
私は同じアプローチを使用するつもりでしたが、それがうまくいくと確信しています。それはCリスです。
デニス

@Dennisおっと。一定。
kirbyfan64sos

7

Pyth、20バイト

VceQs*L/*FQ4"CEDM"SN

@aditsuのソートトリックを使用します。

デモンストレーション。

これをゴルフしようとして、同じ長さの多数の代替プログラムを思いつきました。

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

立ち往生42 33

戻る!そしてとてつもなく長い形で。:(-9バイトを節約するためにaditsuのソートアイデアを盗みました:)

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

説明:

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.

入力例:

20|5

出力例:

CCCCCCCCCCCCCCCCCCCC
CCCCCEEEEEEEEEEEEEEE
DDDDDDDDDDEEEEEEEEEE
DDDDDDDDDDDDDDDMMMMM
MMMMMMMMMMMMMMMMMMMM

単純に接続され8|3ますか?
yo

@yo 'はい。出力しますCCCCCCEE\nDDDDEEEE\nDDMMMMMM
カデ

/ me_stupid、ごめんなさい。
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バイトの節約の場合、このバージョンは、奇数行のスライスの中央の行を反転(のみ)します。

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

ここでは多くの答えがジグザグになっていますが、ほとんどの場合、文字を順番に(左から右、上から下に)出力するだけでうまくいきます。

高さ1、2、4の場合はジグザグにする必要はありません

4を超える高さの場合、ジグザグにする必要はありません(各modのピザの配給量は折り返します)

したがって、実際には高さが3の場合にのみジグザグする必要があり、その後は中央の行を逆にするだけです。

結局のところ、デニスとドアノブはその行の唯一の改造です。また、ASCIIコードを1とXORすることで交換できます。

Cで文字列を逆にする簡単な方法がないので、これは便利です。

テストプログラムでゴルフをしていません

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

素晴らしい説明。
trichoplax

1

JavaScript(ES6)107

ジグザグソリューション。テンプレート文字列を使用すると、改行は重要でカウントされます。

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

網膜、83バイト

この回答で使用されている機能は、この課題よりも新しいものです(重要ではありません...)。バイトカウントはISO 8859-1エンコードを前提としています。

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

オンラインでお試しください!

これにより、新しいソートステージのおかげで現在実現可能となっているaditsuのソリューションが実装されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.