Используя следующую таблицу ( источник ), напишите некоторый код, который берет имена двух планет и возвращает расстояние между ними:
+-------------------+---------------+
| Planets | Distance (km) |
+-------------------+---------------+
| Mercury -> Venus | 50290000 |
| Venus -> Earth | 41400000 |
| Earth -> Mars | 78340000 |
| Mars -> Jupiter | 550390000 |
| Jupiter -> Saturn | 646270000 |
| Saturn -> Uranus | 1448950000 |
| Uranus -> Neptune | 1627450000 |
| Neptune -> Pluto | 1405380000 |
+-------------------+---------------+
Примеры, ввод, затем вывод:
Mercury, Mars
170030000
Neptune, Jupiter
-3722670000
Earth, Earth
0
Обратите внимание на отрицательный знак, поскольку Юпитер стоит перед Нептуном. Они также являются целыми числами.
Плутон не должен быть включен (в основном из-за странной орбиты, из-за которой трудно определить расстояние - данное расстояние - мой собственный расчет, но поскольку Плутон теперь всем известен ...).
Под расстояниями между планетами я подразумеваю орбиты - я не ожидаю даты и не знаю, где они находятся.
Это код гольф, самый короткий код выигрывает.
Mercury, Mars -> 170030000.0
?Ответы:
CJam,
545144 байтаПопробуйте онлайн в интерпретаторе CJam .
идея
Мы используем простую функцию хеширования, чтобы идентифицировать все восемь планет. Рассматривая каждое имя как массив его кодовых точек, преобразовывая их из базы 26 в целое число и получая результат по модулю 93, а затем по модулю 8, Меркурий , Венера , Земля и т. Д. Отображаются в 2 , 4 , 0 , 1 , 3 , 5. , 6 и 7 .
Теперь мы выбираем точку, которая находится на 320 000 км позади Нептуна, и рассчитываем расстояния всех восьми планет до этой точки. После отбрасывания четырех конечных нулей и изменения порядка планет, чтобы они соответствовали 8 индексам сверху, мы получаем массив
который, если мы закодируем каждое целое число в базе 70, даст следующее:
Помня, что две соседние цифры
(A B)
могут быть заменены на((A-1) (B+70))
, мы можем изменить массив сверху, чтобы все целые числа могли быть закодированы как печатные символы ASCII:Код
источник
Python 2,
149147142138128123119 байтПросто используйте простой поиск, чтобы выяснить, какие расстояния использовать :) Это определяет анонимную функцию, поэтому для ее использования вам нужно дать ей имя.
Спасибо Sp3000 за идеи, которые сэкономили кучу байтов!
Отступы правильно и немного загнут для удобства чтения:
Звоните так:
источник
Пролог,
190174151 байтСпасибо Fatalize за руководство.
источник
s(A, B, R)
а не писатьR
? Для выходных данных ничего не указано, поэтому предикатный возврат должен быть в порядке.g
дляg(A,X):-sub_atom(A,2,2,_,B),member(B:X,[rc:0,nu:5029,rt:9169,rs:17003,pi:72042,tu:136669,an:281564,pt:444309]).
и удаления всех фактов для планет. Это менее круто, чем,=..
но короче получить сопоставление ключ-значениеJavaScript (ES6),
115110 байтЭто анонимная функция, поэтому вам нужно будет сохранить ее в переменной (
f=...; f("Earth", "Mercury")
) или использовать в качестве выражения в скобках ((...)("Earth", "Mercury")
.Эта грязная строка - это первые две буквы каждой планеты, за которыми следует расстояние от планеты до Меркурия (деленное на 10000 для экономии места). Внутренняя функция
g
делает следующее:k
),k[0]+k[1]
),Ea(\d*)
),1e4
) и возвращает результат.Вычитая одно расстояние Меркурия из другого, мы получаем расстояние между планетами.
источник
btoa
имеют кодовые точки ниже 256, поэтому ISO 8859-1 будет кодировать каждый символ, используя один байт.Java,
274272264 байта (включая Плутон!)Ввод, вывод:
Размещено и с вкладками:
источник
int
и иint[]
в одну строку, если массив идет последним: Likeint i=0,j=1,k[]={};
10000
на1e4
.e > w
вы можете обрезать символ, используя операторwhile(e-->w)
for(;e--!=w;)
Python, 118 байт
n
это функция, которая возвращает расстояние от Меркурия.Строка
"VeEaMaJuSaUrNe"
- это первые два символа всех названий планет, кроме Меркурия .find
не может найти Меркурий, поэтому вернет -1. -1/2 по-прежнему равно -1, так что это последний элемент в кортеже, который равен 0.Простой тестовый код:
источник
APL,
979585 байтЭто создает безымянную двоичную функцию, которая принимает исходную планету в качестве левого аргумента и целевую планету в качестве правой.
Вы можете попробовать это онлайн !
источник
J-- , 226 байт
Я не думаю, что это считается, так как я создавал язык, пока вопрос был задан, но это был в основном тест на то, насколько маленьким я мог сжать код Java. Это полностью и полностью основано на ответе DeadChex .
Вот как это использовать:
источник
Pyth -
5953 байтаКодирует расстояние в кодовых точках Юникода.
Поиск имени довольно крутой, потому что он зацикливается. Спасибо @Dennis за предложение индекс 14 в качестве поиска без столкновений!
Попробуйте здесь онлайн .
источник
Баш, 140 байт
источник
CoffeeScript,
183180 байтUnminified:
источник
Рубин, 168 байт
Он разработан как скрипт для запуска из командной строки, поэтому использует
ARGV
. Беги какисточник
Haskell,
160158157 байтПример использования:
Как это работает: я определяю новый тип данных,
P
где имена конструктора - это имена планет. Я также поместил его вEnum
класс, то есть я получаю сопоставление с целыми числами черезfromEnum
(в порядке определения, начиная сMercury
->0
). Это целое число может использоваться в качестве индекса для списка расстояний.Изменить: @Kritzefitz нашел два байта для сохранения и @Alchymist еще один. Благодарность!
источник
fromEnum x
и сохранить два байта.Юлия,
206203190 байтовЭто создает безымянную функцию, которая принимает две строки и возвращает целое число. Чтобы назвать это, дать ему имя.
Ungolfed + объяснение:
источник
Джава,
257228 байтstatic long d(String...s){...}
решает проблему. Ввод требует, чтобы имена планет точно совпадали с именами констант перечисления. Мне нравится, как Java предоставляет метод преобразования строк в enum для меня <3Использование:
Z.d("Mercury","Pluto")
возвращается5848470000
Z.d("Pluto","Mercury")
возвращается-5848470000
Z.d("Uranus","Neptune")
возвращается1627450000
Z.d("Mars","Pluto")
возвращается5678440000
источник
Макропроцессор C (gcc) , 146 байт
Попробуйте онлайн!
источник