回答:
“×Ɗ¡‘ŒP»Ṫ¦209ṗ€3Fd⁴ịØHs3ṢQY
“×Ɗ¡‘
ゼリーの中の引用符の間の文字のコードポイント収率SBCSである、= 0x11を17、= 145 0x91を、とは0x00 = 0。
ŒP
コードポイントの配列のpowersetを構築し、以下を生成します
[[], [17], [145], [0], [17, 145], [17, 0], [145, 0], [17, 145, 0]]
最後の2つのエントリは80とFFの両方を含む組み合わせに対応しているため、それらを破棄する必要があります。
»Ṫ¦209
3つの部分で構成されます。
Ṫ
(tail)は、コードポイントの最後の配列、つまり[17、145、0]を削除します。
»209
冪との残りの各整数の最大値をとる0xD1 = 209でそれらのすべてを置き換える、209。
¦
(スパース)powersetの残りの要素を反復処理します。対応するインデックスが[17、145、0]で見つかった場合、要素はすべて209で置き換えられます。そうでない場合は、そのまま残されます。
¦
モジュール式ではないため、これはpowersetの残りの最後の配列(インデックス0)のみを変更します。インデックス17と145は大きすぎて効果がありません。
結果は次のとおりです。
[[], [17], [145], [0], [17, 145], [17, 0], [209, 209]]
ṗ€3
各配列の3番目のデカルト累乗、つまり、各配列のすべての3タプル要素の配列を計算します。
Fd⁴
結果を平坦化し、16で割った各整数の商と剰余を計算します。
ịØH
インデックス(1ベース)に「0123456789ABCDEFので、0x11を、0x91を、0x00の、および0xD1はにマッピングされ得る"00" 、"80" 、"FF" 、及び"C0"(RESP。)。
s3ṢQ
文字ペアを3タプルに分割し、タプルをソートして、重複排除します。
最後に、Y
改行で区切って一意のタプルを結合します。
a={00,80,FF}
eval echo $a$a$a|fmt -w9|sed '16iC0C0C0
/F0*8\|80*F/d'
{00,80,FF}{00,80,FF}{00,80,FF}
により、必要なすべての組み合わせが適切な順序(を除くC0C0C0
)で追加されます。エキストラは両方を含むものでありF
、および8
文字を。fmt
各エントリを独自の行に配置しますsed
挿入C0C0C0
しますsed
上記の「エクストラ」を除外します。イデオネ。
“mạ9ṣṃwɠƁ,¡ẓw’b4µża1$ị“08CF”s3Y
数値のベース250圧縮(“...’
)、
ベース4 に変換(b4
)、ベクトル化された論理の後に自身のコピーで
圧縮(ż
)、1(a1$
)*、使用される4文字に
インデックス付けị
(“08CF”
)、
チャンクに分割長さ3(s3
)で、
改行()で結合されていますY
。
*したがって、各ゼロ桁を別のゼロとペアリングし、他の数字をそれぞれ1つずつペアリングします。この手段をフェッチインデックス付き次とともに'F'
相互に対をなすようになる'F'
一方で'0'
、'8'
および'C'
各対'0'
。
ここでやるべきゴルフはまだたくさんあると思います。ゴルフの提案を歓迎します!
編集: -9バイト。文字列の書式設定を支援してくれたMegoに感謝します。最初に文字列を印刷するためのより良い方法を考え出すことから-17バイト。そもそもforループを書くためのより良い方法を考え出すことから-17バイト。-1バイトのi%3//2*"\n"
代わりに使用するxnorのヒントのおかげ"\n"*(i%3<2)
。
for i in range(48):print(end="F0C8F000"[0x10114abf7f75c147d745d55//4**i%4::4]+i%3//2*"\n")
アンゴルフ
z = 0
a = [0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 2, 2, 2, 3, 3, 3, 1, 3, 3, 3, 1, 3, 1, 1, 3, 0, 0, 1, 1, 0, 1, 3, 3, 1, 1, 3, 1, 0, 1, 1, 3, 1, 1, 1, 1, 1]
for i in range(len(a)):
z = (z + a[i]) * 4
z //= 4 # we multiplied by 4 one too many times
for i in range(48):
m = z // 4**j % 4
s = "F0C8F000"[c::4]
if i % 3 == 2:
s += "\n"
print(s, end="")
i%3//2*"\n"
バイトを保存します。
ニールのおかげで2バイト節約
これは、バックティックで生の文字列を返すよりも7 9バイト短くなります。
_=>[...'1121173113106393'].map(v=>[4,2,0].map(x=>'08CF'[x=n>>x&3]+'000F'[x],n+=+v||21).join``,n=-1).join`
`
.replace(/./g)
同じ長さである.map().join
が、.map(x=>'08CF'[x=n>>x&3]+'000F'[x],n+=+v||21)
2つのバイトを保存します。
'777
7780
77FF
7807
78080
7FF7
7FFFF
8077
80780
80807
808080
C0C0C0
FF77
FF7FF
FFFF7
FFFFFF'-replace7,'00'
ええ、私は単に文字列を印刷するよりも短いものを見つけていません...単純な置換を使用して7バイトを削減した@ Martin Smithに感謝します(私は完全に見落としていました)。したがって、単純にハードコーディングするよりも少なくとも7バイト短くなります。わーい!
しかし、それは退屈です!
代わりに...
[consolecolor[]](0,7+9..15)+-split'Lime Maroon Navy Olive Purple Silver Teal'|%{-join"$([windows.media.colors]::$_)"[3..8]}|sort
[system.consolecolor]
名前空間は、コンソール色(ネイティブ)を定義する利用可能な PowerShellコンソールにします。我々は、このような整数配列を経由して、それらを参照する場合、デフォルト値は、名前(例えば、あるBlack
か、White
など)。それを以前の文字列と組み合わせます-split
スペース上に、色名の文字列の配列ができます。
それらをループし|%{...}
、各反復で対応する[system.windows.media.colors]
値を引き出します。これらのオブジェクトのデフォルトの文字列化は、#AARRGGBB
16進値としての形式の色なので、スクリプトブロックを使用して文字列にその呼び出しをカプセル化することにより、それを活用します"$(...)"
。しかし、アルファ値やハッシュは[3..8]
必要ないので、文字列のバックエンドを取得し、-join
その結果のchar
-arrayを文字列に戻す必要があります。次に、Sort-Object
それらを正しい順序に並べるのが簡単です。
00
あり、.Replace(7,'00')
21文字未満です。
-replace
for 8
およびfor 80
は同じバイトカウントです(-replace8,80
長さである12個のゼロを保存します)。以下のためにそれを行うことはFF
理由の周りに必要な引用符の2バイトだけ長くなっている"FF"
中で-replace2,"FF"
のステートメント。
'80FFC000'2e'3na:1Fswv1=`uIn'F4:ZaZ)6e!
'80FFC000' % Push this string
2e % Reshape with 2 rows. So 1st column contains '80', 2nd 'FF' etc
'3na:1Fswv1=`uIn' % Push this string
F4:Za % Convert from base 95 to alphabet [1 2 3 4]
Z) % Use as column indices into the first string
6e! % Reshape with 6 rows and transpose.
% Implicitly display
•P{Ætg7«r¨ëÅ,…}ù¢Ý%Vt®£8ãøÚ$0óDÛY²Zþ…ð7ê‘Ó{òìàYëØU¥•hR6ô»
出力する必要があるのは、基本的に(反転と分割)です:
FFFFFF00FFFFFF00FF0000FF0C0C0C080808000808080008000008FFFF0000FF00080800000800FF0000080000000000
これは、10進数では次のとおりです。
39402003857025890357721060524755992261661062099432941475272448103296644696683709026793043150430945208910007869898752
Base-214の場合:
P{Ætg7«r¨ëÅ,…}ù¢Ý%Vt®£8ãøÚ$0óDÛY²Zþ…ð7ê‘Ó{òìàYëØU¥
これは私が思いつく最も簡単な解決策です。なぜなら、私が地獄にいるのは私がデニスを破っているからです。1時間試してみましたが、彼のアイデアに勝るものはありませんでした。
<?=strtr("000
001
002
010
011
020
022
100
101
110
111
333
200
202
220
222",["00",80,FF,CO]);
配列のキーとしての数字を値strtrに置き換えるだけです
@for %%c in (000000 000080 0000FF 008000 008080 00FF00 00FFFF 800000 800080 808000 808080 C0C0C0 FF0000 FF00FF FFFF00 FFFFFF)do @echo %%c
はい、それは退屈です。以前の148バイトの試行:
@if "%2"=="" (call %0 000000 80&call %0 C0C0C0 FF)|sort&exit/b
@echo %1
@for %%c in (0000%2 00%200 00%2%2 %20000 %200%2 %2%200 %2%2%2)do @echo %%c
残念ながらfor
、call:
コマンドまたはコマンドの出力をパイプ処理することはできません。そのため、再帰的に呼び出す必要があります。
<v"UVTYZQPefij?EDA@"
v>>9\:4/:\4/>4%:3g,0`
<^_@#:,+55$_^#!-9:,g3
F08C
色は、最初の行に表示される文字列でエンコードされます。色成分ごとに2ビットで、各値をASCII範囲に強制的に追加する高ビットが設定されます(63の場合は127の範囲外です) )。
その後、スタック上の色のリストは次のように処理されます。
9\ 9 is pushed behind the current colour to serve as a marker.
:4/:\4/ The colour is repeatedly divided by 4, splitting it into 3 component parts.
> The inner loop deals with each of the 3 components.
4% Modulo 4 masks out the 2 bits of the colour component that we care about.
:3g, That is used as an index into the table on line 4 to get the character to output.
0`3g, For component values greater than 0 the second char is a '0', otherwise an 'F'.
:9-! Check if the next component is our end marker.
^ If not, repeat the inner loop.
55+, Output a newline.
:_ Repeat the outer loop until there are no more colours on the stack.
void n(){string a="000000\r\n000080\r\n0000FF\r\n008000\r\n008080\r\m00FF00\r\n00FFFF\r\n800000\r\n800080\r\n808000\r\n808080\r\nC0C0C0\r\nFF0000\r\nFF00FF\r\nFFFF00\r\nFFFFFF";Console.Write(a);}
悲しいことに、これは非常に複雑ですが、非常に興味深いものよりもはるかに興味深いものです(私はそれを書くのがもっと楽しかった)C#、270バイト
void n(){string a,b,c,d;a="00";b="80";c="C0";d="FF";for(int i=0;i<16;i++){Console.WriteLine((i<7?a:i<11?b:i>11?d:c)+(i<3?a:i<5?b:i<7?d:i<9?a:i<11?b:i==11?c:i<14?a:d)+(i==0||i==3||i==5|i==7||i==9||i==12||i==14?a:i==1||i==4||i==8||i==10?b:i==2||i==6||i==13||i==15?d:c));}}
()=>@"string_here"
これはAction<string>
)。また、逐語的な文字列(@
)を使用することをお勧めします。これにより、改行せずに文字列に直接新しい行を挿入できます。
f(i){for(i=48;i--;)printf("%.2s%s","FFC08000"+("#&/28MNQRSV]^_ab"[i/3]-35>>i%3*2&3)*2,"\n\0"+i%3);}
数値のリストを作成し、並べ替えながら出力することを含む試みを行った後、私は素朴な単純なソリューションと比較しました:
f(){puts("000000\n000080\n0000FF\n008000\n008080\n00FF00\n00FFFF\n800000\n800080\n808000\n808080\nC0C0C0\nFF0000\nFF00FF\nFFFF00\nFFFFFF");}
200での試行と変更に比べて、140バイトで入ってきます。
解決策は、小さなアルファベットではあるが、他のテキストと同様に考えることでした。各色は、アルファベット{0xff、0xc0、0x80、00}への2ビットインデックスのトリプレットと考えることができます。色->トリプレット->数字->文字(すべて印刷可能にし、エスケープの必要性を避けるためにオフセット+35を使用)のプロセスは、次のように説明できます。
000000 333 63 b
000080 332 62 a
0000FF 330 60 _
008000 323 59 ^
008080 322 58 ]
00FF00 303 51 V
00FFFF 300 48 S
800000 233 47 R
800080 232 46 Q
808000 223 43 N
808080 222 42 M
C0C0C0 111 21 8
FF0000 033 15 2
FF00FF 030 12 /
FFFF00 003 3 &
FFFFFF 000 0 #
次に、結果の文字列を繰り返し処理し、アルファベット文字列の適切な部分を切り取るだけです。
“0FC8”
私たちが持っているように、00
、FF
、C0
、と80
。