複数選択テストの不正行為、パート2


26

これは、アドナンによるこの挑戦の続編です。このチャレンジが好きなら、他のチャレンジも好きになるでしょう。見てみな!


それぞれ4つの選択肢を持つ8つの質問による多肢選択テストには、答えがありますBCADBADA。4つの異なる配列に変換され、現在の文字が答えである場合はtrueとfalseで、次のようになります

Q#: 1  2  3  4  5  6  7  8
    B  C  A  D  B  A  D  A
A: [0, 0, 1, 0, 0, 1, 0, 1]
B: [1, 0, 0, 0, 1, 0, 0, 0]
C: [0, 1, 0, 0, 0, 0, 0, 0]
D: [0, 0, 0, 1, 0, 0, 1, 0]

これは、少しのロジックを使用して圧縮できます。選択肢のそれぞれABCおよびD、以下に示す二つの真/偽の値で表すことができます。

A: 1 0
B: 0 1
C: 0 0
D: 1 1

このロジックを使用して、上記の4つのベクトルを2つだけに圧縮できます。

 1  2  3  4  5  6  7  8
 B  C  A  D  B  A  D  A
[0, 0, 1, 1, 0, 1, 1, 1]
[1, 0, 0, 1, 1, 0, 1, 0]

つまり、テストの解決策は次のとおり00110111です10011010。これらを連結することにより、2進数0011011110011010、または1423410 進数を取得 します。この10進値を使用して、テストをごまかしてください!

チャレンジ

N(範囲内の)数値を[0, 65535]取得し、複数選択テストの答えを含む文字列を出力します。

テストケース:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

出力は大文字でも小文字でもかまいませんが、他の記号は使用できません。


出力は示されているように文字列である必要がありますか、それとも文字は別々の行やリストなどにあることができますか?
xnor

@xnorオプション:-)
Stewie Griffin

明らかなA = 00、B = 01、C = 10、D = 11ではないのはなぜですか?
user253751

その理由は、アドナンの挑戦に触発されて、最初にA=10, B=01、そしてC=nor(A,B)、そして最初に作ったからD=and(A,B)です。後知恵では、それはそれを他の方法で回避を行うために良いされているかもしれませんが、うまく...遅すぎる今...
Stewieグリフィン

回答:


3

ゼリー、14 バイト

d⁹+⁹BZḄḊị“BADC

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

d⁹+⁹BZḄḊị“BADC  Main link. Argument: n

d⁹              Divmod 256; yield [n : 256, n % 256].
  +⁹            Add 256; yield [n : 256 + 256, n % 256 + 256].
    B           Binary; convert both integers to base 2.
     Z          Zip; group the quotient bits with corresponding remainder bits.
      Ḅ         Unbinary; convert from base 2 to integer.
       Ḋ        Dequeue; discard the first integer, which corresponds to the
                dummy value introduced by adding 256 to quotient and remainder.
        ị“BADC  Index into that string, mapping [1, 2, 3, 0] to "BADC".

10

05AB1E19 18 16バイト

コード:

žH+b¦2äøC’c‰±’sè

CP-1252エンコードを使用します。オンラインでお試しください!

説明:

まず、65536数値に追加します(これはにžH定義された定数です65536)。これも10000000000000000バイナリです。これは、数字にゼロを埋め込むことです。14234例として数字を見てみましょう。14234 + 65536に等しい79770。バイナリは次のとおりです。

10011011110011010

最初の文字を削除すると、次の結果になります。

0011011110011010

を使用して文字列を2つの部分に分割します

00110111, 10011010

その後、配列をø次のように圧縮します。

01, 00, 10, 11, 01, 10, 11, 10

それらを(10進数を使用してC)10進数に変換すると、次の結果になります。

1, 0, 2, 3, 1, 2, 3, 2

これで、文字列でインデックスを作成するだけで済みますcbad。また、この文字列の圧縮バージョンは’c‰±’ここでテストできます。最後に、上記の配列のインデックスにある文字を取得します。上記の例では、次の結果になります。

1, 0, 2, 3, 1, 2, 3, 2
b  c  a  d  b  a  d  a

6

JavaScript(ES6)、55 48バイト

f=(n,i=8)=>i--?"CBAD"[n>>i&1|n>>i+7&2]+f(n,i):''

console.log(f(14234)); // BCADBADA
console.log(f(38513)); // ABBDCAAB
console.log(f(0));     // CCCCCCCC
console.log(f(120));   // CBBBBCCC
console.log(f(65535)); // DDDDDDDD
console.log(f(39253)); // ABCDABCD

非再帰バージョン(55バイト)

正規表現を使用して、次のことができます。

n=>"76543210".replace(/./g,i=>"CBAD"[n>>i&1|n>>+i+7&2])

ビット単位の操作をどのように考えましたか?
ericw31415

ericw31415 @ -それは明示的にそういない場合でも、挑戦は実際には逆の順序でこれらのビット単位の動作を説明された(で始まる「このロジックのビットを使用して圧縮することができます。」
アルノー

3
... ちょっとしたロジック...
ニール

4

Python 2、53バイト

f=lambda n,k=8:k*'_'and f(n/2,k-1)+'CBAD'[n>>7&2|n&1]

Ideoneでテストします。


使用しようとして(n&257)%127いましたが、それより長くなります。あまりにも悪い127は素数です。たぶんあなたはそれを最適化する方法を考えることができます。
xnor

4

CP-1610アセンブリ、24 DECLE(30バイト)

このコードは、Intellivisionで実行することを目的としています。(1)

CP-1610オペコードは、「DECLE」として知られる10ビット値でエンコードされます。実際の機能は、24 DECLEから始まります。$4809で終わり$4820ます。

ただし、CPUレジスタは16ビット幅であるため、0x0000..のすべての入力値をサポートします0xFFFF

                            ROMW  10            ; use 10-bit ROM
                            ORG   $4800         ; start program at address $4800
4800 0002                   EIS                 ; enable interrupts (to enable display)

                    ;; ---- usage example
4801 0001                   SDBD                ; load parameter in R0
4802 02B8 009A 0037         MVII  #14234, R0    ;
4805 0004 0148 0009         CALL  cheat         ; call function
4808 0017                   DECR  PC            ; infinite loop

                    ;; ---- 'Cheat Your Test' function
                    cheat   PROC  

4809 0082                   MOVR  R0,     R2    ; copy R0 to R2
480A 0040                   SWAP  R0            ; swap LSB/MSB in R0
480B 02BC 0214              MVII  #$214,  R4    ; R4 = pointer to 2nd row of screen memory

480D 01DB           @@loop  CLRR  R3            ; clear R3
480E 0052                   RLC   R2            ; extract highest bit of R2 to carry
480F 0053                   RLC   R3            ; inject carry into R3
4810 0050                   RLC   R0            ; extract highest bit of R0 to carry
4811 0053                   RLC   R3            ; inject carry into R3
4812 0001                   SDBD                ; add pointer to lookup table to R3
4813 02FB 001D 0048         ADDI  #@@tbl, R3    ;
4816 029B                   MVI@  R3,     R3    ; read character value
4817 0263                   MVO@  R3,     R4    ; write it to screen memory (also does R4++)
4818 037C 021C              CMPI  #$21C,  R4    ; 8 characters written? ...
481A 0225 000E              BLT   @@loop        ; ... if not, jump to @@loop

481C 00AF                   JR    R5            ; return

481D 011F 0117      @@tbl   DECLE $11F, $117    ; characters 'B', 'C', 'A' and 'D'
481F 010F 0127              DECLE $10F, $127    ; in white, using the built-in font

                            ENDP

出力

スクリーンショット


(1)少なくとも1つのコンパイラー、複数のエミュレーター、および著作権フリーの代替ROMファイルが無料で入手可能であることを認めると、PPCG提出規則を侵害しないと思います。しかし、私が間違っているかどうか教えてください。


1
バイト単位でスコアを付けるため、合計ビット数を合計します。スコアは、その値を8で割った10進数(浮動小数点数)の結果です。この場合、27.5バイト。
mbomb007

3

CJam、22バイト

ri2bG0e[8/:.{1$=)^'A+}

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

説明

魔法の力で...

このチャレンジでのビットペアの文字へのマッピングは少しarbitrary意的です。で表現ABCDする場合0, 1, 2, 3(したがって、文字に追加するだけAです)、次のマッピングが必要です。

i1   i2   o
0    0    2
0    1    1
1    0    0
1    1    3

このマッピングは、魔法の少しの式で計算することができます((i1 == i2) + 1) ^ i1。ここで、平等はリターンをチェックし0たり1。次の表をご覧ください。各列は1つの入力に対応し、各行は1つの操作に対応し、各セルにはその時点でのスタックが表示されます。

[i1, i2]:  [0, 0]     [0, 1]     [1, 0]     [1, 1]
copy i1:   [0, 0, 0]  [0, 1, 0]  [1, 0, 1]  [1, 1, 1]
equals:    [0, 1]     [0, 0]     [1, 0]     [1, 1]
inc:       [0, 2]     [0, 1]     [1, 1]     [1, 2]
xor:       [2]        [1]        [0]        [3]

これを念頭に置いて、ソースコードの完全な内訳を次に示します。

ri     e# Read input, convert to integer.
2b     e# Get binary representation.
G0e[   e# Pad to 16 bits with zeros.
8/     e# Split into two halves of 8 bits each.
:.{    e# For each pair of bits, i1 and i2...
  1$   e#   Copy i1.
  =    e#   Check equality with i2.
  )    e#   Increment.
  ^    e#   Bitwise XOR.
  'A+  e#   Add to 'A'
}

明らかに魔法的ではない同じバイト数の代替ソリューション:

ri2bG0e[8/z2fb"CBAD"f=

あなたはオンにした場合と場合には、それは、誰にも便利ですi1し、i2戻って(つまり、あなたがマッピングをしたい時に、単一の番号にビット0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3)として、これは、より簡単に計算することができ(~n - 1) & 3たり(~n - 1) % 4、あなたの言語が右負の値の剰余を取得する場合。これは3&~-~n多くの言語のように簡潔に書けると思います。CJamでは、ベース2からの追加の変換により、これは1バイト長くなります。


3

PHP、57バイト

for($i=8;$i--;)echo CBAD[($n=$argv[1])>>$i+7&2|$n>>$i&1];

ビット単位の演算子を含まないバージョン70バイト

for(;$i<8;)echo CABD[($s=sprintf("%016b",$argv[1]))[$i]+$s[8+$i++]*2];

変数はどこで$i定義されていますか?
ericw31415

@変数の最初の使用でericw31415は初期化され、自動的にPHPのnull参照して、この変数宣言されている
イェルクHülsermann

それはPHP(tm)
-tomsmeding

3

Mathematica、75 73 68 66バイト

StringPart["CBAD",#+##+1]&@@IntegerDigits[#,2,16]~Partition~8<>""&

2バイトを節約してくれた@MartinEnderに感謝します。


しゅう #+##Infix仕事が、使用してはStringPartの頭があるため避けられない"C"["B","A","D"][[#+##]]です"C"、ありませんListStringJoin動作しません。
ジョンファンミン

1
ああ、私はそれを実現しなかった##2全体のリストでした。
マーティンエンダー

3

Perl、42バイト

+1を含む -n

STDINに入力を与えます。

perl -nE 'say+(A..D)[2-($`>>8-$_&257)%127]for/$/..8' <<< 39253

コードだけ:

say+(A..D)[2-($`>>8-$_&257)%127]for/$/..8

3

JavaScript、113 93 90 88バイト

20バイト節約できる@Neilに大いに感謝します!
@Cyoceのおかげで-3バイト

n=>{r="";b=("0".repeat(15)+n.toString(2)).slice(-16);for(i=0;i<8;i++)r+="CBAD"[parseInt(b[i]+b[i+8],2)];return r}

n=>{r="";b=(65536+n).toString(2).slice(1);for(i=0;i<8;i++)r+="CBAD"[+b[i+8]+2*b[i]];return r}

n=>eval('r="";b=(65536+n).toString(2).slice(1);for(i=0;i<8;i++)r+="CBAD"[+b[i+8]+2*b[i]]')

n=>eval('r="";b=n.toString(2).padStart(16,0);for(i=0;i<8;i++)r+="CBAD"[+b[i+8]+2*b[i]]')

悲しいことに、JavaScriptは同じような機能が欠けているdecbinbindecと、str_pad PHPを持っていること。


1
(65536+n).toString(2).slice(1)そして[+b[i+8]+2*b[i]]例えば、短くなります。
ニール

padStartECMAscriptの将来のバージョンに受け入れられた場合、より大きな節約になります。
ニール

1
の代わりに{…;return }eval("…")
Cyoce

@Neil padStart現在ECMAScriptに存在しているようです。
ericw31415

1

MATL、16バイト

16&B8eXB'BADC'w)

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

またはすべてのテストケースを検証する

説明

        % Implicitly grab input
16&B    % Convert to binary string with at least 16 bits
8e      % Reshape the resulting string to have 8 rows and 2 columns
XB      % Convert each row from binary to decimal
'BADC'  % Push this string literal
w)      % Use the decimal numbers to index into this string (modular indexing)
        % Implicitly display the resulting string

1

ジュリア、73バイト

Nを入力として受け取り、答えを文字列として返す関数fを提供します。

f(N)=(b=bin(N,16);join(["CBAD"[parse("0b$(b[i])$(b[i+8])")+1]for i=1:8]))

それを試してみてください

char配列が文字列としてカウントされるかどうかに応じて、結合(67バイト)を省略することができます

f(N)=(b=bin(N,16);["CBAD"[parse("0b$(b[i])$(b[i+8])")+1]for i=1:8])

それを試してみてください


0

R、110バイト

Rでベクトル化されたソリューションを見つけました。これはおそらく、よりスマートなintからバイナリへの変換を考え出すことで、ゴルフができるはずです。

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.