HTMLカラーを出力する


30

16色CGAパレット(HTMLカラーとも呼ばれる)は、初期のグラフィックアダプターで使用される16色のセットです。このチャレンジの目標は、16個すべてを16進形式(RRGGBB)で、16進値の昇順で、改行で区切って出力することです。したがって、出力は次のようになります。

000000
000080
0000FF
008000
008080
00FF00
00FFFF
800000
800080
808000
808080
C0C0C0
FF0000
FF00FF
FFFF00
FFFFFF

単一の末尾改行を使用できますが、必須ではありません。

回答:


13

ゼリー31 29 27 バイト

“×Ɗ¡‘Œ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つのエントリは80FFの両方を含む組み合わせに対応しているため、それらを破棄する必要があります。

»Ṫ¦209 3つの部分で構成されます。

  • (tail)は、コードポイントの最後の配列、つまり[17、145、0]を削除します。

  • »209冪との残りの各整数の最大値をとる0xD1 = 209でそれらのすべてを置き換える、209

  • ¦(スパース)powersetの残りの要素を反復処理します。対応するインデックスが[17、145、0]で見つかった場合、要素はすべて209で置き換えられます。そうでない場合は、そのまま残されます。

    ¦モジュール式ではないため、これはpowersetの残りの最後の配列(インデックス0)のみを変更します。インデックス17145は大きすぎて効果がありません。

結果は次のとおりです。

[[], [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改行で区切って一意のタプルを結合します。


11

Bash + GNUユーティリティ、67

  • @manatworkのおかげで2バイト節約
  • @zeppelinのおかげで2バイト節約
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します
  • 式の2行目は、sed上記の「エクストラ」を除外します。

イデオネ


6

ゼリー38 31 バイト

“mạ9ṣṃwɠƁ,¡ẓw’b4µża1$ị“08CF”s3Y

TryItOnline!

数値のベース250圧縮(“...’)、
ベース4 に変換(b4)、ベクトル化された論理の後に自身のコピーで
圧縮(ż)、1(a1$)*、使用される4文字に
インデックス付け“08CF”)、
チャンクに分割長さ3(s3)で、
改行()で結合されていますY

*したがって、各ゼロ桁を別のゼロとペアリングし、他の数字をそれぞれ1つずつペアリングします。この手段をフェッチインデックス付き次とともに'F'相互に対をなすようになる'F'一方で'0''8'および'C'各対'0'


:マイナーこの答えを修正するには、[編集] “0FC8”私たちが持っているように、00FFC0、と80
Sherlock9

わあ、気づかなかった!ありがとうございました。
ジョナサンアラン

3

Pythonの3、134の 129 125 108 91 90バイト

ここでやるべきゴルフはまだたくさんあると思います。ゴルフの提案を歓迎します!

編集: -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"バイトを保存します。
XNOR

これはpy 3でも動作します
ミゲル

@Miguelいいえ、それは私がクリーンアップしなかった編集です。これは、Python 2では動作しません
Sherlock9

2

JavaScript(ES6)、109 107バイト

ニールのおかげで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`
`

テスト


1
興味深いことに、.replace(/./g)同じ長さである.map().joinが、.map(x=>'08CF'[x=n>>x&3]+'000F'[x],n+=+v||21)2つのバイトを保存します。
ニール

2

PowerShell、113 106バイト

'777
7780
77FF
7807
78080
7FF7
7FFFF
8077
80780
80807
808080
C0C0C0
FF77
FF7FF
FFFF7
FFFFFF'-replace7,'00'

ええ、私は単に文字列を印刷するよりも短いものを見つけていません...単純な置換を使用して7バイトを削減した@ Martin Smithに感謝します(私は完全に見落としていました)。したがって、単純にハードコーディングするよりも少なくとも7バイト短くなります。わーい!

しかし、それは退屈です!

代わりに...

PowerShell v4、128バイト

[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]値を引き出します。これらのオブジェクトのデフォルトの文字列化は、#AARRGGBB16進値としての形式の色なので、スクリプトブロックを使用して文字列にその呼び出しをカプセル化することにより、それを活用します"$(...)"。しかし、アルファ値やハッシュは[3..8]必要ないので、文字列のバックエンドを取得し、-joinその結果のchar-arrayを文字列に戻す必要があります。次に、Sort-Objectそれらを正しい順序に並べるのが簡単です。


1
の21個のインスタンスが00あり、.Replace(7,'00')21文字未満です。
マーティンスミス

PowerShellの使用方法はわかりませんが、80とFFを置き換えることは価値があるかもしれません。
nedla2004 16

@ nedla2004 -replacefor 8およびfor 80は同じバイトカウントです(-replace8,80長さである12個のゼロを保存します)。以下のためにそれを行うことはFF理由の周りに必要な引用符の2バイトだけ長くなっている"FF"中で-replace2,"FF"のステートメント。
AdmBorkBork 16

[OK]を、私はあなたが何とか交換を組み合わせることができるかどうか疑問に思っていました。
nedla2004 16


1

MATL、39バイト

'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

1

05AB1E、57バイト

•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時間試してみましたが、彼のアイデアに勝るものはありませんでした。



0

バッチ、137バイト

@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

残念ながらforcall:コマンドまたはコマンドの出力をパイプ処理することはできません。そのため、再帰的に呼び出す必要があります。



0

Befunge、83 69バイト

<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. 

0

C#、195バイト

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

関数で文字列を直接返すことができます-変数に保存してから印刷する必要はありません。また、a)ラムダを使用できます。b)単に文字列をダンプするのに勝る解決策があると確信しています。
メゴ

@Megoこれはゴルフでの私の最初のC#投稿です。正直にラムダ関数をどのように実行するかわかりません。
アルフィーGoodacre

このリストを調べて、改善すべき点を見つけることをお勧めします。
メゴ

@Alfie Goodacre:値を返すだけのC#ラムダ:(()=>@"string_here"これはAction<string>)。また、逐語的な文字列(@)を使用することをお勧めします。これにより、改行せずに文字列に直接新しい行を挿入できます。
ミルク

0

C(gcc)、99バイト

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   #

次に、結果の文字列を繰り返し処理し、アルファベット文字列の適切な部分を切り取るだけです。

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