Pentomino Rectangleを印刷する


16

入力を受け取らず、12個の異なるペントミノで作られた長方形のテキスト表現を常に印刷または返すプログラムまたは関数を作成します。

12個のペントミノ

長方形のサイズと方向は任意ですが、12個すべてのペントミノを1回だけ使用する必要があるため、エリア60になります。各ペントミノは、異なる印刷可能なASCII文字で構成する必要があります(使用する必要はありません)上からの手紙)。

たとえば、この20×3ペントミノ長方形ソリューションを出力することを選択した場合:

3x20ソリューション

プログラムの出力は次のようになります。

00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-

あるいは、この6×10ソリューションをゴルフする方が簡単かもしれません:

000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!

長方形のソリューションならどんなものでもかまいませんが、プログラムで印刷する必要があるのは1つだけです。(出力の末尾の改行は問題ありません。)

この優れたWebサイトには、さまざまな長方形のサイズに対応する多数のソリューションがあります。おそらく、ソリューションをできるだけ短くするために、それらを参照する価値があります。これはコードゴルフで、バイト単位の最短回答が勝ちです。


15
Pietの「クイン」であればボーナス。
mbomb007

@ mbomb007プレイするブロックが12ブロックしかないため、ほとんど不可能です:P
Sp3000

国境にスペースを入れるべきだとは思いません。しかし、そうであるため、末尾のスペースを省略できますか?最後にスペースが足りない状態で垂直5x12ソリューションを印刷するとボーナスがもらえますか?
ジョンドヴォルザーク

@ Sp3000ペントミノ長方形ソリューションのみで構成されるPietプログラムはどうですか?
ジョンドヴォルザーク

@JanDvorak末尾のスペースがある場合は、省略することはできません。これらは、印刷可能なASCIIの残りの部分と同じ文字です。
カルビンの趣味

回答:


1

Pyth、37バイト

jc4.HC"&f3ªªwril3:[·)ÌDU[r)ÌDA»

デモンストレーション

非常に簡単なアプローチを使用します。16進バイトを数値として使用します。16進数に変換し、ベース256でエンコードします。上記の魔法の文字列が得られます。デコードするには、Pythのベース256デコーダー関数を使用して、16進数に変換し、4つのチャンクに分割して、改行で結合します。


5

CJam(44バイト)

制御文字が含まれているため、xxd形式で指定されています(MarkDownで実際に動作が悪い生のタブを含む)。

0000000: 2202 7e0d 8ef3 570d e085 e168 cf27 092c
0000010: a235 0c22 3235 3662 3562 332f 5f2c 2c2e
0000020: 7b32 2f27 412b 662b 7d7a 4e2a 

の行に沿って何かにデコードします

"MAGIC STRING"256b5b3/_,,.{2/'A+f+}zN*

制御文字を含まない、ブラウザURIデコードライブラリ関数とうまく機能する、わずかに利用できないオンラインデモ

基本的な原則は、5行以上にまたがるピースがないため、行番号の線形関数からのオフセットをコンパクトにエンコードできることです(実際、基数5で、これが常に当てはまるかどうかを判断しようとしませんでしたが)。


5

Bash +一般的なLinuxユーティリティ、50

xxd -s20 -p -c2 $0
#<30 bytes of binary data>

エンコードされたbase64からこれを再作成するには:

base64 -d <<< eHhkIC1zMjAgLXAgLWMyICQwCiMiImaSaZlmkDAAMwSjRKNEqoGogYhRVVF7UXu7d3s= > pent.sh

12個のペントミノが存在するため、それらの色は16進ニブルで簡単にエンコードされます。

出力:

$ ./pent.sh
2222
6692
6999
6690
3000
3304
a344
a344
aa81
a881
8851
5551
7b51
7bbb
777b
$ 

4

J、49バイト

u:64++/\|:3#.inv 1377859090 1567813024 1337683230

垂直方向に隣接する文字間の最大増分が2になるように文字を選択できます。この事実を使用して、base3で垂直増分をエンコードします。その後、実行中の合計を作成し、オフセットを追加して文字のASCIIコードを取得します。

間違いなくゴルフ可能。(拡張精度のbase36数値を入力する方法はまだ見つかりませんが、単純なbase36では3バイトだけを節約できます。)

出力:

AAA
ABA
BBB
DBC
DCC
DCC
DEE
DFE
FFE
FGE
FGG
GGH
HHH
IIH
JII
JJI
JKK
JKL
KKL
LLL

こちらからオンラインでお試しください。


非常に素晴らしい。base-256エンコーディングを使用して、CJamでこの差分エンコーディングを適用すると、33バイトが得られます(b256なしの48バイトバージョン)。
ピーターテイラー

これはすごい!また、4x15でも機能します。これは、データを縦方向ではなく横方向に格納する場合、4つの数値を1バイトにパックするのに適しています。Uペントミノが正しい方向に向いているレイアウトが必要です。質問のリンクにはたくさんあります。
レベルリバーセント

@steveverrill最初の行から4つ以上のピースが始まるため、そのための開始オフセットが必要になります。そのため、それらをbase4にコーディングすることはできません。この余分なオフセット(例えばで3#i.5ある0 0 0 1 1 1 ... 4 4 4)それが動作することができますが、おそらく(私が試した、少なくとも道)より短くなりません。
randomra

2

Microscript II、66バイト

簡単な答えから始めましょう。

"00.@@@ccccF111//=---\n0...@@c))FFF1//8===-\n00.ttttt)))F1/8888=-"

完全な暗黙の印刷。


1

ルビー

Rev 3、55バイト

i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}

Randomraのアイデアをさらに発展させるために、以下の出力と差異の表を検討してください。差分テーブルは以前のように圧縮でき、65 = binary 1000001を掛けてマスク11001100110011を適用することで拡張できます。ただし、Rubyは8ビット文字では予測どおりに動作しません(Unicodeとして解釈する傾向があります)。

驚くべきことに、最後の列は完全に均等です。このため、圧縮では、データに対して右シフトを実行できます。これにより、すべてのコードが7ビットASCIIになります。展開では、65ではなく65 * 2 = 130を乗算します。

最初の列も完全に均等です。したがって、必要に応じて各要素に1(各バイトに32)を追加して、制御文字を回避できます。不要な1は、マスク1111100110011 = 9011を代わりに11001100110011を使用して削除されます。

Solution 59 of document linked in question

Start0001

Out  Diff
2223 2222
2433 0210
2433 0000
4445 2012
6555 2110
6577 0022
6687 0110
6887 0200
8897 2010
aa99 2202
caa9 2010
cab9 0010
cbbb 0102
cdbd 0202
cddd 0020

テーブルには15バイトを使用していますが、実際には各バイトの6ビットのみを使用しており、合計90ビットです。実際、各バイトに可能な値は36のみであり、合計で2.21E23の可能性があります。これは、77ビットのエントロピーに収まります。

Revra、58バイト、Randomraのインクリメンタルアプローチを使用

i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}

最後に、単純なソリューションよりも短いもの。Revraのバイトパッキング方式を使用したRandomraのインクリメンタルアプローチ。

Rev 1、72バイト、rev 0のゴルフバージョン

ゴルフの理由でコードの並べ替えに対応するためにベースラインにいくつかの変更が加えられましたが、それでもナイーブなソリューションよりも長くかかりました。

i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}

オフセットは、形式4でベース4のマジックストリングの各文字にエンコードされますBAC。つまり、1は右側のシンボルを表し、16は中央のシンボルを表し、左側のシンボルは4の位置に蹄鉄を打ちます。それらを抽出するために、ASCIIコードに65(バイナリ1000001)を掛けてを与えBACBAC、次に819(バイナリ1100110011)でANDを与えてを与え.A.B.Cます。

ASCIIコードの中には、制御文字を避けるために、必要な値より64高い7番目のビットが設定されているものがあります。このビットはマスク819によって削除されるため、値Cが3でキャリーオーバーが発生する場合を除き、これは重要ではありません。これは1つの場所でのみ修正する必要があります(代わりにgを使用する必要がありcます)。

Rev 0、未使用バージョン

a= %w{000 010 000 201 100 100 011 021 110 120 011 112 111 221 211 221 122 123 112 222}
i=2
a.each{|e|puts "%x"%(i/2*273+e.to_i(16));i+=1} 

出力

111
121
222
423
433
433
455
465
665
675
677
778
888
998
a99
aa9
abb
abc
bbc
ccc

説明

次のソリューションから、ベースラインを減算し、データとして保存するオフセットを指定します。ベースラインは、コード内の16進数として再生成されますi/2*273(10進数273 = 16進数111)。

solution   baseline   offset
AAA        AAA        000
ABA        AAA        010
BBB        BBB        000
DBC        BBB        201
DCC        CCC        100
DCC        CCC        100
DEE        DDD        011
DFE        DDD        021
FFE        EEE        110
FGE        EEE        120
FGG        FFF        011
GGH        FFF        112
HHH        GGG        111
IIH        GGG        221
JII        HHH        211
JJI        HHH        221
JKK        III        122
JKL        III        123
KKL        JJJ        112
LLL        JJJ        222

それは私のものと本質的に同じアプローチのように見えますが、ベース5でエンコードすることを余儀なくされた4の単一のデルタを回避することができました。
ピーターテイラー

私は私の投稿後にあなたの答えを見ました。私はCjamをフォローすることはできませんが、あなたの答えであなたが言ったことから、それは同様のアプローチです。実際3、テーブル全体に1つしかありません(右下)ので、ベースラインを各行ごとに0.5少しだけ増やすことで、実際にベース3を使用できる可能性があると思います。(ゴルフの理由から、ベースラインをわずかに変更する必要があるようです。これにより、3が増えます。残念ながら、Rubyの単純なソリューションよりも1バイト長くなりそうです。)
Level River St

はっきりしていない場合、私の意図は、コピーよりもあなたを非難するのではなく、私よりも良い仕事をしたことを祝福することでした。そして、私はそれがrandomraの差分エンコーディングアプローチに勝るとは思わないので、2.5の成長率を使用しようとするつもりはありません。
ピーターテイラー

@PeterTaylorありがとう、おめでとうございます。一方、基本的には同じ考えで最初に着手し、それをはるかに短くしたので、おめでとうございます。randomraの差分アプローチを使用すると、最終的には単純なソリューションよりも短くなります。それは4x15でもうまく機能します(適切なペントミノレイアウトが与えられた場合)。それは私がCまたは8ビット文字列でうまく機能する他の言語でそれを行う方法です。RubyはUnicodeをサポートしているため、8ビット文字列をUnicodeとして解釈しようとするため、迷惑なエラーメッセージが表示される可能性があります。
レベルリバーセント

0

Foo、66バイト

"00.@@@ccccF111//=---\n0...@@c))FFF1//8===-\n00.ttttt)))F1/8888=-"

これは、上記のMicroscript IIソリューションと同一の文字です...これらの言語は関連していると思いますか?
ダレルホフマン

1
@DatrelHoffmanは本当に、fooが基本的には引用符ですべて印刷しない
TEOC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.