Otros tres números
Dados tres números distintos de \$1\$a \$7\$, genera otros tres números distintos de \$1\$a \$7\$, es decir, no tener números en común con los números originales. Su código debe producir un conjunto de salida diferente para cada conjunto de entrada posible. Es decir, dos entradas no pueden producir la misma salida, tratándose ambas como conjuntos desordenados. Aparte de eso, puede implementar cualquier mapeo que desee.
Más matemáticamente, se le pide que dé una biyección (función uno a uno) \$f:S \to S\$donde \$S\$consta de subconjuntos de tres elementos de \$\{1,2,3,4,5,6,7\}\$, tal que \$f(s) \cap s = \emptyset\$por cada \$s\in S\$. Como biyección, este mapeo debe ser invertible, aunque no es necesario que proporcione la función inversa en su código.
Aquí están los 35 triples posibles (escritos separados por espacios ).
E / S
El formato de los conjuntos de tres elementos es flexible. Puede tomar las entradas en orden ordenado como tres números o una lista / matriz / tupla de tres elementos, o como un conjunto. Sin embargo, no puede requerir entradas ordenadas en un orden específico que no sea ordenado. Puede cero index.
También puede utilizar una secuencia de siete bits de los cuales tres están activados. Esta secuencia de siete bits también se puede representar como un número decimal, byte o carácter.
La salida se puede dar en cualquiera de estos formatos, con la ventaja adicional de que las salidas ordenadas no tienen que ser ordenadas.
Respuestas
Python 3 , 53 bytes
def f(b):c=[*{*range(7)}-b];del c[-sum(b)%4];return c
¡Pruébelo en línea!
-3 bytes gracias a FryAmTheEggman
-4 bytes por indexación cero
-1 byte gracias a xnor
Python 3 , 43 bytes
lambda s:([*{*range(7)}-s]*4)[-sum(s):][:3]
¡Pruébelo en línea!
Gelatina , 9 8 7 bytes
7RṚḟṙSḊ
Un enlace monádico que acepta una lista de los tres números, de \$[1,7]\$, en orden ordenado que produce una lista de otros números, desde \$[1,7]\$, no necesariamente ordenados.
¡Pruébelo en línea! O vea los 35 (clasifiqué los valores resultantes para facilitar la comparación).
¿Cómo?
7RṚḟṙSḊ - Link: list A e.g. [2,4,7]
7R - seven range [1,2,3,4,5,6,7]
Ṛ - reverse [7,6,5,4,3,2,1]
ḟ - filter discard (A) -> B [6,5,3,1]
S - sum (A) 13
ṙ - rotate (B) left by (that) [5,3,1,6]
Ḋ - remove the leftmost [3,1,6]
R , 33 31 bytes
Editar: -2 bytes usando módulo -4(que devuelve el negativo del módulo 4)
(1:7)[v<--scan()][sum(v)%%-4-1]
¡Pruébelo en línea!
Encuentra los 4 dígitos en 1..7 que no están en la entrada y excluye el correspondiente a la suma de entrada (envolviendo alrededor).
El enlace TIO prueba que las salidas son únicas para cada entrada y muestra la salida para cada entrada.
(1:7) # vector of digits 1..7
[ ] # select elements
-scan() # excluding (negative indexes) input
v<- # and define v as (negative) input
# (so up to here we have the 4 elements that aren't in the input)
[ ] # from these, select elements
- # excluding (negative index)
(sum(v)%%4+1) # the sum of input, modulo 4, plus 1
Japonés , 14 bytes
Como se anunció anteriormente , estoy un poco borracho, por lo que esto podría estar mal e, incluso si es correcto, probablemente se podría jugar un poco al golf.
7õ kU k϶UxÍu4
Pruébalo o mira (lo que creo que es) la prueba
Carbón , 39 38 34 32 bytes
NθI⁻¹²⁷⁺θX²⊟Φ⁷№ETXdhp﹪×℅λX²ι¹²⁷θ
¡Pruébelo en línea! El enlace corresponde a la versión detallada del código. E / S es un entero de 7 bits 7..112. Explicación: Los ordinales de la cadena TXdhptienen cinco patrones de bits que he elegido arbitrariamente para que el resultado los excluya 1. Luego se rotan cíclicamente hasta que uno coincida con la entrada, momento en el que he determinado el bit excluido. Este bit luego se agrega a la entrada original, y finalmente 127se imprime la diferencia entre y la suma.
Nθ Cast input to integer
⁷ Literal 7
Φ Filter on implicit range
TXdhp Literal string `TXdhp`
E Map over characters
λ Current character
℅ Ordinal
× Multiplied by
² Literal 2
X Raised to power
ι Outer index
﹪ Modulo
¹²⁷ Literal 127
№ Count (i.e. contains)
θ Input
⊟ Pop matching value
² Literal 2
X Raised to that power
⁺ Added to
θ Input
⁻ Subtracted from
¹²⁷ Literal 127
I Cast to string
Implicitly print
Elegí arbitrariamente los siguientes patrones de cinco bits para excluir, 1pero funcionarían cinco patrones incluso cíclicamente distintos.
T 1010100
X 1011000
d 1100100
h 1101000
p 1110000
JavaScript (ES6), 66 65 bytes
Toma la entrada como una cadena de 3 dígitos. Devuelve una cadena con el mismo formato.
f=(n,k=i=0)=>++k<8?(~n.search(k)||n*43%399%4==i++?'':k)+f(n,k):''
¡Pruébelo en línea!
05AB1E , 10 bytes
7LsKsO(._¨
¡Pruébelo en línea!
¿Cómo?
7LsKsO(._¨ - (push the input) e.g.: [2,4,7]
7 - push 7 7,[2,4,7]
L - range [1,2,3,4,5,6,7],[2,4,7]
s - swap top two of the stack [2,4,7],[1,2,3,4,5,6,7]
K - push a without bs [1,3,5,6]
s - swap top two of the stack [2,4,7],[1,3,5,6] (implicit input swapped in)
O - sum 13,[1,3,5,6]
( - negate -13,[1,3,5,6]
._ - rotate a left by b [6,1,3,5]
¨ - remove rightmost [6,1,3]
- implicit print top of stack [6,1,3]
C (gcc) , 84 83 bytes
Guardado friolera 16 19 23 bytes gracias al hombre mismo ceilingcat !!!
Guardado un byte gracias a Neil !!!
p;i;f(m){for(p=i=0;(L"ᨴᘬᤲᔪ"[p]>>i%7&m)-m;p+=++i%7<1);p=(64>>i%7)+m^127;}
¡Pruébelo en línea!
Toma la entrada como \$3\$bits establecidos en el menos significativo- \$7\$-bits de an inty devuelve los otros tres números de la misma forma.
Explicación (antes de algunos campos de golf)
f(m){ // function taking an integer with
// 3 bits set in its 7 lsb
// representing the 3 input numbers
for( // loop over
p=L"ᔪᘬᤲᨴ" // a sequence of 5 int values:
// 5418,5676,6450,6708,7224
// that are the 5 unique patterns of
// 3 set bits per 7 bits shifted and
// repeated over 13 bits so that their
// 7th bit is unset:
// 5418 = 1010100101010
// 5676 = 1011000101100
// 6450 = 1100100110010
// 6708 = 1101000110100
// 7224 = 1110000111000
;;++p) // no need to test for stopping
// since we must match one
for(i=7;i--;) // loop over shift values from 6 to 0
if((*p>>6-i&m)==m) // if a shifted 7-bit slice of one of
// our patterns matches m we've found
// the correct bit to exclude from m's
// 4 unset bits
return(1<<i)+m^127; // add that bit to m and flip the 7
// lsb so the 3 other unset bits are
// now set to represent the 3 return
// values
}
Cáscara , 9 bytes
hṙ_Σ¹`-ḣ7
¡Pruébelo en línea!
Perl 5 , 49 bytes
sub{@c=grep!/[@_]/,0..6;splice@c,-sum(@_)%4,1;@c}
¡Pruébelo en línea!
Solo una traducción de la respuesta de Python de HyperNeutrino.
Scala , 64 bytes
b=>1.to(7).diff(b).zipWithIndex.filter(_._2!=b.sum*3%4)map(_._1)
¡Pruébelo en línea!
Rubí, 38 bytes
->s{n=s.sum;(([*1..7]-s)*9)[-n..-n+2]}
¡Pruébelo en línea!
Robando la respuesta de Eric que se basó en la respuesta de Jonathan . Le habría comentado a Eric, pero no tengo suficiente reputación.
La diferencia real: usar un rango para obtener el segmento de tres elementos.
Ruby , 40 bytes
->s{(([*1..7]-s)*9).last(s.sum).first 3}
¡Pruébelo en línea!
Puerto Ruby de la respuesta de Jonathan .
05AB1E , 17 bytes
7LIм{3.$IO(._Dg<£
¡Pruébelo en línea!
Es una versión mucho más larga de la respuesta de Jelly, así que vota eso también.
APL + WIN, 20 bytes
Solicita la entrada de un vector de números enteros
3↑(-+/¯2↑n)⌽n←(⍳7)~⎕
¡Pruébelo en línea! Gracias a Dyalog Classic
APL (Dyalog Unicode) , 13 bytes SBCS
1∘↓+/⌽(⌽⍳7)∘~
¡Pruébelo en línea!
Esta es la cima de un tren
1∘↓+/⌽(⌽⍳7)∘~
(⌽⍳7)∘~ ⍝ Right side of the atop
⍳7 ⍝ Range
⌽ ⍝ Reverse
∘ ⍝ Composed with...
~ ⍝ ...without (to remove our arguments)
⌽ ⍝ Rotated by...
+/ ⍝ ...the sum of the arguments
1∘↓ ⍝ Left side of the atop
1∘↓ ⍝ Drop leftmost (drop curried with 1)