Скільки разів дзвенить дзвіниця?


24

Вступ

Дзвіниця дзвонить дзвіночками щогодини, nраз, nпоточною годиною є годинник 12 годин.

Наприклад, дзвін буде дзвонити 5 разів о 17 вечорі, а 10 разів - о 10 ранку.

Завдання

Дано два рази у відповідному форматі, виведіть кількість разів, коли дзвонить дзвінок, включаючи час початку та закінчення

Приклади

"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.

2
Ми обираємо власний метод введення, чи він повинен підтримувати всі згадані?
анонімний2

1
Ви можете обрати метод введення
Shaun Wild

1
Вам слід зробити більш зрозумілим, що вхід може переходити pmдо am, таким чином переходячи на другий день.
mbomb007

3
Чи буде півночі присвоєно 0 або 24?
xnor

4
Ми рекомендуємо використовувати « Пісочницю» для вирішення будь-яких проблем із проблемами, перш ніж вони будуть розміщені на головному сайті.
Мего

Відповіді:


12

JavaScript (ES6), 38 35 байт

f=(x,y)=>~-x%12-~(x-y&&f(x%24+1,y))

Рекурсивно додає поточну кількість дзвонів до загальної кількості. Називається як f(11,15); опівночі представлений як 24. Я отримав частину ~-хитрості з відповіді Python @ xnor .

Фрагмент тесту

Нерекурсивна версія (Firefox 30+), 56 байт

(x,y,t=0)=>[for(_ of Array((y-x+25)%24))t+=x++%12||12]|t

Еквівалентна наступній функції ES6:

(x,y,t=0)=>[...Array((y-x+25)%24))].map(_=>t+=x++%12||12)|t

7

Python 2, 46 байт

f=lambda x,y:(x%12or 12)+(x-y and f(-~x%24,y))

На основі моєї відповіді JS. Рекурсивна формула f для рішення визначається так:

  1. Почніть з двох цілих чисел x і y .
  2. Візьміть x mod 12 ; якщо це 0, візьміть 12 .
  3. Якщо x! = Y , додайте результат f (x + 1 mod 24, y) .

6

Python 2, 59 54 байт

a=lambda x,y:sum(1+i%12for i in range(x-1,y+24*(x>y)))
Дорівнює
summ=0
if start > end:
    end+=24
for hour in range(start-1,end):
    summ +=1+hour%12
print summ

3
Я думаю, що вам не потрібна a=частина.
акроліт

@daHugLenny це має бути повноцінною (корисною) функцією
Rod

(y + 24)% 24 - це саме y
Vladimir Cravero

1
@Rod Вам не потрібно a=. Це дозволяється бути чистою лямбда.
Yytsi

1
@VladimirCravero Звичайно, ні. Це те саме, що y%24.
Erik the Outgolfer


3

Пітон, 42 байти

f=lambda a,b:~-a%12-~(b-a and f(-~a%24,b))

Рекурсивна функція, яка займає два числа від 0 до 23. Розширення ~x's на -x-1дає

f=lambda a,b:(a-1)%12+1+(b-a and f((a+1)%24,b))

Вираз (a+1)%12+1перетворює час до числа кілець 1в 12. Потім нижня межа збільшується по модулю 24 і додається функція для рекурсивного результату. Тобто, якщо поточна година не є кінцевою годиною, тоді ми зупиняємось.

Натомість я намагався написати чисто арифметичне рішення, але поки що я знаходив лише довгі і безладні вирази.


Ах, я розумію: це в основному та сама техніка, що і моя відповідь Python, але з дійсно розумним способом подолати or. Хороший!
ETHproductions

3

Haskell, 48 43 байт

s%e=sum[mod x 12+1|x<-[s-1..e+23],x<e||s>e]

Використання полягає в тому startHour % endHour, що обидва введення подано у форматі 24 години.

редагувати: додано вдосконалення @ 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].
xnor

3

C #, 73 байти

a=>b=>{int x=0;for(;;){x+=(a%=24)>12?a-12:a<1?12:a;if(a++==b)return x;}};

Допустимий вхід: цілі числа в діапазоні [0,23].

Це рішення не використовує LINQ.


Повна програма з тестовими кейсами:

using System;

namespace HowManyTimesABellTowerRings
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,Func<int,int>>f= a=>b=>{int x=0;for(;;){x+=(a%=24)>12?a-12:a<1?12:a;if(a++==b)return x;}};

            Console.WriteLine(f(10)(12));   //33
            Console.WriteLine(f(1)(5));     //15
            Console.WriteLine(f(11)(15));   //29
            Console.WriteLine(f(22)(10));   //88
            Console.WriteLine(f(10)(10));   //10
            Console.WriteLine(f(11)(10));   //156
            Console.WriteLine(f(0)(23));    //156
            Console.WriteLine(f(22)(1));    //34
        }
    }
}

3

Желе , 17 16 15 14 байт

>×24+⁹⁸r’%12‘S

TryItOnline

Як?

>×24+⁹⁸r’%12‘S - Main link: a, b (24 hr integers, midnight may be 0 or 24)
>              - a>b? (1 if true, 0 if false)
 ×24           - times 24 (24 if a>b, else 0)
    +⁹         - add to b (b+24 if a>b, else b)
      ⁸        - a
       r       - range(a, b+24 or b) ([a,a+1,...,b+24 or b])
        ’      - decrement (vectorises) ([a-1,a,...,b+23 or b-1])
         %12   - mod 12 (vectorises) (number of tolls at each occurrence - 1)
            ‘  - increment (vectorises) (number of tolls at each occurrence)
             S - sum

2

MATL , 14 байт

yy>24*+&:12X\s

Формат введення такий, як у третьому прикладі виклику, тобто два числа у 24-годинному форматі.

Спробуйте в Інтернеті!

Пояснення

Візьміть входи 22, в 10якості прикладу.

yy      % Take two inputs implicitly. Duplicate both
        %   STACK: 22, 10, 22, 10
>       % Is the first greater than the second?
        %   STACK: 22, 10, 1
24*     % Multiply by 24
        %   STACK: 22, 10, 24
+       % Add
        %   STACK: 22, 34
&:      % Binary range
        %   STACK: [22 23 24 25 26 27 28 29 30 31 32 33 34]
12X\    % Modulo 12, 1-based
        %   STACK: [10 11 12 1 2 3 4 5 6 7 8 9 10]
s       % Sum of array
        %   STACK: 88
        % Implicitly display

2

PHP, 90 байт

Формат введення '[1,24]' від 1 до 24

У цьому виклику я ненавиджу, чому PHP програє проти інших мов. Я вважаю за краще показати всі свої ідеї. Можливо, інший PHP Crack знайде коротше рішення.

<?list($f,$g)=$_GET[b];for($i=$f;$i-1!=$g|$f>$g&!$c;$s+=$i++%12?:12)$i<25?:$c=$i=1;echo$s;

99 байт

<?for($i=($b=$_GET[b])[0],$c=($d=$b[1]-$b[0])<0?25+$d:$d+1;$c--;$s+=$i++%12?:12)$i<25?:$i=1;echo$s;

113 байт спосіб з мінімумом і макс

<?for($i=min($b=$_GET[b]);$i<=$m=max($b);)$s+=$i++%12?:12;echo($b[0]>$b[1])?156-$s+($m%12?:12)+($b[1]%12?:12):$s;

добре це безглузда ідея роботи з масивом 149 Bytes заповнює масив $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))

<?for(;++$i<25;)$y[$i>=($b=$_GET[b])[0]&$i<=$b[1]][$i]=$i%12?:12;echo array_sum($y[1]??array_diff_key($y[0],array_slice($y[0],$b[1],$b[0]-$b[1]-1,1)));

Це може бути в гольф 124 байт

<?for(;++$i<25;)$x[($v=($b=$_GET[b])[0]>$b[1])?$i<$b[0]&$i>$b[1]:$i>=$b[0]&$i<=$b[1]][$i]=$i%12?:12;echo array_sum($x[!$v]);

Тепер ми можемо зменшити масив лише двома входами 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];

<?list($f,$g)=$_GET[b];for(;++$i<25;)$x[($v=$f>$g)?$i<$f&$i>$g:$i>=$f&$i<=$g]+=$i%12?:12;echo$x[!$v];

Після цього я знайшов спосіб обчислити результат безпосередньо 112 байт

<?list($x,$y)=$_GET[t];echo(($b=$x>$y)+(($x-($s=$x%12?:12)^$y-($t=$y%12?:12))xor$b))*78-($s*($s-1)-$t*($t+1))/2;

рекурсивний 103 байт

<?list($x,$y)=$_GET[t];function f($x,$y){return($x%12?:12)+($x-$y?f(++$x<25?$x:1,$y):0);}echo f($x,$y);

2

PHP, 69 байт

list(,$i,$a)=$argv;for($a+=$i>$a?24:0;$i<=$a;)$n+=$i++%12?:12;echo$n;

Вилучення списку було натхнене відповіддю Йорга Гюльсермана, але решта подібностей є результатом конвергентної еволюції, і тому, що вона набагато коротша, а умови в циклі досить різні, я викладаю це як окрему відповідь.

Вводиться як 24 години (добре 0 або 24). Бігайте так:

php -r "list(,$i,$a)=$argv;for($a+=$i>$a?24:0;$i<=$a;)$n+=$i++%12?:12;echo$n;" 9 18

$i>$a?24:0має таку ж довжину, що і ($i>$a)*24 wiki.php.net/rfc/short_list_syntax Можливо, ви хочете використовувати синтаксис короткого списку, який є новим у 7,1 [$x,$i,$a]=$argv;-2 байтів. До того, як я не перевіряв, що я не використовував би його. Тепер я ненавиджу більше, що я не знайшов цього.
Йорг Гюльсерманн

дякую, я знав про майбутній синтаксис короткого списку, але оскільки php 7.1 ще не був належним чином випущений (все ще є кандидатом на реліз 3 під час написання), я припустив, що він ще не дозволений у відповідях PPCG.
користувач59178

2

Java, 72 71 78 76 байт

Usage: 
    pm:    true if first time is past 11am
    time:  first time%12
    pm2:   true if second time is past 11am
    time2: second time%12

Редагувати :

  • -1 байт. Завдяки @ 1Darco1
  • Головка з фіксованою функцією. +7 байт далі.
  • -2 байт вимкнено Завдяки @Kevin Cruijssen
  • +2 байти на. Зараз e/ clockініціалізовано.

(a,b,c,d)->{int e=0;b+=a?12:0;d+=c?12:0;for(;b!=d;e+=b%12,b=++b%24);return e;}

Безголівки:

public static int clock(boolean pm, int time, boolean pm2, int time2){
  int clock=0;
  time+=pm?12:0;
  time2+=pm2?12:0;
  while(time!=time2){
    clock+=time%12;
    time=++time%24;
  }
  return clock;
}

Де ви визначаєте a, і d, і b? Повний метод має сенс, але якщо я щось сильно не пропускаю, я думаю, що вам потрібно ще раз подивитися на свою лямбда з гольфами і насправді спробувати її виконати. Для подальшого гольфу: (time+1)може стати ++time.
1Darco1

У частині для гольфу є помилка: a+=a?має бути b+=a?. Крім того , ви можете грати в гольф його на 2 байта, змінюючи whileв bodyless , 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;}
Кевін Cruijssen

Вибачте. Я написав такий підхід зі свого мобільного і не зміг його перевірити. Виправлено. :)
Роман Граф

1

QBIC , 90 47 байт

Отже, ось відповідь друкує лише загальну кількість дзвіночків:

::{c=a~c>12|c=c-12]d=d+c~a=b|_Xd]a=a+1~a>24|a=1

Введення знаходиться в діапазоні 1-24; aі bє входами ( ::в коді), cведе облік am / pm, dє загальною кількістю дзвінків. Коли ми відрахували всі години, _Xdпрограма завершує роботу, надрукуючи dпроцес.


Гаразд, я неправильно зрозумів питання і вважав, що 1+2+3...=текст є частиною результату, тому я написав, що:

::{c=a~c>12|c=c-12]X=!c$Z=Z+X+@+| d=d+c~a=b|?left$$|(Z,len(Z)-1)+@ =|+!d$_X]a=a+1~a>24|a=1

Тепер я підкажу правильну відповідь ...



1

C #, 76 байт

(a,b)=>Enumerable.Range(a,Math.Abs(b-a)+1).Select(n=>n%12==0?12:n%12).Sum();

Це не виглядає так, ніби він завертається опівночі.
Ніл

Усі тестові справи успішні
downrep_nation

Я цього не питав.
Ніл

Тоді який ваш тестовий випадок не вдається з моєю реалізацією?
downrep_nation

a=23і, b=0здається, є найбільш очевидним прикладом.
Ніл

1

Perl, 36 байт

Включає +1 для -p

Наведіть час початку та закінчення у 24-годинному форматі на рядку STDIN:

toll.pl
11
15
^D

toll.pl:

#!/usr/bin/perl -p
$\+=$_%12||12for$_..$_+(<>-$_)%24}{

1

Java 7, 64 байти

int c(int x,int y){return(x%12<1?12:x%12)+(x!=y?c(-~x%24,y):0);}

Рекурсивний метод, заснований на @ETHproductions відповіді Python 2 . Використовує цілодобовий вхід годинника.

Невикористаний і тестовий код:

Спробуйте тут.

class M{
  static int c(int x, int y){
    return (x%12 < 1
             ? 12
             : x%12)
         + (x != y
             ? c(-~x % 24, y)
             : 0);
  }

  public static void main(String[] a){
    System.out.println(c(10, 12));
    System.out.println(c(1, 5));
    System.out.println(c(11, 15));
    System.out.println(c(10, 22));
    System.out.println(c(5, 5));
  }
}

Вихід:

33
15
29
88
5

1

Пакетна, 168 91 байт

@cmd/cset/ax=(%1+23)%%24,y=x+(%2+24-%1)%%24,z=y%%12+1,(y/12-x/12)*78+z*-~z/2-(x%%=12)*-~x/2

Редагувати: збережено 77 байт, перейшовши на закриту форму для відповіді.

  • %1і %2є двома параметрами командного рядка
  • @ Вимкнути за замовчуванням Пакет, який повинен відповідати команді
  • cmd/c Fool Batch негайно друкує результат обчислення
  • set/a Проведіть числовий обчислення
  • x=(%1+23)%%24, Нормалізуйте початкову годину таким чином, щоб було число годин, починаючи з 1:00 (1:00 також буде працювати, але 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 години до початкової години, але не враховуючи годину початку

1

C, 56 байт

f(a,b,c=0){while(b-->a){c+=b>12?b-12:b;}printf("%d",c);}

1

> <> , 48 + 2 = 50 байт

<v$&%$-&:$+}:*2c
{>:?!v1-}:1+
v?=1l<++1%c+b$
>n;

Очікується, що вхід буде присутній у стеці при запуску програми, тому +2 байти для -vпрапора. Вхід - це два цілі числа, що вказують годину на цілодобовому годиннику, тому 10am - 10pmбуде задано як 10 22.

Спробуйте в Інтернеті!


@LuisMendo Спасибі, це зараз виправлено
Sok

1

Cubix , 45 44 байт

Збережено 1 байт, завдяки @ETHproductions

Мій перший набіг на Cubix ...

)$424tU4OI0Iuq;;-!^;^%&21u+rr;ss!;sqU>&%r$@;

Або кубіфіковано:

      ) $ 4
      2 4 t
      U 4 O
I 0 I u q ; ; - ! ^ ; ^
% & 2 1 u + r r ; s s !
; s q U > & % r $ @ ; .
      . . .
      . . .
      . . .

Ви можете спробувати це в онлайн-перекладача . Введення здійснюється в 24-годинному форматі, перший час закінчення. Наприклад, з 5 вечора до 1 ранку вхід повинен бути 1 17.


Попередня версія, 45 байт:

)$442t\/OI0Iuq;;-!^;^%&21u+rr;ss!;sqU>&%r$@.;

1
Дякую за те, що ви використовуєте мою мову та чудову роботу :-) Я бачу один невеликий байт, який ви можете зберегти, трохи переставивши та відкинувши )$424tU4OI0Iuq;;-!^;^%&21u+rr;ss!;sqU>&%r$@;
неоперативний варіант

0

Qbasic, 112 байт

input "",a
input "",b
do
if a=25 then a=1
if a<=12 then
c=c+a
else
c=c+a-12
endif
a=a+1
loop until a=b+1
print c

Чи не слід виводити 12, коли і початкова, і кінцева година дорівнюють нулю?
Ніл

0

Пітон, 73 байти

Було б набагато коротше , якби ми не повинні підтримувати pmв am. Я використовую рекурсію для її підтримки.

f=lambda a,b:sum([~-i%12+1for i in range(a,b+1)]*(a<b)or[f(a,24),f(1,b)])

Спробуйте в Інтернеті

Без підтримки pmдо am(45 байт):

lambda a,b:sum(~-i%12+1for i in range(a,b+1))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.