вступление
Это основано на реальной проблеме, с которой я недавно столкнулся, создавая компьютерную игру, и я подумал, что это принесет хороший раунд игры в гольф .
Существует семь основных спектральных классов звезд, которые выделяют различное количество тепла. На геологию планет вокруг звезды большое влияние оказывает количество тепла, получаемого от звезды, которое является фактором спектрального класса и расстояния от звезды. Следовательно, Меркурий практически расплавлен, Нептун заморожен.
Галактика в моей игре сгенерирована процедурно, и случайный выбор типов планет для данных звезд оказался настоящим «заявлением ада»!
Соревнование
Ваш метод должен выбрать одну планету из списка типов планет, соответствующих классу звезды, на основе минимального теплового порога, максимального теплового порога и случайного числа. Для простоты эта задача будет использовать только звезду класса G, как наше Солнце.
входные
Целое число heat
в диапазоне от 4 до 11, представляющее количество тепла, получаемого планетой от звезды.
переменные
Эта таблица показывает возможные планеты на основе heat
. Ваш метод должен сначала сузить доступные варианты выбора, исходя из минимума нагрева и максимума нагрева, которые heat
должны приходиться на или между ними. Например, с теплом 10, переданным в единственном выборе будут Пустыня, Железо и Лава.
Planet type Heat min Heat max Random Chance
Gas Giant 4 9 15
Ice 4 6 10
Ice Giant 4 6 10
Gaia class 5 7 10
Dense Atmosphere 7 9 10
Desert 7 10 25
Iron 7 10 14
Lava 10 11 6
Далее, вероятность выбора планеты (в оставшихся вариантах) - это ее случайные шансы, деленные на сумму случайных шансов всех вариантов.
В приведенном выше примере вероятность выбора железа равна 14/(25+14+6)
.
Выход
Вернуть тип планеты в виде строки.
Делайте все возможное, чтобы избежать логических стрелок. Самый короткий код побеждает, очки за творческий подход. Удачного игры в гольф!
Ответы:
Желе , 78 байт
Монадическая ссылка, принимающая целое число (в [4,11] ), которое возвращает список символов.
Попробуйте онлайн!
Как?
Создает диапазоны температур планет в виде списка списков и подсчитывает вхождения входной теплоты в этих списках, чтобы получить список нулей и единиц, представляющих возможные типы планет, затем умножается на числа вероятностей восьми типов планет для получить распределение. Распределение используется для повторения имен типов планет, и, наконец, делается равномерный случайный выбор.
источник
R ,
225223183 байтСпасибо Джузеппе за умный рефакторинг для уменьшения его до 188 байт; остальные пять были выбриты с использованием менее избыточных числовых представлений.
Попробуйте онлайн!
источник
with
,data.frame
иsubset
будет короче.JavaScript 212
Редактировать 6 байтов, за исключением Джонатана Аллана
меньше гольфа
Тест
источник
[3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707]
)(z/16&15)
наz/16&15
. Несмотря на это, вы можете сохранить 6 байтов, используя сжатие base 8 со смещением три и шесть ... используйте[971,648,648,657,675,1636,932,445]
сz/8&7+3
,z%8+6
иz>>6
:)(z/8&7)+4
потому что&
имеет более низкий приоритет - это будет7/8&(7+4)
Кокос ,
214195 байтПопробуйте онлайн!
Порт Python будет иметь длину
203200 байт:Попробуйте онлайн!
источник
Древесный уголь ,
115111 байтПопробуйте онлайн! Ссылка на подробную версию кода. Редактировать: 4 байта сохранены благодаря @ ASCII-only. Объяснение:
Вычтите 3 из входных данных, чтобы их можно было сравнить с однозначными числами.
Разбейте строку
0715 0410 0410 1510 3710 3825 3814 696
на пробелы (пробелы, кажется, сжимают лучше, чем запятые, но я не пробовал другие символы) и зациклите каждую часть.Сравните входные данные с первой и второй цифрами и, если они между ними, передайте индекс цикла указанное число раз в предварительно определенный пустой список, заполнив его.
Разделите список планет на новые строки (опять же, лучше, чем запятые по некоторым причинам) и выберите элемент, соответствующий индексу, выбранному случайным образом из списка.
источник
R ,
196193190175171 байтПопробуйте онлайн!
Первоначально вдохновленный этим решением @rturnbull, однако, поскольку оба представления значительно эволюционировали, теперь это, по сути, смесь идей оригинального автора @Giuseppe, который очень помог мне в комментариях и моих. Вот краткое изложение ключевых моментов, которые помогли уменьшить количество байтов:
Кодирование данных планеты в формате CSV.Сбор имен,readLines
чтобы избежать большого количества символов кавычек вокруг строк.Настраиваем тепловые параметры, чтобы мы могли использовать
<
и>
знаки вместо<=
и>=
.Изменение формата данных о высокой температуре сHeat min, Heat max
на,Heat min, Heat Delta
чтобы избавиться от двузначных чисел.Заменяется смещением всех чисел на -3
Деление всех вероятностей планеты на 5, что также приводит к наименьшему количеству цифр.
Умножение вектора вероятностей планет на вектор логических значений (показывающий, удовлетворяет ли наш вход тепловой энергии), чтобы свести на нет вероятности неподходящих планет.
Возможно, еще несколько байтов можно было бы получить, применив какое-то сжатие данных.Я думаю, больше нет.
источник
t=
вместо того,text=
чтобы сохранить 3 байта, а также.read.csv
для одного столбца предложил полностьюreadLines
избавиться от кавычек, хотя вы должны явно установитьn
Python,
282 байта, 261 байт:Довольно просто - уверен, что это может быть больше в гольфе - Все еще в поисках лучшего способа представления дальности планеты и данных вероятности. Если я нахожусь в пределах досягаемости типа планеты, добавляю его в список в соответствии с вероятностью, затем случайным образом печатает один.
РЕДАКТИРОВАТЬ: с благодарностью Джонатана Фреха - переделать цикл for, чтобы сбить несколько байтов. Лучший способ добавления предметов в список
источник
i in range(x[1], x[2])
исключает ли верхний край тепла, в отличие от спецификации?p,d="Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava".split(","),[ord(i)-10 for i in"#"] d=[[p[x//3]]+d[x:x+3]for x in range(0,len(d),3)]
Октава с пакетом статистики,
178176174158 байтКод определяет анонимную функцию, которая вводит число и выводит строку.
Попробуйте онлайн!
объяснение
Код
определяет анонимную функцию с вводом
h
.Струна
делится на запятые с помощью
В результате получается массив ячеек строк, где каждая строка является классом планеты.
Код
определяет показанную строку и вычитает
70
из кодовых точек ее символов. Это дает массив минимальных значений тепла минус 1 , то есть[3 3 3 4 6 6 6 9]
.По аналогии,
производит массив максимальных значений тепла плюс 1 , то есть
[10 7 7 8 10 11 11 12]
.Сравнения
дать массив, содержащий
true
илиfalse
указывающий, какие классы планет возможны.С другой стороны,
определяет массив случайных значений случайности
[15 10 10 10 10 25 14 6]
.Операция
является поэлементным умножением последних двух массивов (
true
иfalse
ведет себя как0
и1
соответственно). Это дает массив, в котором у каждого класса планет есть либо случайный шанс, либо,0
если этот класс невозможен на основании входных данных. Этот массив будет использоваться в качестве весов в случайной выборкеВызов функции
выбирает одну из ячеек из массива ячеек строк (первый входной аргумент), используя вычисленный массив весов (четвертый входной аргумент). В частности, функция
randsample
автоматически нормализует весовые коэффициенты для вероятностей, а затем выполняет случайный выбор с этими вероятностями. Результатом является массив ячеек, содержащий строку. Кодиспользуется для извлечения этой строки, которая составляет вывод функции.
источник
Python 3 , 263 байта
Попробуйте онлайн!
источник
Perl 5 (
-p
), 230 байтПопробуйте онлайн!
источник
[Ice,4,5,11]
вместо[Ice,4,6,10]
и т. Д.), То вы сможете использовать<
вместо<=
и>
вместо>=
, таким образом сохраняя 2 байта. (да, это не много ...)Ним ,
294 байта314298Для цикла теперь в одной строке, нет возврата, меньше байтов для неявного типа
4 пробела удалены (спасибо Кевину )
Попробуйте онлайн!
источник
Nim
, но я думаю, что вы можете играть в гольф четыре места: одно вfor n in[(
; и три вif h>=n[1]and h<=n[2]
.05AB1E ,
7876 байтПопробуйте онлайн!
объяснение
”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
толкает строку
Gas Giant Ice Giant Gaia class Dense Atmosphere Ice Desert Iron Lava
источник
Python 3,
199194 байтаРазделение
h
на отдельные битовые маски и случайные значения случайности (см. Объяснение) экономит несколько байтов, устраняя назначениеh
и упрощаяrange()
понимание в списке.Предыдущее решение
Определяет анонимную функцию, которая принимает int и возвращает тип планеты.
Для каждого типа планеты было рассчитано 13-битное значение. Верхние 8 битов определяют битовую маску действительных значений тепла для этого типа планеты. Нижние 5 битов - это случайный шанс для этого типа планеты. Например, «класс Gaia» является допустимым типом для значений нагрева от 4 до 7, поэтому он имеет маску
0b00001111
. Это случайный шанс 10 или0b01010
. Комбинируя их, мы получаем 13-битное значение0b0000111101010
для типа «класс Gaia». 13-битные значения для каждого типа планет объединяются, чтобы получить значение дляh
(самые младшие 13 битов относятся к типу "Лед"). (Более новый ответ не объединяет эти значения).Понимание списка перебирает 13-битные значения, чтобы создать список весов, где вес - это случайный шанс, если тип планеты является правильным выбором для данного значения тепла, и ноль в противном случае. Для каждого типа планет
(h>>i&31)
извлекает случайный шанс для этого типа планет.(h>>i+n+1&1)
оценивается как 1, если тип планеты является правильным выбором для значения теплоты,n
и оценивается как 0 в противном случае.Функция библиотеки
random.choices(choices, weights)
выбирает элемент из списка вариантов на основе списка весов.источник
i+n+1
может бытьi-~n
. TIOРубин ,
214 193189 байтПопробуйте онлайн!
источник
Haskell ,
377364358318312270265262256251 байт(Я добавил разрывы строк для лучшей распечатки). Задача говорит «возврат», а не «печать», так
f
что это функция, которая возвращает случайно выбранное имя планеты вIO
монадуf :: Int -> IO String
.main
Являетсяmain = do {f 10 >>= print}
( Haskell гольф советы говорит , что это не считается). Печать(редактирует: удалил
&
базовый регистр; переместилсяmain
; изменил на четверки иunzip
переключился на охрану шаблонов и>>=
следуя советам от Laikoni , спасибо !; вместо этого реализовал подход из решения Jelly , повторяя имена; явный тип больше не нужен ; другой совет от Laikoni экономит еще 3 байта; сделал этоIO
функцией; реализовал совет из чата).Попробуйте онлайн!
источник
Java 8,
398384 байтаЭто, безусловно, можно сыграть в гольф еще немного, но вероятность в сочетании со строками не очень легко в Java.
Объяснение:
Попробуйте онлайн.
источник
Мин ,
280277 байтНачинается с высокой температуры в стеке, оставляет строку в стеке. Тот же общий процесс, что и в Python 2.
объяснение
Обратите внимание, что мин является конкатенацией
источник
PowerShell, 56 + 135 (файл CSV) + 1 (имя файла) = 192 байта
Попробуйте онлайн! (это слегка измененная версия, которая создает временный файл CSV, описанный ниже)
Импортирует файл CSV, используя
ipcsv
(сокращенноImport-CSV
) с именемa
в локальном каталоге, который содержит следующее:Это автоматически создает итеративную хеш-таблицу таких вещей:
Затем мы используем
Where-Object
(?
) , чтобы вытащить те записи , где наш вход целое число$z
является-in
диапазон$_.m
до$_.x
(то есть, он находится в тепловом диапазоне). Затем мы закачиваем их вForeach-Object
цикл (%
), который создает массив строк имен на основе случайного совпадения этих имен. Например, это создаст массив15
"Gas Giant"
строк, если это тепло соответствует. Затем мы помещаем те, вGet-Random
которые вытащим соответствующую строку с соответствующим весом.источник
PHP , 1236 байт
Попробуйте онлайн!
источник