Barare un test a scelta multipla, parte 2


26

Questo è il seguito di questa sfida di Adnan . Se ti piace questa sfida, è probabile che ti piacerà anche l'altra. Controlla!


Un test a risposta multipla con 8 domande ciascuno con 4 scelte potrebbe avere le risposte: BCADBADA. Convertito in quattro matrici diverse, con vero e falso se la lettera attuale è la risposta, sarà simile a questa

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]

Questo può essere compresso usando un po 'di logica. Ciascuna delle scelte A, B, Ce Dpuò essere rappresentato da due valori vero / falso illustrato di seguito:

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

Usando questa logica, possiamo comprimere i quattro vettori sopra in soli due:

 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]

Cioè, la soluzione al tuo test è semplicemente: 00110111, 10011010. Concatenandoli, otteniamo il numero binario 0011011110011010o 14234in decimale. Usa questo valore decimale per imbrogliare il tuo test!

Sfida

Prendi un numero Nnell'intervallo (inclusivo) [0, 65535]e genera una stringa con la risposta al test a scelta multipla.

Casi test:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

L'output può essere in lettere maiuscole o minuscole, ma non è possibile utilizzare altri simboli.


L'output deve essere la stringa come mostrato o le lettere possono trovarsi su righe separate, in un elenco, ecc.?
xnor

@xnor Opzionale :-)
Stewie Griffin,

Perché non l'ovvio A = 00, B = 01, C = 10, D = 11?
user253751

Il motivo è stato che l'ho fatto per la prima volta A=10, B=01, quindi C=nor(A,B), e D=and(A,B)ispirato dalla sfida di Adnan. Con il senno di poi sarebbe stato meglio farlo al contrario, ma beh ... Troppo tardi ora ...
Stewie Griffin,

Risposte:


3

Gelatina , 14 byte

d⁹+⁹BZḄḊị“BADC

Provalo online! o verifica tutti i casi di test .

Come funziona

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

05AB1E , 19 18 16 byte

Codice:

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

Utilizza la codifica CP-1252 . Provalo online!

Spiegazione:

Innanzitutto, aggiungiamo 65536al numero ( žHè una costante definita in 65536), che è anche 10000000000000000in binario. Questo serve a riempire il numero con zero. Prendiamo il numero 14234come esempio. 14234 + 65536è uguale a 79770. Che in binario è:

10011011110011010

Rimuoviamo il primo carattere, risultando in:

0011011110011010

Abbiamo diviso la stringa in due pezzi usando :

00110111, 10011010

Successivamente, comprimiamo l'array con ø:

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

La loro conversione in decimale (usando C) comporta:

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

Ora, dobbiamo solo indicizzarlo con la stringa cbad. La versione compressa per questa stringa è ’c‰±’, che può anche essere testata qui . Infine, otteniamo i caratteri nell'indice dell'array sopra. Per l'esempio sopra, questo si traduce in:

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

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

Versione non ricorsiva (55 byte)

Usando un'espressione regolare, possiamo fare:

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

Come hai pensato di fare le operazioni bit per bit?
ericw31415,

@ ericw31415 - Anche se non lo fa esplicitamente, la sfida in realtà sta descrivendo queste operazioni bit a bit in ordine inverso (a partire da "Questo può essere compresso usando un po 'di logica." )
Arnauld

3
... un po ' di logica ...
Neil,

4

Python 2, 53 byte

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

Provalo su Ideone .


Stavo cercando di usare (n&257)%127ma è più lungo. Peccato che 127 sia primo. Forse puoi pensare a un modo per ottimizzarlo.
xnor

4

CP-1610 assembly, 24 DECLEs (30 byte)

Questo codice deve essere eseguito su un Intellivision . (1)

Un codice operativo CP-1610 è codificato con un valore di 10 bit, noto come "DECLE". La funzione effettiva è lunga 24 DECLE, a partire da $4809e termina a $4820.

I registri CPU sono comunque 16 bit ampio, in modo sosterrà qualsiasi valore di ingresso in 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

Produzione

immagine dello schermo


(1) Concesso che almeno un compilatore, diversi emulatori e file ROM sostitutivi senza copyright sono disponibili gratuitamente, penso che non violi alcuna regola di presentazione PPCG. Per favore fatemi sapere se sbaglio.


1
Facciamo un punteggio in byte, quindi sommate il numero totale di bit e il vostro punteggio è il risultato decimale (float) di dividere quel valore per otto. In questo caso, 27,5 byte.
mbomb007,

3

CJam , 22 byte

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

Provalo online!

Spiegazione

Alimentato dalla magia ...

La mappatura di coppie di bit in lettere in questa sfida è un po 'arbitraria. Se rappresentiamo ABCDper 0, 1, 2, 3(quindi possiamo semplicemente aggiungerli al personaggio A) allora vogliamo il seguente mapping:

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

Questa mappatura può essere calcolata con una piccola formula magica:, ((i1 == i2) + 1) ^ i1dove ritorna il controllo di uguaglianza 0o 1. Dai un'occhiata alla tabella seguente, dove ogni colonna corrisponde a un input, ogni riga corrisponde a un'operazione e ogni cella mostrerà lo stack in quel punto:

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

Con questo in mente ecco la suddivisione completa del codice sorgente:

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

Una soluzione alternativa con lo stesso numero di byte che è decisamente meno magica:

ri2bG0e[8/z2fb"CBAD"f=

E nel caso sia utile a chiunque, se si trasformano i1e i2bit in un singolo numero (cioè quando si desidera la mappatura 0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3), questo può essere calcolato ancora più facilmente come (~n - 1) & 3o (~n - 1) % 4se la propria lingua ottiene il modulo su valori negativi giusti. Penso che questo possa essere scritto in modo conciso come 3&~-~nin molte lingue. In CJam questo risulta essere un byte più lungo, a causa della conversione aggiuntiva dalla base 2.


3

PHP, 57 byte

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

Versione senza operatori Bitwise 70 byte

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

Dove viene $idefinita la variabile ?
ericw31415,

@ ericw31415 Nel primo utilizzo di una variabile viene inizializzato e automaticamente dichiarato PHP questa variabile con riferimento null
Jörg Hülsermann

Quello è PHP (tm)
tomsmeding il

3

Mathematica, 75 73 68 66 byte

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

Grazie a @MartinEnder per aver salvato 2 byte.


@MartinEnder #+##e Infixlavoro, ma l'utilizzo StringPartè inevitabile perché il capo di "C"["B","A","D"][[#+##]]è "C", no List; StringJoinnon funziona
JungHwan Min

1
Oh, non me ne ero reso conto #ed #2erano le intere liste.
Martin Ender,

3

Perl, 42 byte

Include +1 per -n

Dare input su STDIN:

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

Solo il codice:

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

3

JavaScript, 113 93 90 88 byte

Un grande ringraziamento a @Neil per avermi aiutato a salvare 20 byte!
-3 byte grazie a @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]]')

Purtroppo, manca JavaScript funzioni come decbin, bindece str_padche PHP ha.


1
(65536+n).toString(2).slice(1)e [+b[i+8]+2*b[i]]sarebbe più breve, per esempio.
Neil,

padStart, se fosse accettato in una versione futura di ECMAscript, si tradurrebbe in un risparmio maggiore.
Neil,

1
Invece di {…;return }, usaeval("…")
Cyoce

@Neil Sembra che padStartora esista in ECMAScript.
Ericw31415,

1

MATL, 16 byte

16&B8eXB'BADC'w)

Provalo online!

oppure Verifica tutti i casi di test

Spiegazione

        % 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

Julia, 73 byte

Fornisce una funzione f prendendo N come input e restituendo la risposta come stringa.

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

Provalo

A seconda che un array di caratteri contenga come stringa, si può omettere il join ( 67 byte )

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

Provalo


0

R, 110 byte

È venuto con una soluzione vettorializzata in R. Questo probabilmente dovrebbe essere golfabile trovando una conversione più intelligente in conversione binaria.

x=as.integer(intToBits(scan()));cat(LETTERS[1:4][match(paste0(x[16:9],x[8:1]),c("10","01","00","11"))],sep="")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.