Вступление:
Давайте посмотрим на стандартный калькулятор в Windows:
для этой задачи мы рассмотрим только следующие кнопки и проигнорируем все остальное:
7 8 9 /
4 5 6 *
1 2 3 -
0 0 . +
Вызов:
Вход:
вы получите два входа:
- Одним из них является то, что указывает на поворот с шагом 90 градусов
- Другой - это список координат, представляющих кнопки, нажимаемые на повернутом калькуляторе.
Основываясь на первом входе, мы поворачиваем указанную выше схему по часовой стрелке с шагом 90 градусов. Так что, если ввод 0 degrees
, он остается как есть; но если это вход 270 degrees
, он будет вращаться три раза по часовой стрелке (или один раз против часовой стрелки). Вот четыре возможных макета:
Default / 0 degrees:
7 8 9 /
4 5 6 *
1 2 3 -
0 0 . +
90 degrees clockwise:
0 1 4 7
0 2 5 8
. 3 6 9
+ - * /
180 degrees:
+ . 0 0
- 3 2 1
* 6 5 4
/ 9 8 7
270 degrees clockwise / 90 degrees counterclockwise:
/ * - +
9 6 3 .
8 5 2 0
7 4 1 0
Второй вход представляет собой список координат в любом приемлемом формате † . Например (2D-целочисленный массив с 0 индексами):
[[1,2],[2,3],[0,3],[1,0],[1,1]]
Вывод:
выводим как сумму, так и результат (и знак равенства =
).
Пример:
Итак, если входное значение равно 270 degrees
и [[1,2],[2,3],[0,3],[1,0],[1,1]]
, выходное значение станет:
517*6=3102
Правила вызова:
- † Входные данные могут быть в любом разумном формате. Первый вход может быть
0-3
,1-4
,A-D
,0,90,180,270
и т.д. второй вход может быть 0 индексированные 2D массив, 1-индексированных 2D массив, строка, список точечных объектов и т.д. Ваш вызов. Можно даже поменять координаты x и y по сравнению с приведенными примерами входных данных. Пожалуйста, укажите, какие форматы ввода вы использовали в своем ответе! - Вам разрешено добавлять пробелы (т.е.
517 * 6 = 3102
), если вы хотите. - Вы можете добавить завершающие нули после запятой, максимум до трех (т.е.
3102.0
/3102.00
/3102.000
вместо3102
или0.430
вместо0.43
). - Вам не разрешено добавлять круглые скобки в вывод, поэтому
(((0.6+4)-0)/2)/4=0.575
не является допустимым выводом. - Вам разрешено использовать другие символы-операнды для вашего языка. Так
×
или·
вместо*
; или÷
вместо/
; и т.п. - Поскольку калькулятор автоматически вычисляет при вводе операнда, вы должны игнорировать приоритет оператора! Таким образом
10+5*3
, результатом будет45
((10+5)*3=45
), а не25
(10+(5*3)=25
)
(т.е.10
→+
→5
→*
(теперь отображается 15 на дисплее) →3
→=
(теперь отображается ответ45
)). Помните об этом при использованииeval
аналогичных функций и полученной суммы. - Там не будет никаких тестов для деления на 0.
- Не будет никаких тестовых случаев с более чем тремя десятичными цифрами в результате, поэтому нет необходимости округлять результат.
- Не будет никаких тестовых случаев, когда несколько операндов следуют друг за другом или когда две точки следуют друг за другом.
- Там не будет никаких тестов для отрицательных чисел. Знак минус (
-
) будет использоваться только как операнд, а не как отрицательный. - Не будет никаких тестов
.##
без запятой перед запятой (т.е.2+.7
не будет допустимым тестом, но2+0.7
может быть).
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - Применяются стандартные правила вашему ответу , поэтому вы можете использовать STDIN / STDOUT, функции / метод с соответствующими параметрами, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
Тестовые случаи:
Input: 270 degrees & [[1,2],[2,3],[0,3],[1,0],[1,1]]
Output: 517*6=3102
Input: 90 degrees & [[3,1],[0,0],[0,1],[3,3],[2,0],[0,3],[0,0],[0,2],[3,0],[2,1]]
Output: 800/4+0.75=200.75
Input: 0 degrees & [[0,0],[1,0],[2,0],[3,0],[1,2],[2,1],[2,2]]
Output: 789/263=3
Input: 180 degrees & [[3,0],[1,0],[1,2],[0,0],[3,2],[0,1],[2,0],[0,3],[2,1],[0,3],[3,2]]
Output: 0.6+4-0/2/4=0.575
источник
1+-*/+-*/2
даст0.5
на Windows (10) калькулятор.[1,3],
2+.7
?Ответы:
SOGL V0.12 ,
706967 байтовПопробуйте здесь или попробуйте версию, которая принимает входные данные, указанные в тестовых примерах
использует
I
оператор SOGL , который вращает массив. Затем считывает строку в виде массива JavaScript и, где используется операция, заключает предыдущий результат в скобки, оценивает как JavaScript, а затем удаляет скобки.источник
Dyalog APL,
94888685 байтПопробуйте онлайн!
Принимает повороты как левый аргумент,
0-3
а индексы на основе 1 - как правый аргумент, как списокy x
координат, как(1 1)(2 3)(4 5)
и т. Д.Это стало довольно грязно из-за правосторонней оценки выражений в APL.
источник
C (gcc) , 282
294295296300304306 310байтовВсе оптимизации должны быть отключены и работать только на 32-битном GCC.
1 байт благодаря @Orion!
Попробуйте онлайн!
Функциональный прототип:
Формат ввода (как на TIO):
Беззвучная версия с комментариями:
Код может обрабатывать такие случаи, как
1+.7
или-8*4
.Очень грустный C не имеет
eval
😭.источник
3*-5
недействительными. Я указал это в правилах.double
сfloat
для свободного байта. Кроме того, неputc()
идентиченputchar()
? Хотя я могу ошибаться.putc
нужен второй аргумент, чтобы указать, в какой поток вы пишете?JavaScript (ES6),
162160157 байтПринимает ввод как ориентацию
o
и массив (y, x) координатa
в синтаксисе каррирования(o)(a)
.Ориентация является целым числом в [0..3] :
Контрольные примеры
Показать фрагмент кода
источник
Рубин ,
135 133132 байтаПопробуйте онлайн!
Ориентация в виде целого числа: 0 для 0 °, 1 для 90 ° и так далее.
источник
Python 3,
235234230 байтНемного некрасиво, но это работает для всех тестовых случаев, кроме первого, что, похоже, не соответствует примеру калькулятора. Я принимаю вращение за 0-3 (0-270) и умножаю на 16, чтобы сместить.
eval()
является встроенным, который пытается скомпилировать строки в виде кода и обрабатывает преобразование текстовых символов в операторы.Альтернативный метод, оказалось немного дольше, но мне очень нравится этот совет по вращению массива.
источник
Java 10,
418380 байтРешил ответить и на свой вопрос. Я уверен, что это можно сыграть еще немного, используя другой подход.
Введите как
int
(0-3
) иint[][]
(0-индексированный / такой же, как в описании вызова). Выведите какfloat
с начальным,.0
если результатом является целое число вместо десятичного числа.Объяснение:
Попробуй это здесь.
источник