密パック10進数(DPD)から10進数


26

nandgameファンの場合:論理ゲートでDPDを10進数で試してください!

バックグラウンド

密パック10進数(DPD)は、10進数を2進数で効率的に格納する方法です。10ビットで3桁の10進数(000〜999)を保存します。これは、ナイーブBCD(4ビットで1桁を保存)よりもはるかに効率的です。

表記法

  • ato の小文字iは、10進表現にコピーされるビットです。
  • 0および1は、入力または出力ビットパターンの正確なビットです。
  • x 変換ではビットは無視されます。

変換表

以下は、DPDの10ビットから3桁の10進数への変換表です。各10進数は4ビットバイナリ(BCD)として表されます。両側は、最上位桁から最下位桁に向かって左から右に書き込まれます。

Bits                 =>  Decimal         (Digit range)
a b c d e f 0 g h i  =>  0abc 0def 0ghi  (0-7) (0-7) (0-7)
a b c d e f 1 0 0 i  =>  0abc 0def 100i  (0–7) (0–7) (8–9)
a b c g h f 1 0 1 i  =>  0abc 100f 0ghi  (0–7) (8–9) (0–7)
g h c d e f 1 1 0 i  =>  100c 0def 0ghi  (8–9) (0–7) (0–7)
g h c 0 0 f 1 1 1 i  =>  100c 100f 0ghi  (8–9) (8–9) (0–7)
d e c 0 1 f 1 1 1 i  =>  100c 0def 100i  (8–9) (0–7) (8–9)
a b c 1 0 f 1 1 1 i  =>  0abc 100f 100i  (0–7) (8–9) (8–9)
x x c 1 1 f 1 1 1 i  =>  100c 100f 100i  (8–9) (8–9) (8–9)

仕事

10ビットのDPDを3桁の10進数に変換します。

テストケース

DPD           Decimal
0000000101    005
0001100011    063
0001111001    079
0000011010    090
0001011110    098
1010111010    592
0011001101    941
1100111111    879
1110001110    986
0011111111    999
1111111111    999  * Output is same regardless of the `x` bits

入力

デフォルトの入力形式は10ビットのリストです。ビットは上記の正確な順序、またはその逆に従う必要があります。代わりに、同等の文字列または整数表現を使用することを選択できます。私の他の課題とは異なり、入れ子構造の並べ替えや使用は許可されていません

入力[1, 1, 0, 0, 0, 1, 0, 1, 0, 0]には、次の形式が許可されます。

  • ビットのリスト: [1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
  • 文字列: "1100010100"
  • 2進整数:788または0b1100010100
  • 10進整数: 1100010100
  • 逆:[0, 0, 1, 0, 1, 0, 0, 0, 1, 1]上記の他の形式では逆

次の形式は許可されていません。

  • ビットの任意の並べ替え: [0, 0, 0, 0, 0, 1, 1, 1, 0, 1]
  • 入れ子構造:[[1, 1, 0], [0, 0, 1], [0, 1, 0, 0]]または[0b110, 0b001, 0b0100]

出力

デフォルトの出力形式は、3桁の10進数のリストです。各数字は、0〜9の整数または文字で表される必要があります。入力と同様に、文字列または整数表現を選択できます。整数表現を選択した場合、先行ゼロは省略できます。

採点基準

標準の規則が適用されます。各言語の最短プログラムまたはバイト単位の機能が優先されます。

回答:


12

JavaScript(ES6)、112バイト

この短いバージョンのクレジットはすべて@nwellnhofに帰属します。

入力を整数として受け取ります。3桁の10進数の配列を返します。

n=>[(x=n>>4,y=x>>3,q=n/2&55,p=q%8)>5&&q-39?8|y&1:y,(p&5^5?x&6:q-23?8:y&6)|x&1,(p<5?p*2:p<6?x&6:p%q<7?y&6:8)|n&1]

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


JavaScript(ES6)、118 117バイト

入力を整数として受け取ります。3桁の10進数の配列を返します。

n=>[(x=n>>4&7,y=n>>7,p=n/2&7)>5&&p<7|x/2^2?8|y&1:y,(p<7?p-5?x:8:x/2^1?8:y&6)|x&1,(p<5?p*2:p<6?x&6:p<7|x<2?y&6:8)|n&1]

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

どうやって?

「公式」アルゴリズムを適用しようとする代わりに、このコードは、予想される結果に見られるパターンのある種のリバースエンジニアリングに基づいています。

入力整数n与えられると、以下を計算します。

x=n16mod8y=n128p=n2mod8

例:1桁目(数百)

x     | 0                | 1                | 2                | 3               
n & 1 | 0101010101010101 | 0101010101010101 | 0101010101010101 | 0101010101010101
p     | 0011223344556677 | 0011223344556677 | 0011223344556677 | 0011223344556677
------+------------------+------------------+------------------+-----------------
y = 0 | 0000000000008888 | 0000000000008888 | 0000000000008888 | 0000000000008888
y = 1 | 1111111111119999 | 1111111111119999 | 1111111111119999 | 1111111111119999
y = 2 | 2222222222228888 | 2222222222228888 | 2222222222228888 | 2222222222228888
y = 3 | 3333333333339999 | 3333333333339999 | 3333333333339999 | 3333333333339999
y = 4 | 4444444444448888 | 4444444444448888 | 4444444444448888 | 4444444444448888
y = 5 | 5555555555559999 | 5555555555559999 | 5555555555559999 | 5555555555559999
y = 6 | 6666666666668888 | 6666666666668888 | 6666666666668888 | 6666666666668888
y = 7 | 7777777777779999 | 7777777777779999 | 7777777777779999 | 7777777777779999

x     | 4                | 5                | 6                | 7               
n & 1 | 0101010101010101 | 0101010101010101 | 0101010101010101 | 0101010101010101
p     | 0011223344556677 | 0011223344556677 | 0011223344556677 | 0011223344556677
------+------------------+------------------+------------------+-----------------
y = 0 | 0000000000008800 | 0000000000008800 | 0000000000008888 | 0000000000008888
y = 1 | 1111111111119911 | 1111111111119911 | 1111111111119999 | 1111111111119999
y = 2 | 2222222222228822 | 2222222222228822 | 2222222222228888 | 2222222222228888
y = 3 | 3333333333339933 | 3333333333339933 | 3333333333339999 | 3333333333339999
y = 4 | 4444444444448844 | 4444444444448844 | 4444444444448888 | 4444444444448888
y = 5 | 5555555555559955 | 5555555555559955 | 5555555555559999 | 5555555555559999
y = 6 | 6666666666668866 | 6666666666668866 | 6666666666668888 | 6666666666668888
y = 7 | 7777777777779977 | 7777777777779977 | 7777777777779999 | 7777777777779999

アルゴリズム:

  • 場合、p<6d=y
  • 場合、p=6d=8+ymod2
  • 場合、我々はp=7 そして バツ<4 または バツ>5d=8+ymod2
  • もし、我々はp=7 そして バツ=4 または バツ=5d=y

JSコードとして:

p > 5 && p < 7 | x / 2 ^ 2 ? 8 | y & 1 : y

1
あなたのアプローチは、別の一時変数を使用する私のCの答えに似ています。最初のCソリューションをもう少しゴルフした後、JavaScriptへのポートは112バイトになります
nwellnhof

10

Pythonの3229 ... 97の 96バイト

lambda a:[[a&6,a>>4&6,a>>7&6,8][b"  eW7B]Oys"[~a&8or~a&6or~6|a>>4]%x&3]|a>>x%9&1for x in[7,4,9]]

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

@xnorによる-4バイト

-6バイト@nwellnhofで

フォーマット済み:

h = lambda a:[
    [a&6, a>>4&6, a>>7&6, 8][              List to take high bits from
        b"  eW7B]Oys"[                     10 char string; where to get high bits for
                                             indicator values 1-8. 0th,1st chars not used.
            ~a&8 or ~a&6 or ~6|a>>4]       Compute indicator (by @nwellnhof)
        %x&3]                              High bits of each digit
    | a >> x%9 & 1                         bitwise OR with low bit of each digit
    for x in [7,4,9]]

説明

私はもともとこれをJellyに実装したかったので、ここでのほとんどの答えとは異なるアプローチを取ります。これはシンプルで、おそらくゴルフ言語に適しています。golfed関数は整数を取りますが、ビットリストとしての入力をとします[a0,a1,...,a9]。次に、入力から3つの値を導出できます

  • 低ビット[a2,a5,a9]:これらは常に[d0,d1,d2]それぞれの低ビットになります。
  • 上位ビット[2*a0a1,2*a3a4,2*a7a8,8]:各桁の上位ビットは、これらのいずれかになります。
  • インジケータビット、は[a3,a4,a5,a7,a8]、各桁の上位ビットを取得する方法を決定します。インジケーター(1〜8)を次のように計算します。
    • a5 == 0の場合、インジケータは8です(元は0ですが、代わりに8を使用するとバイトが節約されます)
    • a3 nand a4の場合、インジケータは6-2 * a3a4です
    • それ以外の場合、インジケータは2 * a7a8 + 1(実際には負の数として計算されます)です。

次に、n番目の桁を次high_bits[arr[indicator][n]] | low_bits[n]の表のようにエレガントに計算できます。この表は文字列に圧縮されます。

arr = [
    [0,1,2],
    [3,1,2],
    [1,3,2],
    [2,1,3],
    [2,3,3],
    [3,2,3],
    [3,3,2],
    [3,3,3]
]

1
バイト文字列b"..."を使用して、変換をに置き換えることができordます。
xnor

@nwellnhofハ、私はちょうど同じことを見つけました!とにかくクレジットします。
リルトシアスト

b"$>6;-/'?"[a&8and(~a&6or a>>4&6|1)]さらに4バイト節約します。
nwellnhof

@nwellnhofモジュロチェーンはここに行く方法だと思いますが、そうでない場合は確かに動作します。
リルトシアスト

9

JavaScriptの(Node.jsの)126の 119 117 112 111バイト

(a,b,c,d,e,f,g,h,i,j)=>[(g&h&i+(b+=a*4+b,e+=d*4+e)!=5?8:b)+c,(g&i?h+e-3?8:b:e)+f,(g?h<i?e:h>i*e?b:8:h*4+i*2)+j]

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

-5バイト、@ tsh(および2つは自分で)に感謝しますl

-@ tshの手法を使用してさらに2バイト!

-5バイト、@ Arnauldに感謝

-1バイトありがとう@Neil

10ビットのリストとして(10個の引数として)入力し、3桁のリストとして出力します。


1
(!i|!d|e)-> i+l!=5; (d|e|!h)->h+l!=1
tsh

1
(g?h-i|h&!e?h?b:e:8:h*4+i*2)-> (g?h<i?e:h>i*e?b:8:h*4+i*2)別のバイトを保存します。(今回はチェックしました...)
ニール

8

C(gcc)138 129バイト

f(w){int t=w/2&55,s=t%8,v=w/16,u=v/8;w=((s<6|t==39?u:8|u%2)*10+v%2+(s&5^5?v&6:t-23?8:u&6))*10+w%2+(s<5?s*2:s<6?v&6:s%t<7?u&6:8);}

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

最初にいくつかのビットを変数sとに抽出しt、変換テーブルの8行を次のように識別できるようにします。

1.  s < 4              u v w¹
2.  s = 4              u v 8¹
3.  s = 5              u 8 v
4.  s = 6              8 v u
5.  s = 7, t =  7      8 8 u
6.  s = 7, t = 23      8 u 8
7.  s = 7, t = 39      u 8 8
8.  s = 7, t = 55      8 8 8

¹ Can be computed with s*2

その後、設定u及びv部門(右シフト)、その結果を用いてuv入力w位置0-2における下位3つのBCDビットを含みます。残りはビットに応じて、シャッフルされるst。2つの注目すべきトリックは次のとおりです。

s&5^5  // Rows 1, 2 and 4.
s%t<7  // Rows 1-5.

浅本シエルのJavascriptソリューションのポートはわずか124バイトです。

f(a,b,c,d,e,f,g,h,i,j){a=(((g&h&i+(b+=a*4+b,e+=d*4+e)!=5?8:b)+c)*10+(g&i?h+e-3?8:b:e)+f)*10+(g?h-i|h&!e?h?b:e:8:h*4+i*2)+j;}

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


短縮できると思います:f(b){int a=b/2%8,e=b&110,c=b/16,d=c/8;b=10*(10*(d%2|(6>a|78==e?d:8))+c%2+(3<a&a%2?e-46?8:d&6:c&6))+b%2+(4>a?b&6:a-5?a-6&&e-14?8:d&6:c&6)};
MCCCS

@MCCCSあなたのコードも138バイトのようです。
nwellnhof

5

Ruby153 ... 119 117バイト

->n{n+=n&896;a,b,c=n&1536,n&96,n&14;"%x"%n+=c<9?0:2036+[b/16-b-1918,r=a>>8,[r+126,a/16-26,a-1978,38][b/32]-a][c/2-5]}

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

使い方:

->n{n+=n&896;

これが出発点です。3ビットを左にシフトしてBCDに変換します。これはほとんどのパターンで機能します。

a,b,c=n&1536,n&96,n&14;

各ニブルの中間ビットを取得します(3番目のニブルの1ビットを追加しますが、最下位ビットはマスクします)。

"%x"%n+=c<9?0

3桁目が10未満の場合(LSBを気にかけなかったため9未満)、設定されます:これは単純なBCDであり、何も変更せずに16進数を出力できます

:2036+[b/16-b-1918,r=a>>8,[r+126,a/16-26,a-1978,38][b/32]-a][c/2-5]}

それ以外の場合は、希望する結果が得られるまでビットをシフトし、マジックナンバーを追加することにより、ブラックマジックを実行します。


5

網膜0.8.2191の 181バイト

(...)(...)
:$1,$2;
..(.),11(.);111
100$1,100$2;100
(10|(..)(.,)01)(.);111
100$3$2$4;100
(..)(.),(00.);111
100$2,1$3;0$1
(..)((.{5});110|(.);101)
100$3$4;$1
1
01
+`10
011
.0+(1*)
$.1

オンラインでお試しください!リンクにはテストケースが含まれます。編集:必要な場合を除き、数字を4ビットにパディングしないことで10バイトを保存しました。説明:

(...)(...)
:$1,$2;

各桁を個別に10進数に変換できるように、区切り文字を挿入します。これにより、変換テーブルの最初の2つのケースが効果的に処理されます。

..(.),11(.);111
100$1,100$2;100

変換テーブルの最後の(8番目の)ケースを処理します。

(10|(..)(.,)01)(.);111
100$3$2$4;100

変換テーブルの6番目と7番目のケースを処理します。

(..)(.),(00.);111
100$2,1$3;0$1

変換テーブルの5番目のケースを処理します。

(..)((.{5});110|(.);101)
100$3$4;$1

変換テーブルの3番目と4番目のケースを処理します。

1
01
+`10
011
.0+(1*)
$.1

2進数から10進数への変換を実行します。


5

ゼリー51 48 40 39バイト

&\‘f4;s3ɓạ4ḅ-œ?µ/Ḥ
“MY-€-Y¤©¡‘Dịs3Ḅç+ƭ/

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

アルゴリズム

リストインデックスを除き、このセクションの整数はすべてバイナリで記述されています。

αβγδεζηθικ[ηηθιδε][αβδεθι][γζκ]

  1. ηη=0000000111
  2. ηη=11θι<1110001001
  3. ηη=θι=11δε<11
  4. ηη=θι=δε=11

11[ηηθιδε]100[αβδεθι]

  1. [[αβδεθι]]
  2. [[100αβδε][θι]]
  3. [[100100αβ][δεθι]]=[[100100αβ][δε11]]
  4. [[100100100][αβδεθι]]=[[100100100][αβ1111]]

[γζκ][αβγδεζθικ][100γ100ζ100κ]

[100αβδε][100100αβ][θι]δε

[100αβδε][100αβδε][100δεαβ][αβ100δε][αβδε100][δε100αβ][δεαβ100]

100θι000110[αβδε100][αβ100δε][100δεαβ]

[γζκ][αβγδεζ100κ][αβγ100ζδεκ][100γδεζαβκ]

[100100αβ][100100αβ][100αβ100][100100αβ][100αβ100][αβ100100][αβ100100]

100θι100δε=δεθι=δε11000110[100100αβ][100αβ100][αβ100100]

[γζκ][100γ100ζαβκ][100γαβζ100κ][αβγ100ζ100κ]

コード

“MY-€-Y¤©¡‘Dịs3Ḅç+ƭ/  Main link. Argument: A (array of 10 bits)

“MY-€-Y¤©¡‘           Array literal; yield [77, 89, 45, 12, 45, 89, 3, 6, 0].
           D          Decimal; yield
                      [[7,7], [8,9], [4,5], [1,2], [4,5], [8,9], [3], [6], [0]].
            ị         Retrieve the elements of A at those indices.
                      Indexing is 1-based and modular, so 1 is the first index, while
                      0 is the last.
             s3       Split the results 2D array of bits into chunks of length 3.
               Ḅ      Convert the 9 arrays of bits from binary to integer.
                ç+ƭ/  Reduce the resulting array (length 3) once by the helper link,
                      then by addition.


&\‘f4;s3ɓạ4ḅ-œ?µ/Ḥ    Helper link. Arguments: B, C (arrays of three integers each)

&\                    Cumulatively reduce B by bitwise AND.
  ‘                   Increment the results by 1.
   f4                 Filter; keep only integers equal to 4.
     ;                Concatenate the result with C.
      s3              Split the result into (one or two) chunks of length 3.
        ɓ      µ/     Reduce the array of chunks by the following chain.
         ạ4               Take the absolute difference of the integers in the right
                          chunk and the integer 4.
           ḅ-             Convert the resulting array from base -1 to integer, i.e.,
                          map [x] to n = x and [x, y] to n = y - x.
             œ?           Take the n-th permutation of the left chunk.
                 Ḥ    Unhalve; multiply the resulting integers by 2.


2

クリーン238 ... 189バイト

ニールのおかげで-2バイト

import StdEnv
$a b c d e f g h i j=100*(c+2*b+4*a)+10*(f+2*e+4*d)+j+2*i+4*h-2*(h*(99*b+198*a-394)+i*(9*e+18*d+h*(e+2*d-4+(b+2*a-4)*(1-10*e-100*d+110*e*d))-35)-4)*g+0^(e+d)*(2*b+4*a-8*i*h*g)

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

結果を計算する直接式を使用して、10個の引数の形式で10ビットの「リスト」を取ります。


ではi*(9*e+19*d+i*...)、その2番目i*は不要に見えます。
ニール

@ニールあなたは正しい、そうです、ありがとう。
18年

1

Perl 5、195バイト

sub f{$n=shift;@p=((map{($n>>$_&3)*2}(8,5,1)),8);for(16390,28935,29005,227791,29108,225788,226803,228863){return 2*$n&256|$n&17|$p[$_>>4&3]<<8|$p[$_/4&3]<<4|$p[$_&3]if($_>>12&$n/2)==($_>>6&63);}}

オンラインで試す

このコンテストには195バイトが多すぎることは知っていますが、Perlコードをさらに圧縮する方法がわかりませんでした。提案?

コードの説明

より読みやすいバージョンでは、コードの意図が明らかになるはずです。

sub dpd {
  my $n = shift;
  my $v=2*($n&128)|$n&17;
  my @p=((map{($n>>$_&3)*2}(8,5,1)),8);
  for (16390,28935,29005,227791,29108,225788,226803,228863) {
    return $v |$p[$_>>4&3]<<8|$p[$_>>2&3]<<4|$p[$_&3]
      if(($_>>12&$n/2)==($_>>6&63));
  }
}

DPDエンコードのルールでは、各行は18ビット値にエンコードされ、(6,6、(2,2,2))ビットに分割されます。

  • 最初の6ビットは、入力のビット1(= h)から6(= d)の適切なビットマスクです(ビット4 = fは冗長ですが、評価コードを単純化して含める)。
  • 次の6ビットは、このビットマスクの値ビットです。値は、ビットマスクの値が1であるすべての場所でチェックされます。
  • 次の3 * 2ビットには@p、結果のビット11-9、7-5、および3-1に接合される3ビットシーケンスの配列のインデックスが含まれます。
  • 配列@pは、入力のビット9-8、6-5、3-2、および84番目のメンバーとして の数から構成されます
  • 入力の位置7,4および0のビットは、結果のビット8,4および0に直接転送されます。

例えば、リスト内の最初の数16390であり、100000000000110ビットフィールドとしては、以下の情報を運びます。

000100 : bit mask says: only consider bit 3 of the input
000000 : bit values say: bit 3 should be 0
00     : use '0ab' as higher bits of first digit
01     : use '0de' as higher bits of second digit
10     : use '0gh' as higher bits of third digit

1

05AB1E、84バイト

05AB1Eに対するKimOyhusの回答

•4’7þ2Ô€iΘEuĆΣk4Ѐ:ΘΛs‡CaΔʒì₁3¶rdiMß¡þи иø-˜)Â∍DY—WûQ@—Mā}Γ¤ÒÙ]p•44в2ôvÐyèP≠«}4ôC3.£

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

大まかな説明:

•yadayada•44в2ô   # encoded list of nand gates
v                 # for each gate
 ÐyèP≠            # compute the output of the gate
      «           # append it to the input
       }          # end of the loop
4ô                # split the list of bits in groups of 4
  C               # convert each from binary to decimal
   3.£            # keep the last 3 numbers
                  # implicit output

0

05AB1E104の 103 101 バイト

•3γã•S£©4èUXтÌ‹XSPVY®2èDˆTQ*~i0®нëт}®1èY¯`*i0®нëY_Xт>Ê*i0¯`ëт]®3èY¯`_*X110Q~i0®нëXт›iYiтë0¯`ëX]®θJ4ôC

間違いなく、この種のチャレンジに適した言語ではありませんが、まあまあです。
文字列として入力し、3桁のリストとして出力します。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

考慮すべき次の8つのシナリオがあります。

     1st 2nd 3rd 4th 5th 6th                          1st digit    2nd digit    3rd digit
1.   ab  c   de  f   0gh i   →   0abc 0def 0ghi   →   '0'+1st 2nd  '0'+3rd 4th  5th     6th
2.   ab  c   de  f   100 i   →   0abc 0def 100i   →   '0'+1st 2nd  '0'+3rd 4th  5th     6th
3.   ab  c   gh  f   101 i   →   0abc 100f 0ghi   →   '0'+1st 2nd  '100'   4th  '0'+3rd 6th
4.   gh  c   de  f   110 i   →   100c 0def 0ghi   →   '100'   2nd  '0'+3rd 4th  '0'+1st 6th
5.   gh  c   00  f   111 i   →   100c 100f 0ghi   →   '100'   2nd  '100'   4th  '0'+1st 6th
6.   de  c   01  f   111 i   →   100c 0def 100i   →   '100'   2nd  '0'+1st 4th  '100'   6th
7.   ab  c   10  f   111 i   →   0abc 100f 100i   →   '0'+1st 2nd  '100'   4th  '100'   6th
8.   xx  c   11  f   111 i   →   100c 100f 100i   →   '100'   2nd  '100'   4th  '100'   6th

最初に(暗黙の)入力をサイズのチャンクに分割し、[2,1,2,1,3,1]そのリストをレジスタに保存します。

3γã•     # Push compressed integer 212131
     S    # Convert it to a list of digits
      £   # Split the (implicit) input in chunks of that size
       ©  # Store it in the register (without popping)

(セクション鉱山のこの05AB1Eのヒントを参照してください大きな整数を圧縮する方法は?理由を理解すること•3γã•です212131

ここで、最初に出力の最初の桁に0と1を作成します。シナリオ1、2、3、7は使用し'0'+1st+2ndます。およびシナリオ4,5,6,8は以下を使用します'100'+2nd

4è                  # Take the 5th item of the list
  U                 # Pop and store it in variable `X`
XтÌ‹                #  Check if `X` is below 102
                ~   # OR
   XSP              #  `X` is equal to 111
      VY            #  And store that result in variable `Y`
               *    #  and
        ®2è         #  Get the 3rd item from the list of the register
           Dˆ       #  Push it to the global array
             TQ     #  And check if it's equal to 10
i                   # If the combined check above is truthy (exactly 1):
 0                  #  Push 0 to the stack
 ®н                 #  Push the 1st item of the list to the stack
ë                   # Else:
 т                  #  Push 100 to the stack
}                   # Close the if-else
®1è                 # And push the 2nd item of the list to the stack

次に、出力の2番目の桁に0と1を作成します。シナリオ1、2、4は使用し'0'+3rd+4thます。シナリオ3、5、7、8は使用し'100'+4thます。シナリオ6の使用'0'+1st+4th

Y                # Push `Y` (check if `X` equals 111)
   *             # and
 ¯`              # Push the item from the global array (3rd item of the list)
i                # If both checks above are truthy (exactly 1):
 0               #  Push 0 to the stack
 ®н              #  Push the 1st item of the list to the stack
ë                # Else:
 Y_              #  Push inverted `Y` (check if `X` does NOT equal 111)
       *         #  and
   Xт>Ê          #  Check if `X` (5th item of the list) does NOT equal 101
 i               #  If both checks above are truthy (exactly 1):
  0              #   Push 0 to the stack
  ¯`             #   Push the item from the global array (3rd item of the list)
 ë               #  Else:
  т              #   Push 100 to the stack
]                # Close both if-else cases
®3è              # And push the 4th item of the list to the stack

次に、出力の3桁目に0と1を作成します。シナリオ1、2使用5th+6th; シナリオ3は次を使用し'0'+3rd+6thます。シナリオ4、5使用'0'+1st+6th。およびシナリオ6,7,8の使用'100'+6th

Y           #  Push `Y` (check if `X` equals 111)
    *       #  and
 ¯`_        #  Check if the item from the global array (3rd item of the list) is exactly 0
         ~  # OR
    X110Q   #  Check if `X` (5th item of the list) equals 110
i           # If the combined check above is truthy (exactly 1):
 0          #  Push 0 to the stack
 ®н         #  Push the 1st item of the list to the stack
ë           # Else:
 Xт›i       #  If `X` (5th item of the list) is larger than 100 (so 101/110/111):
     Yi     #   If `Y` (if `X` equals 111):
       т    #    Push 100 to the stack
      ë     #   Else:
       0    #    Push 0 to the stack
       ¯`   #    Push the item from the global array (3rd item of the list)
    ë       #  Else:
     X      #   Push `X` (5th item of the list) to the stack
]           # Close all if-else cases
®θ          # And push the last (6th) item of the list to the stack

スタックにはすべて0と1があるので、それを3つの出力数字に変換できます。

J     # Join the entire stack together
 4ô   # Split it into parts of size 4
   C  # Convert each part from binary to an integer (and output implicitly)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.