目を見張る


9

楕円と棒として印刷されたバイナリ値を目撃することはそれほど簡単ではありません...そのためには、カスタムバイナリ表現で数値を出力する関数(またはプログラム)を記述する必要があります。
したがって、たとえば3(00000011)のような数値を受け取り、ビットをユーザー定義の形式で、たとえばスペースで区切られたペアで出力したいとします。

00 00 00 11

または、たとえば、逆の順序で、いくつかのデコレータを使用します。例:

11_00_00_00

さらに、 '0'と '1'をカスタム文字として表示して、それらをよりよく区別できるようにする必要があります。例:

XX oo oo oo

したがって、次の仕様ですべてを行うコードを作成することが課題です。

仕様

関数は次のような入力を受け取ります: f(A、mask、zeros、ones)

パラメーター:

A-入力数値-0から255の範囲の任意の(符号なし)整数。
mask-出力の構成を定義する文字列パラメーター。
zeros-同じ長さの文字列で、各出力スロットの「ゼロ」グリフを定義します。
ones-同じ長さの文字列で、出力スロットごとに「1」グリフを定義します。

出力構成のルール:

出力がどのように生成されるかを理解するには、例とともにこの画像をよく見てください。

ここに画像の説明を入力してください

したがって、マスクの1桁のみが解析され、Aの対応するビットに置き換えられます。他の文字はそのままです。さらに、取得したビットの値が1の場合、最終出力に「X」として表示され、0の場合、「o」として表示されます。上記の例では、取得した4つのビットはすべて「1」なので、すべてのスロットに「X」が表示されます。

入力数が128の場合、論理的には、出力はになりますX foo bar ooo。パラメータ「0」と「1」の文字:印刷可能なASCII文字。マスクと常に文字揃えされていると想定します。

  • ビットのインデックスは0です。0番目のビットはMSBです。
  • 数字8、9はマスク文字列では許可されていないと仮定します。
  • 入力文字列には、印刷可能なASCII文字が含まれます。
  • 「ゼロ」と「1」はマスクに合わせて文字で整列されます。
  • あなたの言語の特殊文字/修飾子の場合:入力文字列に表示されないと想定できます。

明確にするために、他の例を参照してください。

入力->出力例

すべての8ビットをスペース区切り文字で共通の順序で、楕円と棒の一般的な表記で出力します。

mask  =  "0123 4567"  
zeros =  "0000 0000"  
ones  =  "1111 1111"  

A=1 ->    0000 0001


ダッシュとグリフ表記で逆の順序で出力します。

mask =    "| 7654 3210 |"
zeros=    "  ---- ----  "
ones =    "  ssss ssss  "

A=1  ->    | s--- ---- |
A=3   ->   | ss-- ---- |
A=128->    | ---- ---s |


1つの出力での多様な表記、たとえばパックされたデータ:

mask =       "0 | 123 4567"
zeros=       "    --- ----"
ones =       "X   kkk ssss"

A= 15  ->       | --- ssss
A= 16  ->       | --k ----
A= 32  ->       | -k- ----
A= 128 ->     X | --- ----
A= 255 ->     X | kkk ssss


繰り返しパターン:

mask =    "| 7 66 555 4444 |"
zeros=    "  . .. ... ....  "
ones =    "  0 00 000 0000  "

A= 0 ->    | . .. ... .... |
A= 1 ->    | 0 .. ... .... |
A= 2 ->    | . 00 ... .... |
A= 3 ->    | 0 00 ... .... |
A= 4 ->    | . .. 000 .... |

更新

ルールは少し簡略化されました-プログラムは1つの数値のみを出力する必要があります(最初に提案された配列/数値のリストではありません)。


4つの入力を受け入れるプログラムも送信できますか?一部の言語は、あまり機能しません。
スティーブン

@StephenS私はそうだと思いますが、私がそれらを理解できるかどうかはわかりません:/
ミハイルV

2
最後の2つの引数は、ほとんどの言語ではまったく無関係であるように見えます。なぜ1と0だけが必要なのですか?最初の引数がリストであることは、通常の言語が単純なループ/再帰を追加することを除けば、それほど難解ではなく、より難解な言語が競争することをはるかに難しくしています。
FryAmTheEggman 2017年

@MikhailVあなたの挑戦に提出、幸運のすべてを理解したい場合は:あなたがそれらの作品見ることができるように/それらのほとんどはTryItOnlineリンクを持っていますが、あなたは彼らが何をすべきか知っているまで、彼らほとんどのゴルフの言語はナンセンスのように見える
スティーブン

@FryAmTheEggman Aすべてのテストケースで同じであるため、私も何をするのかわかりません
Stephen

回答:


2

JavaScript(ES6)、57バイト

(A,M,O,I)=>M.replace(/[\d]/g,(d,i)=>(A>>7-d)%2?I[i]:O[i])


2

Ruby、48バイト

->a,f,*b{f.gsub(/\d/){b[a[55-$&.ord]][$`.size]}}

zerosおよびonesパラメータは配列(*b)として扱われ、zeroesパラメータはに格納されb[0]、onesパラメータはに格納されb[1]ます。

マスクパラメータでfは、各数字(/\d/)が適切な配列の文字に置き換えられます。$`現在の一致に至るまでのテキストを保持する特殊変数は、位置を追跡するためにここで(ab)使用されます。

Rubyのビットインデックスは0を最下位ビットと呼びますが、チャレンジは0を最上位ビットと呼びます。55(「7」文字)からのA​​SCII減算は、使用可能なRubyビットインデックスを生成します。

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



1

Python、97バイト

lambda A,M,Z,O:"".join([[Z,O][1&(A>>7-int(d))][i] if d.isdigit() else d for i,d in enumerate(M)])

1

Mathematica、131バイト

""<>Table[(f/@{##2})[[x[[i]],i]],{i,Length[x=(f=Characters)@#2/.Table[ToString@i->2+Floor[#/2^(7-i)]~Mod~2,{i,0,7}]/._String->1]}]&

Length[x]可能Length@x{#2,#3,#4}することができ{##2}
CalculatorFeline

また、StringJoin@@ちょうどすることができStringJoin@そして#1ちょうどである#
CalculatorFeline

ルールを少し簡略化しました。更新を参照してください。
ミハイルV

1

q / kdb +、 86 64バイト

解決:

f:{[A;M;Z;O]@[M;m;:;((-8#0b vs A)"I"$'M m)(Z;O)'m:(&)M in .Q.n]}

例:

q)f[1;"0123 4567";"0000 0000";"1111 1111"]
"0000 0001"
q)f[1;"| 7654 3210 |";"  ---- ----  ";"  ssss ssss  "]
"| s--- ---- |"
q)f[15;"0 | 123 4567";"    --- ----";"X   kkk ssss"]
"  | --- ssss"
q)f [0;"| 7 66 555 4444 |";"  . .. ... ....  ";"  0 00 000 0000  "]
"| . .. ... .... |"

説明:

定型入力Mが数値であるインデックスを引き出しますm。定型入力を変更する場所を呼び出します。文字列から数値を取り出し、整数にキャストしてから、8ビット配列にインデックスを付けて正しい順序を取得します。この8ビット配列を使用してO(1が設定されているZ場合)または(0が設定されている場合)にインデックスを付け、次にで指定されたインデックスでこれらのリストにインデックスを付けmます。最後:に、この新しいリストをインデックスの元のマスクに適用()しますm

{[A;M;Z;O]                                                   } / lambda function with 4 parameters
          @[ ; ; ;                                          ]  / apply, applies 3rd parameter to 1st parameter at indexes from parameter 2 with parameter 4 :)
                   (-8#0b vs A)                                / convert input number to binary (64 bit), take the last 8 items
                                              m:(&)M in .Q.n   / returns indices where mask is in "0123..789", stores in variable m
                               "I"$'M m                        / index into mask at indices m, then cast these numbers to an integer array
                  (                    )                       / we then index into our 8 bits a these offsets to get the output order
                                        (Z;O)                  / 2-item list of the zeroes and ones mask
                                             '                 / take each item on the left and right and apply them to (Z;O) (ie index in at 0 / 1 and then 123..67)
            M m :                                              / apply *this* list to M at each index given by m

ノート:

引数を次の形式で指定できる場合、さらに14バイトを削ることができます。

[A;M;(Z;O)]

qは(彼らは明示的に命名されることなく、機能に与えられる3つの引数までを可能としてxyそしてzそれぞれ):

f:{@[y;m;:;((-8#0b vs x)"I"$'y m)z'm:(&)y in .Q.n]}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.