Вам будет дано имя одного из 20 самых больших объектов в Солнечной системе. Ваша задача - вернуть приблизительный радиус, выраженный в километрах.
Это вызов кода, где ваш счет состоит из длины вашего кода (в байтах), умноженной на коэффициент штрафа , основанный на вашем худшем приближении. Поэтому выигрывает самый низкий балл .
«Пока мы путешествуем по вселенной» - последняя строчка песни Planet Caravan от Black Sabbath , также позже охваченной Pantera .
Объекты Солнечной системы
Источник: Википедия
NB: ранг дан только для информации. Ввод - это имя объекта.
n | Object | Radius (km)
----+----------+-------------
1 | Sun | 696342
2 | Jupiter | 69911
3 | Saturn | 58232
4 | Uranus | 25362
5 | Neptune | 24622
6 | Earth | 6371
7 | Venus | 6052
8 | Mars | 3390
9 | Ganymede | 2634
10 | Titan | 2575
11 | Mercury | 2440
12 | Callisto | 2410
13 | Io | 1822
14 | Moon | 1737
15 | Europa | 1561
16 | Triton | 1353
17 | Pluto | 1186
18 | Eris | 1163
19 | Haumea | 816
20 | Titania | 788
Или как дружественные списки копирования-вставки:
'Sun', 'Jupiter', 'Saturn', 'Uranus', 'Neptune', 'Earth', 'Venus', 'Mars', 'Ganymede', 'Titan', 'Mercury', 'Callisto', 'Io', 'Moon', 'Europa', 'Triton', 'Pluto', 'Eris', 'Haumea', 'Titania'
696342, 69911, 58232, 25362, 24622, 6371, 6052, 3390, 2634, 2575, 2440, 2410, 1822, 1737, 1561, 1353, 1186, 1163, 816, 788
Твой счет
Пусть будет ожидаемым радиусом объекта и пусть будет ответом вашей программы для этого объекта. п
Тогда ваш счет определяется как:
где - длина вашего кода в байтах.
Пример:
Если размер вашего кода составляет байт, а ваше худшее приближение - на Луне с расчетным радиусом км вместо км, тогда ваш результат будет:
Чем ниже, тем лучше.
Рекомендуемый заголовок для вашего ответа:
Language, 100 bytes, score = 302
Вы можете использовать этот скрипт для вычисления вашего счета (первая строка = длина кода, следующие 20 строк = ваши результаты, от Солнца до Титании).
правила
- Вы можете взять имя объекта в полном нижнем регистре, в верхнем регистре или точно так же, как описано выше (регистр заголовка). Другие смешанные случаи не допускаются.
- Ввод будет гарантированно одним из 20 возможных имен.
- Вы можете вернуть либо целые числа, либо числа с плавающей запятой. В обоих случаях штраф должен быть рассчитан непосредственно с этими значениями (не округленные значения в случае с плавающей запятой).
- Вы должны вернуть положительные значения.
- Пустые программы не допускаются.
источник
7512
для всех тестовых случаев. Я посмотрю, погрузлюсь ли я в создание решения MathGolf в ближайшее время, но это будет трудно обойти 05AB1E.Ответы:
PowerShell , 3 байта, оценка 3637
Попробуйте онлайн!
Очень наивная, скучная, реализация; просто возвращает
20000
независимо от ввода. Эксперименты с такими вещами, как специальный случай солнца или использование значений с плавающей точкой вместо2
всех, привели к худшим оценкам, потому что длина кода увеличилась достаточно, чтобы компенсировать любые выгоды от сравнения размеров.источник
Желе , 34 байта, оценка = 37
Вход вводится в верхнем регистре, выход - степень 1,1 с наименьшей ошибкой.
Попробуйте онлайн!
Как это устроено
источник
Java (JDK) , 90 байт, оценка = 97
Попробуйте онлайн!
кредиты
String
вместо жесткого кодирования их в явномint
массиве.источник
(...-7)
: непечатный символ(char)0
пуст, поэтому мне пришлось что-то добавить. Я первый попробовал9
и8
быть одной цифры, но9
дал конечно закладки, требуя мультипликатор\t
(2 байта каждого), и8
дал ошибку о неэкранированных символах используются.*100-700
и играя со значениями в виде строки и этими двумя числами, но это лучшие, на самом деле, некоторые значения могут уменьшить байт считать, но тогда оценка остается прежней. Таким образом, случайное выявление сделало (один из) лучший случай;)Wolfram Language
114 103 97 88 8682 байта. оценка =114 103 97 89 8783 баллаПо крайней мере, 6 баллов благодаря
Dennis
, еще несколько благодаряlirtosiast
и еще 6 благодаряuser202729
.Хотя Mathematica может получать данные о солнечной системе (а также много дополнительных астрономических данных), необходимы некоторые незначительные изменения, как описано ниже.
Interpreter[#,"AstronomicalObject"]&
вернет сущность (то есть машинно-вычисляемый объект), связанную с термином, представленным#
.EntityValue[AstronomicalObject[],"Radius"]
возвращает радиус объекта в милях. В случае «Haumea» возвращается значение 816,27 (т.е. 507 * 1,61).Умножение радиуса на
1.61
конвертируется из миль в км. Десятичные значения, а не целые числа, приводят к ошибке менее 1%, даже в самом крайнем случае.[[1]]
возвращает величину без единицы, км. Позже это было изменено на#&@@
, давая тот же результат.источник
Python 3 , оценка 95, 95 байт
Попробуйте онлайн!
Python 3 , оценка 133, 133 байта
Попробуйте онлайн!
источник
Powershell,
150141 байт, оценка163153Попробуйте онлайн!
Тестовый скрипт:
Выход:
Объяснение:
end of line mode
только НЧ.Пример:
Powershell, 178 байт, оценка 178
источник
05AB1E , оценка
1006660 (1006156 байт )Порт Java-ответа @ OlivierGrégoire , так что если вам понравился этот первый ответ, обязательно добавьте его в свой голос!
Ввод в заглавном.
Проверьте все контрольные примеры.
05AB1E , оценка 100 (100 байт )
Ввод в нижнем регистре. Выводит точный радиус, поэтому штраф не добавляется.
Проверьте все контрольные примеры.
Объяснение:
Посмотрите этот совет 05AB1E (разделы « Как сжать большие целые числа?» И « Как сжать строки, не являющиеся частью словаря?» ), Чтобы понять, как работает сжатие.
Я создал 70-байтовую альтернативу, которая отображала бы солнце600,000
; [Юпитер, Сатурн] в60,000
; [Уран, Нептун] в30,000
; [земля, венера] к6,000
; [марс, ганимед, титан, ртуть, каллисто] к3,000
; [Луна, Европа, Тритон, Плутон, Эрида]1,500
; и [haumea; titania] к750
. К сожалению, он получил оценку 117. Я посмотрю, смогу ли я получить ниже 100 с альтернативным подходом позже.источник
Mathematica, 57 байт, оценка =
6258-4 байта / оценка благодаря lirtosiast !
Просто делает Wolfram Alpha поиск среднего радиуса.
источник
WolframAlpha
функция использовалась как минимум четыре раза ...Желе , 28 байт, оценка = 31
При этом используется настраиваемая встроенная функция хэширования, которую я добавил в Jelly по предложению @ lirtosiast.
Входные данные указаны в заглавной букве, выходные данные - степень 1.1 с наименьшей ошибкой.
Попробуйте онлайн!
Как это устроено
Этот ответ состоит из двух частей.
“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘ḥ
используется новая встроенная функция для сопоставления каждого из 20 возможных входов с 15 различными целыми числами.1.1*
поднимает 1,1 до вычисленной мощности.“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘
является буквальным; каждый символ без кавычек заменяется его индексом на основе 0 в кодовой странице Jelly, приводя к .Встроенное хэширование[95,95,169,55,242] 1 376510639244
ḥ
сначала отображает в целое число, увеличивая каждое число, затем обрабатывая результат как целое целое число из 250 цифр и добавляя . Это дает .Путем деления этого числа на половину и получения результата до мы получим последовательность , которая имеет прямые различия .0 [376510639244,188255319622,94127659811,47063829905,…,5,2,1,0] [188255319622,94127659811,47063829906,…,3,1,1]
Затем мы генерируем 64 64-битных целых числа, применяя SHAKE256-4096 к строковому представлению внутреннего представления
ḥ
правого аргумента, а затем разбивая получившиеся 4096 битов на 64 64-битных блока.ḥ
теперь вычисляет скалярное произведение из 39 разностей и первых 39 сгенерированных 64-битных целых чисел по модулю . Это дает целое число в .Список имеет длину 15, поэтому мы умножаем сгенерированное целое число на 15 и принимаем 64 выше. биты результата. Это дает целое число в , которое мы используем для индексации в списке.[82,85,117,141,78,77,92,115,79,83,74,106,91,70,76] [0,15)
Чтобы найти подходящую конфигурацию хэша, я использовал брутфорсер в C, который является частью репозитория Jelly .
источник
Python 2 , 155 байт, оценка = 155
Попробуйте онлайн!
Удивительно хорошо для этого ленивого решения ... будет также смотреть на улучшение. ;-)
источник
Japt , 86 байт, оценка = 94
Попробуйте все входные данные , рассчитайте оценку или проверьте наивысшую ошибку
Очень похоже на оригинальный ответ Оливье. Ввод все строчные.
После различных улучшений выходных значений наибольшая ошибка на текущий момент составляет чуть более 4%.
Объяснение теперь, что все немного стабильнее:
Строка для имен
sujusaurneeavemagatimecaiomoeutrplerha
сжимается с использованием встроенного сжатия Japt. Числа, представляющие радиусы, рассчитываются так:источник
Japt,
777675 байт, оценка = 75Первый проход в этом; Я хотел попробовать решение 0 штрафа, чтобы дать себе базовый уровень для отработки. Вернусь к нему завтра, чтобы посмотреть, какие улучшения могут быть внесены, надеемся, все еще за 0 штрафа.
Ввод нечувствителен к регистру.
Попробуйте или проверьте все входы
"..."
Представляет собой строку , содержащую много непечатных. Кодовые точки:Чтобы дать краткое объяснение: строка разбивается на куски по 2 символа. Затем мы индексируем этот массив, используя часть формулы ovs плюс некоторую индексацию, а затем сопоставляем 2 символа с их кодовыми точками.
54 байта, оценка = 58
Порт решения Оливье .
Проверьте все входы
источник
%24
:-)Ruby , 105 байт, оценка 109
Попробуйте онлайн!
Если мы разделим 700000 на радиусы, мы получим последовательность, которая увеличивается линейно (хотя и довольно беспорядочно). Приращения в приведенной ниже таблице могут быть аппроксимированы значениями символов ASCII. Проблема этого подхода в том, что он требует, чтобы входные данные были декодированы до значения, которое упорядочивает разные имена по размеру.
Незначительная проблема заключается в том, что разница между Эрис и Хаумеа довольно велика. Три символа
~~d
необходимы для кодирования этого приращения только в формате ASCII. Строка «планета-индекс» содержит два пространства «планеты-призрака» для заполнения индекса.источник
T-SQL,
203 202 201196 байт, оценка =217 216 212208Разрывы строки предназначены только для удобства чтения.
Ввод берется с помощью уже существующей таблицы I колонке с VARCHAR против , в соответствии с нашими стандартами IO .
Присоединяет входную таблицу к таблице в памяти на первых двух символах и возвращает оставшиеся цифры x100.
Относится к «Титану» как к особому случаю использования
IIF
.РЕДАКТИРОВАТЬ : 1 байт (и 1 балл) сохранены с помощью
STUFF
удаления первых двух символов вместоSUBSTRING
. Спасибо, t-clausen.dk!РЕДАКТИРОВАТЬ 2 : Я хотел посмотреть, что произойдет, если я попытаюсь сохранить еще один байт, умножив каждое значение поиска на 99 вместо 100, и обнаружил, к моему удивлению, что это на самом деле повысило точность (наименее точной оценки) !.
Это привело меня к тестированию методом проб и ошибок, а также к некоторым причудливым таблицам данных «что если» в Excel, где я нашел оптимальное решение с использованием множителя 89 (который, конечно, изменил все мои сохраненные значения).
Таким образом, хотя это спасает меня только на один байт, оно фактически улучшает мой счет на 4,6 от моего предыдущего решения.
РЕДАКТИРОВАТЬ 3 : Поиск выше, а не ниже, и нашел еще лучший коэффициент умножения, 198 . Значения остаются достаточно точными, сокращая мою сохраненную строку на несколько символов, что улучшает мой счет.
источник
PowerShell , 203 байта, оценка 203
Попробуйте онлайн!
Очень похоже на ответ Оливье, теперь, когда я его вижу, но развивалось независимо.
источник
Древесный уголь , 101 байт, оценка = 101
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Возьмите 1-й и 11-й символ (циклически) входной строки и объедините их.
Найдите их в строке,
SuJiSrUuNtEEVVMrGnTTMcClIIMoEpToPPEiHeTa
разбитой на пары символов.Разбейте строку
m.w'fv&J|\"l|\"e1 c& _c Ca ;e ;* 9a 9C 31 2; 0I .7 ,N ,7 (X (<
на группы по три символа и возьмите соответствующую группу.Декодируйте результат как число base-95, используя печатный набор символов ASCII в качестве цифр. Пример:
Io
11-й символ - этоI
, поэтому мы смотрим вверхII
и находим, что это 13-й по величине объект, и его размер31
соответствует19 * 95 + 17 = 1822
.источник
Swift 4 , 225 байт, оценка = 241
Вероятно, удастся сыграть в кучу больше (может быть, в районе «Ga-Me-Ca»?), Но Swift используется не часто (по какой-то причине).
и без золота
Попробуйте онлайн!
Я пробовал разные «размеры клавиш» для карты, но, конечно, 1 имеет много столкновений, и использование трех символов не дает мне
i=="Titan" ?2575:
17 символов, так как есть «Io» для управления (и это займет более 3 символов, Думаю).источник
JavaScript (ES6), 152 байта, оценка = 163
Ну, это довольно стандартное решение, но я все равно получил удовольствие!
Моя оценка:
Попробуйте онлайн!
источник
ЛОЖЬ , 152 байта, оценка = 563
Ленивый ответ, используя длину слова и первые буквы, но я оправдываюсь тем, что я использую странный язык
Попробуйте онлайн! (скопируйте, вставьте код, нажмите «Показать» и затем запустите)
Мои результаты:
источник
C (gcc) , 118 байт, оценка = 135
Попробуйте онлайн!
счет
Наезжать
Имя объекта превращается в односимвольный хеш через громоздкий процесс
чье раздувание указывает на "Титан" / "Титания" в качестве основных преступников. Было рассмотрено включение последнего символа в хеш, но для этого по-прежнему требуется
strlen()
символ C. В первом поиске хеш-символа выполняется поиск в строке хеш / данных. Найденный следующий символ берется и используется для аппроксимации радиуса рассматриваемого объекта.Символ данных содержит смещенный масштабированный натуральный логарифм радиуса. Генерируется так:
Шкала была выбрана благодаря высокотехнологичным методам проб и ошибок, а также благодаря смещению значения в печатный диапазон ASCII, избегая при этом обратной косой черты. Некоторая перестановка объектов в строке была необходима из-за некоторых коллизий хеша / данных.
источник
Python 2 , 89 байт, оценка = 234
Попробуйте онлайн!
Большинство опубликованных ответов, похоже, использовали стратегию «кодирования / декодирования». Я задавался вопросом, насколько хорошо я мог сделать, оценивая диаметр небесных тел, используя простое уравнение. Это было забавное упражнение, но умеренная экономия байтов более чем компенсирована штрафом за точность.
Ядром этого решения является уравнение оценки:
где х - это двойной порядок ранга радиуса тела.
Я генерирую значение x на основе входной строки, используя модификацию @Erik решения Python 2 для Outgolfer. Я сохранил несколько байтов в его коде, переписав мои уравнения для работы с [2..40] вместо [1..20].
Код для генерации порядковых рангов занимает более 2/3 байтов всего решения. Если у кого-то есть более компактный способ получения рангов, это решение может быть сокращено в дальнейшем. Из-за потери точности (около 2,6), оценка немного улучшится.
Генерация уравнения
Я использовал статистические методы для поиска простых уравнений, чтобы оценить размер каждого тела на основе его ранга. Частично развивая идеи решения Ruby @Level River St и обобщая, я остановился на уравнениях вида:
Работая в R, я использовал линейные модели на логах радиусов для разработки начальных оценок, а затем использовал нелинейную оптимизацию, заполняя оптимизацию результатами линейных моделей, чтобы искать решения, которые минимизировали функцию штрафа, указанную в проблема.
Расчетное значение A в приведенном выше уравнении составляет семь цифр, поэтому я искал простое выражение, чтобы сохранить пару байтов. Я искал выражения формы
для двухзначного x и однозначного y (всего пять байтов, сохраняющих два байта или около пяти точек с учетом штрафа), которые не слишком отличались от оптимального значения A и не сильно увеличивали штраф, и закончились с (иначе необъяснимо):
источник
TI-BASIC (TI-84), 285 байт, оценка = 285
Простая программа «индекс в строке для списка». Можно играть в гольф дальше.
Входные данные
Ans
и имя одного из объектов в верхнем регистре.Выход находится
Ans
и автоматически распечатывается.Пример:
Объяснение:
(Список радиусов и строка имени были сокращены для краткости.
...
Используется для обозначения остальной части списка / строки.)Визуальная модель:
источник