Debe generar un campo de golf aleatorio de 18 hoyos.
Salida de ejemplo:
[3 4 3 5 5 4 4 4 5 3 3 4 4 3 4 5 5 4]
Reglas:
- Su programa debe generar una lista de longitudes de agujeros para exactamente 18 agujeros
- Cada hoyo debe tener una longitud de 3, 4 o 5
- La longitud del hoyo debe sumar 72 para todo el recorrido.
- Su programa debe ser capaz de producir todas las configuraciones de agujeros posibles con alguna probabilidad distinta de cero (las probabilidades de cada configuración no necesitan ser iguales, pero siéntase libre de reclamar felicitaciones adicionales si este es el caso)
4
, y las únicas posibilidades son3
,4
o5
, la posible solución clases son {no 3's or 5's
,one 3 and one 5
,two 3's and two 5's
, ...,nine 3's and nine 5's
}. Esto se puede calcular pornCr(18,0)*nCr(18,0) + nCr(18,1)*nCr(17,1) + nCr(18,2)*nCr(16,2) + ... + nCr(18,9)*nCr(9,9) = 44,152,809
. Esto significa que aproximadamente11.4%
todas las combinaciones posibles son soluciones válidas(44,152,809 / 3^18)
.sum(factorial(18)/factorial(x)/factorial(y)/factorial(z) for x in range(25) for y in range(25) for z in range(25) if 3*x+4*y+5*z == 72 and x+y+z == 18)
da44152809L
Respuestas:
k (
18 1716 caracteres)Volviendo al enfoque original, crédito a CS por la mejora.
Otro enfoque (17 caracteres), el mismo método que la solución J, H / T a CS
Versión antigua:No es susceptible al desbordamiento de la pila y se ejecuta en una cantidad fija de espacio.
fuente
K, 28
fuente
J,
201817 caracteresEsto funciona de la misma manera que la respuesta anterior, excepto que los 9 dígitos aleatorios son 0 o 1 y se niegan antes de agregarlos. Esto significa que hay tantos
-1
s como1
s. Agregar 4 me da una lista de3
s,4
sy5
s que suman 72 cada vez.Respuesta anterior:
Genera los primeros 9 hoyos al azar
?9#3
, luego los copia y los invierte(,2-])
(convierte un 3 en un 5 y un 5 en un 3) para generar el 9. final. Esto garantiza que el total será 72 (ya que cada 3 tendrá un 5 coincidente) el total promedio por hoyo será 4 y 4x18 = 72). Luego baraja aleatoriamente el resultado({~?~@#)
para garantizar que todas las combinaciones sean posibles.fuente
Código de máquina x86 de 16 bits en MS-DOS - 45 bytes
Hexdump:
Binario codificado Base64:
Código fuente real con algunos comentarios:
Compile
nasm 18h.asm -o 18h.com
y ejecute bajo MS-DOS (o Dosbox), o NTVDM desde una versión de Windows de 32 bits.Salida de muestra:
fuente
Mathematica
71 68 6660Con 6 caracteres guardados por la sugerencia de Tally.
Todos los resultados posibles son posibles, pero no son igualmente probables.
Análisis
produce las 10 particiones posibles (combinaciones, no permutaciones) de 72 en 18 elementos que consisten en 3, 4 y 5.
RandomChoice
selecciona uno de esos.RandomSample
devuelve una permutación de esa elección.fuente
R - 41
El algoritmo es similar al de @ sgrieve.
fuente
GolfScript (26 caracteres)
Hay algunas similitudes obvias con la solución de Ilmari, pero también algunas diferencias obvias. En particular, estoy explotando el hecho de que el par promedio es 4.
fuente
{;0{3.rand+.@+}18*])72-}do
, pero no pude encontrar la forma de acortarlo desde allí. +1.Python 77
Código
Salida
La importación realmente mata esta solución. Utiliza numpy para generar 18 números entre 3 y 5 y sigue generando listas hasta que la suma de la lista sea igual a 72.
fuente
GolfScript, 27 caracteres
Utiliza el mismo método de muestreo de rechazo que la solución Python de sgrieve. Por lo tanto, cada salida válida en realidad es igualmente probable.
fuente
Q (25 caracteres)
Original (27)
Salida de muestra
Ligeramente más corto (25)
fuente
JavaScript,
666461 caracteresMuy inspirado por TwoScoopsofPig (PHP) y Joe Tuskan (JS).
fuente
s!=72
puede sers-72
para guardar un personaje. Y el último punto y coma;a
tampoco es necesario para otro personaje.for(i=x;i;i--)
antes, salva 2 caracteres defor(i=0;i<x;i++)
, gracias hombre!Python 2, 70 bytes
editar:Aquí hay otro, similar a la solución de sgrieve:
Python 2, 73 bytes + igual probabilidad
fuente
JavaScript,
1169965 bytesfor(i=0,h=[];i<18;)h[i++]=5;while(h.reduce(function(a,b){return a+b})!=72){i=Math.random()*18|0;h[i]=[3,4,4][i%3]}h;
h=[0];while(h.reduce(function(a,b){return a+b})-72)for(i=0;i<18;h[i++]=[3,4,5][Math.random()*3|0])h
fuente
i is not defined
.Python,
128120116 caracteresimport
las declaraciones siguen matando la longitud (23 caracteres solo para importar 2 funciones en el espacio de nombres)Espero que no necesite el resultado en un futuro cercano, ya que este código primero evalúa todas las soluciones posibles antes de elegir una al azar. quizás la solución más lenta a este problema.
reclamo felicitaciones adicionales por la misma probabilidad de cada configuración ...
fuente
import random,itertools
import random as r,itertools as i
luego user
y eni
lugar derandom
yitertools
. Usar en18*[0]
lugar derange(18)
, y en[3,4,5,6]
lugar derange(3,6)
:)choice()
función. eso también es lo que hace que este código sea tan lento ...PHP - 77 caracteres
Al igual que la solución de sgrieve, esto crea una lista de 18 hoyos, verifica el par total, lo imprime o lo rechaza e intenta nuevamente. Por extraño que parezca, nuestras dos soluciones tienen la misma longitud.
Bastante molesto, PHP no ofrece funciones de matriz con ninguna brevedad de nombre. Array_sum y print_r me están matando. Sugerencias bienvenidas.
fuente
+=
.<?while($s!=72)for($s=$i=0;18>$i;$s+=$a[++$i]=rand(3,5));print_r($a);
while(array_sum($a)!=72)for($i=0;18>$i;)$a[++$i]=rand(3,5);
{}
(ya que la sintaxis de PHP lo permite explícitamente).Ruby 1.9 (62 caracteres)
Rieles (55 caracteres)
En
$ rails c
REPL (en cualquier carpeta Rails):Nota: Funciona con Ruby 1.8 si lo usa en
shuffle[0]
lugar desample
.fuente
(1..18).map{rand(3)+3}
para obtener la matriz aleatoria;)Lisp (
7869 caracteres)(do ((c () (mapcar (lambda (x) (+ 3 (random 3))) (make-list 18)))) ((= (aplicar '+ c) 72) c))Es bastante similar a la solución Python de sgrieve.
Comience con c como NIL, verifique la suma de 72, la
do
"función de incremento" para c genera una lista de 18 números entre 3 y 5, verifique nuevamente 72, haga espuma, enjuague, repita.Es refrescante ver
do
yloop
jugar golf juntos.fuente
C (123 caracteres) - esfuerzo en eficiencia
Conduzca a través de wc y generará todas las soluciones 44152809 en 10 segundos ...
Oh, bueno, no leí la pregunta correctamente, pero dado que estamos generando todas las soluciones, elegir una aleatoria con la misma probabilidad es un ejercicio de secuencias de comandos: P
fuente
Clojure - 55
Un truco bastante divertido ... explota la estructura matemática del problema de que debe haber exactamente 3 agujeros par por 5 agujeros par.
fuente
Python 83
Como la solución de sgrieve, pero sin numpy
Golf La solución de Adrien Plisson: 120-> 108 caracteres
MATLAB 53
Salida :
fuente
randi([3,5],1,18)
lugar de3+floor(rand(1,18)*3)
Java (61 caracteres)
Salida de muestra:
fuente
C (94 caracteres)
Es
s=0
posible que no se requiera la línea 1, porque ¿cuáles son las posibilidades de que un int sin inicializar sea igual a 72? Simplemente no me gusta leer valores no inicializados en C. Además, esto probablemente requiera sembrar larand()
función.salida
fuente
Bash shell script (65 caracteres)
( Shuf proviene del paquete GNU coreutils. Además, gracias Gareth).
fuente
C # (143 no espacios en blanco):
fuente
new Guid()
crea un GUID vacío. Para generar realmente un GUID único, debe llamar a un método estáticoGuid.NewGuid
.Math.Random
, esSystem.Random
.var r=new Random();for(;;){var e=Enumerable.Range(1,18).Select(i=>r.Next(3,6)).ToList();if(e.Sum()==72){e.ForEach(i=>Console.Write(i));break;}}
Haskell,
10410298 caracteres.fuente
[1..n]>>[r]
es un poco más corto quereplicate n$r
.sequence
amapM
.Perl, 74
Solución alternativa:
fuente
TXR (99 caracteres)
Esta expresión genera una lista infinita de números aleatorios del 3 al 5:
El resto de la lógica es un bucle simple que verifica si los primeros 18 elementos de esta lista suman 72. Si no, saca un elemento y lo intenta nuevamente. El
for
bucle contiene un bloque implícito llamadonil
y, por(return ...)
lo tanto, puede usarse para terminar el bucle y devolver el valor.Tenga en cuenta que la longitud de 99 caracteres incluye una nueva línea de terminación, que es necesaria.
fuente
APL 12
Tenga en cuenta que tengo el origen del índice establecido en 0, lo que significa que las matrices comienzan en 0. Puede configurar esto con
⎕IO←0
.fuente
R, 42 bytes
sample
, por defecto, dibuja de manera uniforme entre los posibles valores (aquí3 4 5
).r=T
representareplace=TRUE
y permite la muestra con reemplazo.fuente
CJam,
1714 bytesCJam es más nuevo que este desafío, pero esta no es la respuesta más corta de todos modos, por lo que eso realmente no importa.
Pruébalo aquí.
Para mantener el total de 72, cada uno
3
debe estar emparejado5
. Pues así es como funciona:fuente