Вы должны создать случайное поле для гольфа на 18 лунок.
Пример вывода:
[3 4 3 5 5 4 4 4 5 3 3 4 4 3 4 5 5 4]
Правила:
- Ваша программа должна вывести список длин отверстий точно для 18 отверстий
- Каждое отверстие должно иметь длину 3, 4 или 5
- Длина лунки должна составлять до 72 за весь курс
- Ваша программа должна иметь возможность производить каждую возможную конфигурацию дырок с некоторой ненулевой вероятностью (вероятности каждой конфигурации не обязательно должны быть равными, но вы можете требовать дополнительных похвал в этом случае)
4
, и единственные возможности3
,4
или5
, возможное решение классы {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
}. Это можно рассчитать поnCr(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
. Это означает, что приблизительно11.4%
все возможные комбинации являются действительными решениями(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)
дает44152809L
Ответы:
к (
18 1716 символов)Вернемся к первоначальному подходу, кредит CS для улучшения.
Другой подход (17 символов), тот же метод, что и у решения J, H / T для CS
Старая версия:Не подвержен переполнению стека и работает в фиксированном объеме пространства.
источник
К, 28
источник
J,
201817 символовЭто работает так же, как и в предыдущем ответе, за исключением того, что 9 случайных цифр равны 0 или 1 и перед добавлением отменяются. Это означает, что есть столько же,
-1
сколько есть1
s. Добавление 4 дает мне список3
S,4
S и5
S, которые в сумме до 72 каждый раз.Предыдущий ответ:
Генерирует первые 9 лунок случайным образом
?9#3
, затем копирует и инвертирует их(,2-])
(превращает 3 в 5 и 5 в 3), чтобы сгенерировать финальный 9. Это гарантирует, что итоговое значение будет 72 (так как каждые 3 будут иметь соответствующие 5, среднее общее количество на лунку будет 4 и 4x18 = 72). Затем он случайным образом перемешивает результат,({~?~@#)
чтобы гарантировать, что каждая комбинация возможна.источник
16-битный машинный код x86 под MS-DOS - 45 байт
HexDump:
Двоичный код Base64:
Актуальный исходный код с некоторыми комментариями:
Компилировать
nasm 18h.asm -o 18h.com
и запускать под MS-DOS (или Dosbox) или NTVDM из 32-разрядной версии Windows.Пример вывода:
источник
Mathematica
71 68 6660С 6 символами, спасенными предложением Талли.
Все возможные результаты возможны, но они не одинаково вероятны.
Анализ
производит все 10 возможных разбиений (комбинаций, а не перестановок) из 72 на 18 элементов, состоящих из 3, 4 и 5.
RandomChoice
выбирает один из них.RandomSample
возвращает перестановку этого выбора.источник
R - 41
Алгоритм похож на @ sgrieve's.
источник
GolfScript (26 символов)
Есть некоторые очевидные сходства с решением Ильмари, но также есть и некоторые очевидные различия. В частности, я использую тот факт, что средний номинал равен 4.
источник
{;0{3.rand+.@+}18*])72-}do
сам, но не мог понять, как сделать это немного короче оттуда. +1.Python 77
Код
Выход
Импорт действительно убивает это решение. Он использует numpy для генерации 18 чисел от 3 до 5 и продолжает генерировать списки, пока сумма списка не станет равной 72.
источник
GolfScript, 27 символов
Использует тот же метод выборки отклонения, что и в решении Python от sgrieve. Таким образом, каждый действительный вывод в действительности одинаково вероятен
источник
Q (25 символов)
Оригинал (27)
Образец вывода
Немного короче (25)
источник
JavaScript,
666461 символовСильно вдохновлен TwoScoopsofPig (PHP) и Джо Тускан (JS).
источник
s!=72
можноs-72
сохранить один символ И последняя точка с запятой;a
не нужна ни для другого символа.for(i=x;i;i--)
прежде, чем это спасает 2 символа отfor(i=0;i<x;i++)
, спасибо человек!Python 2, 70 байт
редактировать:Вот еще один, похожий на решение sgrieve:
Python 2, 73 байта + равная вероятность
источник
JavaScript,
1169965 байтfor(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
источник
i is not defined
.Python,
128120116 символовimport
операторы по-прежнему являются убийцами длины (только 23 символа для импорта 2 функций в пространстве имен)Я надеюсь, что вам не нужен результат в ближайшем будущем, так как этот код сначала оценивает все возможные решения, а затем выбирает случайное. возможно самое медленное решение этой проблемы.
я требую дополнительные похвалы за равную вероятность каждой конфигурации ...
источник
import random,itertools
import random as r,itertools as i
тогда используйтеr
иi
вместоrandom
иitertools
. Используйте18*[0]
вместоrange(18)
и[3,4,5,6]
вместоrange(3,6)
:)choice()
функцией. это также то, что делает этот код таким медленным ...PHP - 77 символов
Как и в случае решения sgrieve, он создает список из 18 лунок, проверяет общее номинальное число и либо распечатывает его, либо отклоняет его и повторяет попытку. Как ни странно, наши два решения имеют одинаковую длину.
Довольно досадно, что PHP не предлагает функций массива с краткостью имени. Array_sum и print_r убивают меня. Предложения приветствуются.
источник
+=
.<?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);
{}
(поскольку синтаксис PHP явно позволяет это).Рубин 1,9 (62 символа)
Рельсы (55 символов)
В
$ rails c
REPL (в любой папке Rails):Примечание: он работает с Ruby 1.8, если вы используете
shuffle[0]
вместоsample
.источник
(1..18).map{rand(3)+3}
чтобы получить случайный массив;)Лисп (
7869 символов)(do ((c () (mapcar (лямбда (x) (+ 3 (случайное 3))) (список составителей 18)))) ((= (применить '+ c) 72) c))Это довольно похоже на Python-решение sgrieve.
Начните с c как NIL, проверьте сумму 72,
do
«функция приращения» для c генерирует список из 18 чисел от 3 до 5, проверьте 72 снова, вспенить, промыть, повторить.Приятно видеть
do
иloop
приятно играть в гольф вместе.источник
С (123 символа) - усилие на эффективность
Пройдите через wc, и он сгенерирует все 44152809 решений в течение 10 секунд ...
О, хорошо - не прочитал вопрос должным образом - но, учитывая, что мы генерируем все решения, то выбор случайного с равной вероятностью является упражнением для сценариев: P
источник
Clojure - 55
Весьма забавный трюк .... использует математическую структуру задачи, в которой должно быть ровно столько же 3 парных отверстий, сколько 5 парных отверстий.
источник
Python 83
Как решение Sgrieve, но без NumPy
Гольф Решение Адриена Плиссона: 120-> 108 символов
MATLAB 53
Выход :
источник
randi([3,5],1,18)
вместо3+floor(rand(1,18)*3)
Ява (61 символ)
Пример вывода:
источник
С (94 символа)
s=0
строке 1 может не потребоваться, потому что шансы, что неинициализированный int будет равен 72? Мне просто не нравится читать неинициализированные значения в прямом C. Кроме того, это, вероятно, требует заполненияrand()
функции.выход
источник
Скрипт Bash Shell (65 символов)
( shuf поставляется из пакета GNU coreutils. Также, спасибо Гарету.)
источник
C # (143 без пробелов):
источник
new Guid()
создает пустой GUID. Для создания уникального GUID вам нужно вызвать статический методGuid.NewGuid
.Math.Random
, этоSystem.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 символов.источник
[1..n]>>[r]
немного короче чемreplicate n$r
.sequence
наmapM
.Perl, 74
Альтернативное решение:
источник
TXR (99 символов)
Это выражение генерирует бесконечный ленивый список случайных чисел от 3 до 5:
Остальная часть логики представляет собой простой цикл, который проверяет, составляют ли первые 18 элементов этого списка 72. Если нет, он извлекает элемент и пытается снова.
for
Цикл содержит неявный блок под названиемnil
и так(return ...)
может быть использован для завершения цикла значения и возврата.Обратите внимание, что длина символа 99 включает завершающий символ новой строки, который требуется.
источник
APL 12
Обратите внимание, что у меня источник индекса установлен в 0, что означает, что массивы начинаются с 0. Вы можете установить это с помощью
⎕IO←0
.источник
R, 42 байта
sample
по умолчанию рисует равномерно среди возможных значений (здесь3 4 5
).r=T
обозначаетreplace=TRUE
и позволяет образец с заменой.источник
CJam,
1714 байтовCJam новее, чем этот вызов, но это не самый короткий ответ, так что это не имеет значения.
Проверьте это здесь.
Для поддержания в общей сложности 72, каждый
3
должен быть в паре с5
. Вот как это работает:источник