Betrug eines Multiple-Choice-Tests, Teil 2

26

Dies ist die Fortsetzung dieser Herausforderung von Adnan . Wenn Sie diese Herausforderung mögen, werden Sie wahrscheinlich auch die andere mögen. Hör zu!


Ein Multiple - Choice - Test mit 8 Fragen mit je 4 Entscheidungen könnten die Antworten haben: BCADBADA. In vier verschiedene Arrays konvertiert, mit wahr und falsch, wenn der aktuelle Buchstabe die Antwort ist, sieht es so aus

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]

Dies kann mit ein bisschen Logik komprimiert werden. Jede der Entscheidungen A, B, Cund Dkann durch zwei Wahr / Falsch - Wert gezeigt unten dargestellt werden:

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

Mit dieser Logik können wir die vier obigen Vektoren auf nur zwei komprimieren:

 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]

Das heißt, die Lösung Ihren Test einfach: 00110111, 10011010. Wenn wir diese verketten, erhalten wir die Binärzahl 0011011110011010oder eine 14234Dezimalzahl. Verwenden Sie diesen Dezimalwert, um Ihren Test zu betrügen!

Herausforderung

Nehmen Sie eine Zahl Nim Bereich (einschließlich) [0, 65535]und geben Sie eine Zeichenfolge mit der Antwort auf den Multiple-Choice-Test aus.

Testfälle:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

Die Ausgabe kann in Groß- oder Kleinbuchstaben erfolgen, Sie können jedoch keine anderen Symbole verwenden.

Stewie Griffin
quelle
Muss die Ausgabe der abgebildete String sein oder dürfen die Buchstaben in separaten Zeilen, in einer Liste usw. stehen?
Xnor
@xnor Optional :-)
Stewie Griffin
Warum nicht das offensichtliche A = 00, B = 01, C = 10, D = 11?
user253751
Der Grund war, dass ich zuerst gemacht A=10, B=01wurde C=nor(A,B)und mich D=and(A,B)von Adnans Herausforderung inspirieren ließ. Im Nachhinein wäre es vielleicht besser gewesen, es anders herum zu machen, aber gut ... Jetzt zu spät ...
Stewie Griffin

Antworten:

3

Jelly , 14 Bytes

d⁹+⁹BZḄḊị“BADC

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

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".
Dennis
quelle
10

05AB1E , 19 18 16 Bytes

Code:

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

Verwendet die CP-1252- Codierung. Probieren Sie es online!

Erläuterung:

Zuerst addieren wir 65536die Zahl ( žHist eine Konstante, die definiert ist 65536), die ebenfalls 10000000000000000binär ist. Hiermit wird die Zahl mit Nullen aufgefüllt. Nehmen wir die Nummer 14234als Beispiel. 14234 + 65536ist gleich 79770. Was in binär ist:

10011011110011010

Wir entfernen das erste Zeichen, was zur Folge hat:

0011011110011010

Wir teilen die Saite in zwei Teile mit :

00110111, 10011010

Danach zippen wir das Array mit ø:

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

Das Zurückkonvertieren in Dezimalzahlen (mit C) führt zu:

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

Jetzt müssen wir es nur noch mit der Zeichenkette indizieren cbad. Die komprimierte Version für diesen String ist ’c‰±’, die auch hier getestet werden kann . Schließlich erhalten wir die Zeichen am Index des obigen Arrays. Für das obige Beispiel führt dies zu:

1, 0, 2, 3, 1, 2, 3, 2
b  c  a  d  b  a  d  a
Adnan
quelle
6

JavaScript (ES6), 55 48 Byte

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

Nicht rekursive Version (55 Bytes)

Mit einem regulären Ausdruck können wir Folgendes tun:

n=>"76543210".replace(/./g,i=>"CBAD"[n>>i&1|n>>+i+7&2])
Arnauld
quelle
Wie haben Sie die bitweisen Operationen erlebt?
ericw31415
@ ericw31415 - Auch wenn dies nicht explizit geschieht, besteht die Herausforderung darin, diese bitweisen Operationen in umgekehrter Reihenfolge zu beschreiben (beginnend mit "Dies kann mit ein bisschen Logik komprimiert werden." )
Arnauld,
3
... ein bisschen Logik ...
Neil
4

Python 2, 53 Bytes

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

Teste es auf Ideone .

Dennis
quelle
Ich habe versucht, zu verwenden, (n&257)%127aber es ist länger. Schade, 127 ist Prime. Vielleicht können Sie sich einen Weg überlegen, um es zu optimieren.
Xnor
4

CP-1610- Assembly, 24 DECLEs (30 Byte)

Dieser Code soll auf einer Intellivision ausgeführt werden . (1)

Ein CP-1610-Opcode wird mit einem 10-Bit-Wert codiert, der als "DECLE" bezeichnet wird. Die eigentliche Funktion ist 24 DECLE lang und beginnt um $4809und endet um $4820.

Die CPU-Register sind jedoch 16 Bit breit, sodass sie jeden Eingabewert in 0x0000... unterstützen 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

Ausgabe

Bildschirmfoto


(1) Zugegeben, dass mindestens ein Compiler, mehrere Emulatoren und urheberrechtsfreie Ersatz-ROM-Dateien frei verfügbar sind, verstößt meiner Meinung nach nicht gegen eine PPCG-Übermittlungsregel. Aber bitte lassen Sie mich wissen, wenn ich falsch liege.

Arnauld
quelle
1
Wir zählen in Bytes, also addieren Sie die Gesamtzahl der Bits, und Ihre Punktzahl ist das Dezimalergebnis (float), wenn Sie diesen Wert durch acht teilen. In diesem Fall 27,5 Bytes.
mbomb007
3

CJam , 22 Bytes

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

Probieren Sie es online!

Erläuterung

Angetrieben von Magie ...

Die Zuordnung von Bitpaaren zu Buchstaben in dieser Herausforderung ist etwas willkürlich. Wenn wir ABCDdurch darstellen 0, 1, 2, 3(damit wir sie nur zum Zeichen hinzufügen können A), möchten wir die folgende Zuordnung:

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

Diese Zuordnung kann mit einer magischen kleinen Formel berechnet werden:, ((i1 == i2) + 1) ^ i1wobei die Gleichheitsprüfung 0oder zurückgibt 1. Sehen Sie sich die folgende Tabelle an, in der jede Spalte einer Eingabe entspricht, jede Zeile einer Operation entspricht und in jeder Zelle der Stapel zu diesem Zeitpunkt angezeigt wird:

[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]

In diesem Sinne finden Sie hier die vollständige Aufschlüsselung des Quellcodes:

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'
}

Eine alternative Lösung mit der gleichen Anzahl von Bytes, die entschieden weniger magisch ist:

ri2bG0e[8/z2fb"CBAD"f=

Und für den Fall ist es sinnvoll , für jeden, wenn Sie das drehen i1und i2Bits zurück in eine einzelne Zahl (dh , wenn Sie die Zuordnung wollen 0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3) kann diese noch berechnet werden leicht wie (~n - 1) & 3oder (~n - 1) % 4ob Ihre Sprache wird Modulo auf negative Werte richtig. Ich denke, das kann prägnant wie 3&~-~nin vielen Sprachen geschrieben werden. In CJam ist dies aufgrund der zusätzlichen Konvertierung von Basis 2 ein Byte länger.

Martin Ender
quelle
3

PHP, 57 Bytes

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

Version ohne bitweise Operatoren 70 Bytes

for(;$i<8;)echo CABD[($s=sprintf("%016b",$argv[1]))[$i]+$s[8+$i++]*2];
Jörg Hülsermann
quelle
Wo ist eine Variable $idefiniert?
ericw31415
@ ericw31415 Bei der ersten Verwendung einer Variablen wird PHP initialisiert und diese Variable automatisch mit einer Nullreferenz deklariert
Jörg Hülsermann
Das ist PHP (tm)
Tomsmeding
3

Mathematica, 75 73 68 66 Bytes

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

Vielen Dank an @MartinEnder für das Speichern von 2 Bytes.

JungHwan min
quelle
@MartinEnder #+##und InfixArbeit, aber mit StringPartist unvermeidlich, weil der Kopf "C"["B","A","D"][[#+##]]ist "C", nicht List; StringJoinfunktioniert nicht
JungHwan Min
1
Oh, das habe ich nicht gemerkt #und das #2waren die ganzen Listen.
Martin Ender
3

Perl, 42 Bytes

Beinhaltet +1 für -n

Geben Sie Input auf STDIN:

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

Nur der Code:

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

JavaScript, 113 93 90 88 Bytes

Ein großes Dankeschön an @Neil, der mir geholfen hat, 20 Bytes zu sparen!
-3 Bytes dank @Cyoce

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]]')

Leider fehlt JavaScript - Funktionen wie decbin, bindecund str_paddass PHP hat.

ericw31415
quelle
1
(65536+n).toString(2).slice(1)und [+b[i+8]+2*b[i]]wäre zum Beispiel kürzer.
Neil
padStartSollte es in eine zukünftige Version von ECMAscript aufgenommen werden, würde dies zu einer größeren Einsparung führen.
Neil
1
{…;return }Verwenden eval("…")
Sie
@Neil Es scheint, dass es padStartjetzt in ECMAScript existiert.
ericw31415
1

MATL, 16 Bytes

16&B8eXB'BADC'w)

Probieren Sie es online!

oder Überprüfen Sie alle Testfälle

Erläuterung

        % 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
Suever
quelle
1

Julia, 73 Bytes

Gibt eine Funktion f an, die N als Eingabe nimmt und die Antwort als Zeichenfolge zurückgibt.

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

Versuch es

Abhängig davon, ob ein Char-Array als String zählt, kann der Join weggelassen werden ( 67 Bytes ).

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

Versuch es

pasbi
quelle
0

R, 110 Bytes

Fand eine vektorisierte Lösung in R vor. Dies sollte wahrscheinlich durch eine intelligentere Umwandlung von int in binäre Umwandlung möglich sein.

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
Billywob
quelle