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.


¿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".

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

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

¿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 .


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.


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.


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

¿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.


@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

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.


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

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


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="")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.