Otro problema de nuestro golf interno ... este alrededor de las vacaciones del año pasado.
PROBLEMA
Andy, Barb, Carl, Didi, Earl y Fran están comprando regalos el uno para el otro. Dibuja nombres para un intercambio de regalos.
- Cada persona compra un regalo y recibe un regalo.
- Nadie compra su propio regalo.
- La ejecución de la solución varias veces debería producir resultados diferentes (el par donante-receptor no debe ser predecible o idéntico de una ejecución a otra).
ENTRADA
Ninguna.
SALIDA
Formateado como en este ejemplo:
Andy compra para Barb
Barb compra para Carl
Carl compra para Didi
Didi compra para Earl
Earl compra para Fran
Fran compra para Andy
Respuestas:
J, 57
p.ej
fuente
c99 - 252 caracteres
Ligera mejora al aprovechar la naturaleza circular de la permutación. Esta versión siempre construye una estrategia de compra similar a un bucle, por lo que es menos aleatoria que la versión anterior (271 caracteres), pero creo que aún cumple con las especificaciones.
Requiere una plataforma que tenga un funcionamiento
/dev/random
. Debería poder eliminar aproximadamente 8 omitiendo los\0
s en la cadena grande, pero mi libc no parece estar lidiando con los%4s
especificadores de impresión como dice la página del manual.La combinación es mala, pero hacerlo de esa manera me impide tener que verificar las condiciones de "Foo compra para Foo" .
Legible:
fuente
Windows PowerShell, 83
Historia:
$i
que se recreará cada vez.$_
la cuerda para salvar el+
.fuente
Haskell,
241189 caracteresSalida completamente aleatoria (que aún satisface la especificación).
Esto genera todas las permutaciones de la lista de nombres, elige uno al azar (creo que esta es la forma más corta en Haskell de barajar una lista; si alguien tiene algo más pequeño, lo agradecería), y luego cada persona compra un presente para la siguiente persona en la lista.
fuente
permutations$words"Andy Barb Carl Didi Earl Fran"
y algunos otros trucos que probé en mi versión mejorada. Olvidé que esopermutations
no está incluido en el 98List
, por lo que también debes usar el nombre largo. Échale un vistazo.r=tail.cycle
. y que en líneamain=randomRIO(0,719)>>=mapM_ putStrLn.f
Golfscript:
72 6457 caracteresPruebas
"AndyBarbCarlDidiEarlFran"4/
, actualizado y tengo 7 caracteres menos;9rand
es más aleatorio que mi6rand*
fuente
"AndyBarbCarlDidiEarlFran"4/
6rand*
,0=rand
o tal vez;9rand
sea preferible. Para el bucle,{.n+\' buys for '}%(
es más corto ..6rand*
porque pensé que aleatorizaría igualmente la matriz de 6 elementos (creo que estaba equivocado, ya que;9rand
parece realmente aleatorio que el mío)Japt -R, 41 bytes
-2 bytes gracias a @Oliver!
¡Intentalo!
Este es el enfoque que tomé a un alto nivel:
Tengo un poco de historia con este problema, ya que creé un programa "secreto de santa" para mi trabajo hace años. Terminamos pidiendo a algunos solicitantes de empleo que trabajen también :)
fuente
ã
no está devolviendo un par que vincula el primero al último elemento. Estoy trabajando en una forma de hacer que esto funcione, pero pensé que te lo haría saber. Gracias de nuevo sin embargo! ethproductions.github.io/japt/…"q"
in the.ö("q")
doPython - 118 caracteres
Python - 120 caracteres
fuente
R - 85 caracteres
fuente
Python - 154 caracteres
fuente
map
llamastr.__eq__
a cada par de valores correspondientes en L y M, y el ciclo continúa hasta que ninguno de ellos sea verdadero.D: 233 caracteres
Más legible:
fuente
Pitón (175)
fuente
Esquema 173
Da una de dos soluciones.
fuente
C #,
210183 caracteresMontones de repeticiones :(
Esta solución no es totalmente aleatoria: siempre hay uno o más "bucles" de personas, por ejemplo, A-> C-> E-> A, y los desplazamientos son siempre los mismos en los bucles. Sin embargo, no es posible predecir el resultado de una ejecución particular a menos que tenga parte de ese resultado.
fuente
var n="Andy Barb Carl Didi Earl Fran".Split()
? Ahorra 16 bytes. Puede omitir el argumentoMain()
, que ahorra otros 9 bytes. Y puede combinar la declaración dec
yi
:int c,i=...;for(c=0;...
que ahorra otros dos.Ruby - 89 caracteres
Salida:
fuente
map
lugar deeach
.MathGolf , 41 bytes
Pruébalo en línea!
Explicación
No se garantiza que produzca cada caso con la misma probabilidad, pero sí produce resultados diferentes en cada ejecución. Un byte podría eliminarse si tuviera un operador aleatorio, pero eso es para otro día.
fuente