Введение
Колокольня будет звонить в колокола каждый час, n
время от времени, с n
текущим часом на 12-часовых часах.
Например, колокол будет звонить 5 раз в 17:00 и 10 раз в 10:00.
задача
Задав два раза в подходящем формате, выведите количество звонков, включая время начала и окончания
Примеры
"10am-12pm"
10+11+12= 33
[01:00, 05:00]
1+2+3+4+5 = 15
[11, 15]
11+12+1+2+3 = 29
[10:00pm, 10:00am]
10+11+12+1+2+3+4+5+6+7+8+9+10 = 88
Если начало совпадает с концом, то вы просто выводите количество звонков за этот час:
[5pm, 5pm]
5 = 5
Как вы можете видеть, вы можете выбрать метод ввода, но выходные данные должны быть целыми числами (или приемлемой альтернативой), допускаются завершающие / ведущие символы новой строки и пробелы.
Заметка:
- входные данные могут охватывать от полудня одного дня до утра следующего.
- Разница между этими двумя значениями никогда не будет превышать 24 часа.
- Ввод гибкий, если вы четко указали, в каком формате он находится.
- Ваш вклад должен иметь четкое различие между AM и PM.
pm
кam
, таким образом, переходя на 2-й день.Ответы:
JavaScript (ES6),
3835 байтРекурсивно добавляет текущее количество звонков к общему количеству. Называется как
f(11,15)
; полночь представляется как24
. Я получил часть~-
уловки из ответа @ xnor's Python .Тестовый фрагмент
Показать фрагмент кода
Нерекурсивная версия (Firefox 30+), 56 байт
Эквивалент следующей функции ES6:
источник
Python 2, 46 байт
На основании моего ответа JS. Рекурсивная формула f для решения определяется так:
источник
Python 2,
Эквивалентно5954 байтаисточник
a=
часть.a=
. Это разрешено быть чистой лямбдой.y%24
.05AB1E , 13 байтов
С большой помощью от Эминьи .
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
Python, 42 байта
Рекурсивная функция , которая принимает два числа от 0 до 23. Расширение
~x
«с до-x-1
даетВыражение
(a+1)%12+1
преобразует время в число колец1
в12
. Затем нижняя граница увеличивается по модулю 24 и добавляется функция для рекурсивного результата. То есть, если текущий час не является последним часом, в этом случае мы останавливаемся.Вместо этого я пытался написать чисто арифметическое решение, но пока что нашел только длинные и грязные выражения.
источник
or
. Хороший!Haskell,
4843 байтаИспользование
startHour % endHour
с обоими входами, представленными в 24-часовом формате.edit: добавлено улучшение @ xnor, экономия 5 байт
источник
e
времяe<s
, вы можете отфильтровать диапазонs%e=sum[mod(x-1)12+1|x<-[s..e+24],x<=e||s>e]
. Затем он сохраняет байт для смещения х вниз 1:s%e=sum[mod x 12+1|x<-[s-1..e+23],x<e||s>e]
.C #, 73 байта
Допустимый ввод: целые числа в диапазоне [0,23].
Это решение не использует LINQ.
Полная программа с тестовыми примерами:
источник
Желе ,
17 16 1514 байтTryItOnline
Как?
источник
MATL , 14 байтов
Формат ввода такой же, как в третьем примере в задании, то есть два числа в 24-часовом формате.
Попробуйте онлайн!
объяснение
Возьмем входные данные
22
,10
как пример.источник
PHP, 90 байт
Формат ввода '[1,24]' от 1 до 24
В этом вызове я ненавижу, почему PHP проигрывает против других языков. Я предпочитаю показывать все свои идеи. Может быть, другой PHP Crack найдет более короткое решение.
99 байт
113 байт путь с мин и макс
хорошо, эта сумасшедшая идея работает с массивом 149 байт заполняет массив,
$y[0]
и$y[1]
если,$_GET["b"][0]<=$_GET["b"][1]
если$y[1]
это,null
мы можем суммировать этот массивarray_diff_key($y[0],array_slice($y[0],$b[1],$b[0]-$b[1]-1,1))
Это может быть гольф до 124 байт
Теперь на этом этапе мы можем уменьшить массив всего двумя целыми числами. 101 байт. Сделать 2 суммы
$x[0]
и$x[1]
list($f,$g)=$_GET[b];
если
$v=($f>$g
затем добавить значение к$x[$i<$f&$i>$g]
другому добавить значение к$x[$i>=$f&$i<=$g]
выходу будет найден в каждом конкретном случаеecho$x[!$v];
После этого я нашел способ рассчитать результат прямо 112 байтов
рекурсивный 103 байта
источник
PHP, 69 байт
Извлечение списка было вдохновлено ответом Йорга Хюльсермана, но все остальное сходство является результатом конвергентной эволюции, и потому что он намного короче и условия в цикле достаточно разные, я публикую его как отдельный ответ.
Принимает ввод как 24-часовой (хорошо с 0 или 24). Беги как:
источник
$i>$a?24:0
имеет ту же длину, что и($i>$a)*24
wiki.php.net/rfc/short_list_syntax. Возможно, вы захотите использовать синтаксис короткого списка, новый в 7,1[$x,$i,$a]=$argv;
-2 байта, прежде чем я не проверил, что я не буду его использовать. Теперь я ненавижу меня больше, что нашел не таким.Java,
72717876 байтРедактировать :
e
/clock
инициализирован.Ungolfed:
источник
a
, иd
, иb
? Полный метод имеет смысл, но если я что-то сильно упускаю, думаю, вам нужно еще раз взглянуть на свою лямбду в гольфе и попытаться ее выполнить. Для дальнейшего игры в гольф:(time+1)
может стать++time
.a+=a?
должно бытьb+=a?
. Кроме того, вы можетеwhile
сыграть в гольф на 2 байта, превратив его в тело без телаfor
:(a,b,c,d)->{int e;b+=a?12:0;d+=c?12:0;for(;b!=d;e+=b%12,b=++b%24);return e;}
QBIC ,
9047 байтовИтак, вот ответ, печатающий только общее количество звонков:
Вход находится в диапазоне
1-24
;a
иb
являются входами (::
в коде),c
отслеживает am / pm,d
является общим количеством звонков. Когда мы отсчитали все часы,_Xd
программа завершает работу, печатаяd
в процессе.Хорошо, я неправильно понял вопрос и подумал, что
1+2+3...=
текст является частью вывода, поэтому я написал это:Теперь я пойду код правильный ответ ...
источник
Pyth - 11 байт
Тестовый пакет .
источник
23, 1
выводит,144
когда должен выводить24
. (Такой случай, конечно, должен быть на тестах!)C #, 76 байт
источник
a=23
и,b=0
кажется, самый очевидный пример.Perl, 36 байт
Включает +1 для
-p
Укажите время начала и окончания в 24-часовом формате в строке на STDIN:
toll.pl
:источник
Java 7, 64 байта
Рекурсивный метод, основанный на ответе @ETHproductions на Python 2 . Использует 24-часовой вход часов.
Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
Пакет,
16891 байтИзменить: 77 байт, переключившись на закрытую форму для ответа.
%1
и%2
два параметра командной строки@
Отключить пакетный режим по умолчанию, который должен повторить командуcmd/c
Дурак Пакетный в печать сразу результат расчетаset/a
Выполнить числовой расчетx=(%1+23)%%24,
Нормализовать начальный час, указав количество часов с 1 утра (1 вечера также будет работать, но 11 не короче 23)y=x+(%2+24-%1)%%24,
Нормализуйте конечный час так, чтобы он опережал начальный час, при необходимости переходя на следующий деньz=y%%12+1,
Количество колоколов, выпущенных в последний час(y/12-x/12)*78+
Количество звонков из-за дополнительных полдняz*~-z/2-
Количество звонков от 1 часа до часа окончания включительно(x%%=12)
На один меньше количества колоколов, выпущенных в начальный час*-~x/2
Количество звонков, которые были бы сбиты с 1 часа до начального часа, но не включая начальный часисточник
C, 56 байт
источник
> <> , 48 + 2 = 50 байтов
Ожидается, что вход будет присутствовать в стеке при запуске программы, поэтому +2 байта для
-v
флага. Входные данные представляют собой два целых числа, указывающие час на 24-часовых часах, поэтому10am - 10pm
будут заданы как10 22
.Попробуйте онлайн!
источник
Cubix ,
4544 байтаСохранено 1 байт благодаря @ETHproductions
Мой первый набег в Cubix ...
Или в кубе:
Вы можете попробовать это в онлайн переводчике . Ввод в 24-часовом формате, с первым временем окончания. Например, с 5 вечера до 1 утра вход должен быть
1 17
.Предыдущая версия, 45 байт:
источник
)$424tU4OI0Iuq;;-!^;^%&21u+rr;ss!;sqU>&%r$@;
Qbasic, 112 байт
источник
Python, 73 байта
Было бы гораздо короче , если бы мы не должны поддерживать
pm
вam
. Я использую рекурсию, чтобы поддержать это.Попробуйте онлайн
Без поддержки
pm
доam
(45 байт):источник