Hacer trampa en una prueba de opción múltiple, parte 2

26

Esta es la secuela de este desafío de Adnan . Si te gusta este desafío, es probable que también te guste el otro. ¡Echale un vistazo!


Una prueba de elección múltiple con 8 preguntas cada uno con 4 opciones podría tener las respuestas: BCADBADA. Convertido a cuatro matrices diferentes, con verdadero y falso si la letra actual es la respuesta, se verá así

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]

Esto se puede comprimir usando un poco de lógica. Cada una de las opciones A, B, Cy Dpuede ser representado por dos valores verdadero / falso se muestra a continuación:

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

Usando esta lógica, podemos comprimir los cuatro vectores anteriores a solo dos:

 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]

Es decir, la solución a su prueba es simplemente: 00110111, 10011010. Al concatenar estos, obtenemos el número binario 0011011110011010, o 14234en decimal. ¡Usa este valor decimal para hacer trampa en tu prueba!

Reto

Tome un número Nen el rango (incluido) [0, 65535]y envíe una cadena con la respuesta a la prueba de opción múltiple.

Casos de prueba:

14234
BCADBADA

38513
ABBDCAAB    

0
CCCCCCCC

120
CBBBBCCC

65535
DDDDDDDD

39253
ABCDABCD

La salida puede estar en mayúsculas o minúsculas, pero no puede usar otros símbolos.

Stewie Griffin
fuente
¿La salida tiene que ser la cadena como se muestra o las letras pueden estar en líneas separadas, en una lista, etc.?
xnor
@xnor Opcional :-)
Stewie Griffin
¿Por qué no lo obvio A = 00, B = 01, C = 10, D = 11?
user253751
La razón fue primero hice A=10, B=01, entonces C=nor(A,B), y D=and(A,B), inspirado por el desafío de Adnan. En retrospectiva, podría haber sido mejor hacerlo al revés, pero bueno ... Demasiado tarde ahora ...
Stewie Griffin

Respuestas:

3

Jalea , 14 bytes

d⁹+⁹BZḄḊị“BADC

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

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
fuente
10

05AB1E , 19 18 16 bytes

Código:

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

Utiliza la codificación CP-1252 . Pruébalo en línea!

Explicación:

Primero, agregamos 65536al número ( žHes una constante definida para 65536), que también está 10000000000000000en binario. Esto es para rellenar el número con ceros. Tomemos el número 14234como ejemplo. 14234 + 65536es igual a 79770. Que en binario es:

10011011110011010

Eliminamos el primer carácter, lo que resulta en:

0011011110011010

Dividimos la cuerda en dos pedazos usando :

00110111, 10011010

Después de eso, comprimimos la matriz con ø:

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

Convertirlos nuevamente a decimal (usando C) da como resultado:

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

Ahora, solo necesitamos indexarlo con la cadena cbad. La versión comprimida para esta cadena es ’c‰±’, que también se puede probar aquí . Finalmente, obtenemos los caracteres en el índice de la matriz anterior. Para el ejemplo anterior, esto da como resultado:

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

JavaScript (ES6), 55 48 bytes

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

Versión no recursiva (55 bytes)

Usando una expresión regular, podemos hacer:

n=>"76543210".replace(/./g,i=>"CBAD"[n>>i&1|n>>+i+7&2])
Arnauld
fuente
¿Cómo pensaste en hacer las operaciones bit a bit?
ericw31415
@ ericw31415 - Incluso si no es hacerlo de forma explícita, el reto es en realidad describiendo estas operaciones bit a bit en orden inverso (a partir de las "Este puede ser comprimido usando un poco de lógica." )
Arnauld
3
... un poco de lógica ...
Neil
4

Python 2, 53 bytes

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

Pruébalo en Ideone .

Dennis
fuente
Estaba tratando de usar (n&257)%127pero es más largo. Lástima que 127 es primo. Quizás puedas pensar en una forma de optimizarlo.
xnor
4

Conjunto CP-1610 , 24 DECLE (30 bytes)

Este código está destinado a ejecutarse en una Intellivision . (1)

Un código de operación CP-1610 está codificado con un valor de 10 bits, conocido como 'DECLE'. La función real es de 24 DECLEs de largo, comenzando en $4809y terminando en $4820.

Sin embargo los registros de la CPU son de 16 bits de ancho, por lo que apoyará cualquier valor de entrada en 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

Salida

captura de pantalla


(1) Dado que al menos un compilador, varios emuladores y archivos ROM de reemplazo libres de derechos de autor están disponibles gratuitamente, creo que no infringe ninguna regla de envío de PPCG. Pero por favor avíseme si me equivoco.

Arnauld
fuente
1
Puntuamos en bytes, así que suma el número total de bits, y tu puntaje es el resultado decimal (flotante) de dividir ese valor entre ocho. En este caso, 27,5 bytes.
mbomb007
3

CJam , 22 bytes

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

Pruébalo en línea!

Explicación

Impulsado por la magia ...

La asignación de pares de bits a letras en este desafío es un poco arbitraria. Si representamos ABCDpor 0, 1, 2, 3(para poder agregarlos al carácter A), entonces queremos la siguiente asignación:

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

Este mapeo se puede calcular con una pequeña fórmula mágica: ((i1 == i2) + 1) ^ i1donde el control de igualdad regresa 0o 1. Consulte la siguiente tabla, donde cada columna corresponde a una entrada, cada fila corresponde a una operación y cada celda mostrará la pila en ese 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 eso en mente, aquí está el desglose completo del código fuente:

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 solución alternativa con el mismo número de bytes que es decididamente menos mágica:

ri2bG0e[8/z2fb"CBAD"f=

Y en caso de que sea útil para cualquier persona, si a su vez el i1y i2bits de nuevo en un solo número (es decir, cuando se desea el mapeo 0 -> 2, 1 -> 1, 2 -> 0, 3 -> 3) esto puede ser calculada aún más fácilmente como (~n - 1) & 3o (~n - 1) % 4si su lengua se pone módulo en valores negativos derecha. Creo que esto se puede escribir de manera concisa como 3&~-~nen muchos idiomas. En CJam, esto resulta ser un byte más largo, debido a la conversión adicional desde la base 2.

Martin Ender
fuente
3

PHP, 57 bytes

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

Versión sin operadores Bitwise 70 Bytes

for(;$i<8;)echo CABD[($s=sprintf("%016b",$argv[1]))[$i]+$s[8+$i++]*2];
Jörg Hülsermann
fuente
¿Dónde se $idefine la variable ?
ericw31415
@ ericw31415 En el primer uso de una variable se inicializa y declara automáticamente PHP esta variable con una referencia nula
Jörg Hülsermann
Eso es PHP (tm)
tomsmeding
3

Mathematica, 75 73 68 66 bytes

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

Gracias a @MartinEnder por guardar 2 bytes.

JungHwan Min
fuente
@MartinEnder #+##y Infixtrabajo, pero el uso StringPartes inevitable porque el jefe de "C"["B","A","D"][[#+##]]es "C", no List; StringJoinno funciona
JungHwan Min
1
Oh, no me di cuenta de eso #y #2eran las listas completas.
Martin Ender
3

Perl, 42 bytes

Incluye +1 para -n

Dar entrada en STDIN:

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

Solo el código:

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

JavaScript, 113 93 90 88 bytes

¡Muchas gracias a @Neil por ayudarme a ahorrar 20 bytes!
-3 bytes gracias 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]]')

Por desgracia, carece de funciones como JavaScript decbin, bindecy str_padque tiene PHP.

ericw31415
fuente
1
(65536+n).toString(2).slice(1)y [+b[i+8]+2*b[i]]sería más corto, por ejemplo.
Neil
padStart, si se acepta en una versión futura de ECMAscript, se traduciría en un ahorro mayor.
Neil
1
En lugar de {…;return }, useeval("…")
Cyoce
@Neil Parece que padStartahora existe en ECMAScript.
ericw31415
1

MATL, 16 bytes

16&B8eXB'BADC'w)

Pruébalo en línea!

o Verificar todos los casos de prueba

Explicación

        % 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
fuente
1

Julia, 73 bytes

Otorga una función f que toma N como entrada y devuelve la respuesta como cadena.

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

Intentalo

Dependiendo de si una matriz de caracteres cuenta como una cadena, se puede omitir la unión ( 67 bytes )

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

Intentalo

pasbi
fuente
0

R, 110 bytes

Se le ocurrió una solución vectorizada en R. Esto probablemente debería ser fácil de obtener al llegar a una conversión más inteligente int a conversión binaria.

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