Ile razy dzwoni dzwonnica?


24

Wprowadzenie

Dzwonnica będzie dzwonić dzwonkami co godzinę i godzinę n, przy nczym jest to bieżąca godzina na 12-godzinnym zegarze.

Na przykład dzwonek zadzwoni 5 razy o 17:00 i 10 razy o 10:00.

Zadanie

Biorąc pod uwagę dwa razy w odpowiednim formacie, wypisz, ile razy zadzwoni dzwonek, w tym czas rozpoczęcia i zakończenia

Przykłady

"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

Jeśli początek jest taki sam jak koniec, po prostu podajesz liczbę dzwonków dla tej godziny:

[5pm, 5pm]
5 = 5

Jak widać, możesz wybrać metodę wprowadzania, ale wynik musi być liczbą całkowitą (lub dopuszczalną alternatywą) dozwolone są końcowe / wiodące znaki nowej linii i spacje.

Uwaga:

  • dane wejściowe mogą obejmować okres od popołudnia jednego dnia do rana następnego dnia.
  • różnica między tymi dwoma czasami nigdy nie będzie większa niż 24 godziny.
  • dane wejściowe są elastyczne, o ile wyraźnie określasz format danych wejściowych.
  • twój wkład musi mieć wyraźne rozróżnienie między AM a PM.

2
Czy wybieramy własną metodę wprowadzania danych, czy też musi ona obsługiwać wszystkie wymienione metody?
anonimowy2

1
Możesz wybrać metodę wprowadzania
Shaun Wild,

1
Powinieneś wyjaśnić, że dane wejściowe mogą przechodzić od pmdo am, a tym samym przejść do drugiego dnia.
mbomb007

3
Czy północ będzie podawana jako 0 czy 24?
xnor

4
Zachęcamy do korzystania z piaskownicy, aby rozwiązywać wszelkie problemy związane z wyzwaniami, zanim zostaną opublikowane na stronie głównej.
Mego

Odpowiedzi:


12

JavaScript (ES6), 38 35 bajtów

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

Rekurencyjnie dodaje bieżącą liczbę dzwonków do sumy. Nazywany jak f(11,15); północ jest reprezentowana jako 24. Dostałem część ~-sztuczki od odpowiedzi Python @ xnor .

Testowy fragment kodu

Wersja nierekurencyjna (Firefox 30+), 56 bajtów

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

Odpowiednik następującej funkcji ES6:

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

7

Python 2, 46 bajtów

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

Na podstawie mojej odpowiedzi JS. Formuła rekurencyjna f dla rozwiązania jest zdefiniowana w następujący sposób:

  1. Zacznij od dwóch liczb całkowitych x i y .
  2. Weź x mod 12 ; jeśli jest to 0, weź 12 zamiast tego.
  3. Jeśli x! = Y , dodaj wynik f (x + 1 mod 24, y) .

6

Python 2, 59 54 bajtów

a=lambda x,y:sum(1+i%12for i in range(x-1,y+24*(x>y)))
Równoważny
summ=0
if start > end:
    end+=24
for hour in range(start-1,end):
    summ +=1+hour%12
print summ

3
Myślę, że nie potrzebujesz tej a=części.
acrolith

@daHugLenny musi to być pełna (użyteczna) funkcja
Rod

(+ 24)% 24 to tylko y
Vladimir Cravero

1
@Rod Nie potrzebujesz a=. To może być czysta lambda.
Yytsi

1
@VladimirCravero Oczywiście, że nie. To jest to samo co y%24.
Erik the Outgolfer


3

Python, 42 bajty

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

Funkcja rekurencyjna, która przyjmuje dwie liczby od 0 do 23. Poszerzanie ~xdo -x-1daje

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

Wyrażenie (a+1)%12+1konwertuje czas na liczbę dzwonków 1do 12. Następnie dolna granica jest zwiększana modulo 24 i dodawana jest funkcja wyniku rekurencyjnego. To znaczy, chyba że bieżąca godzina jest godziną końcową, w którym to przypadku się zatrzymujemy.

Zamiast tego próbowałem napisać rozwiązanie czysto arytmetyczne, ale jak dotąd znalazłem tylko długie i niechlujne wyrażenia.


Ach, rozumiem: to w zasadzie ta sama technika, co moja odpowiedź w Pythonie, ale z naprawdę sprytnym sposobem na obejście or. Niezłe!
ETHproductions

3

Haskell, 48 43 bajtów

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

Zastosowanie jest takie startHour % endHour, że oba dane wejściowe są podawane w formacie 24-godzinnym.

edycja: dodano ulepszenie @ xnor, oszczędzając 5 bajtów


Zamiast zmieniać ekiedy e<s, można filtrować zakres s%e=sum[mod(x-1)12+1|x<-[s..e+24],x<=e||s>e]. Następnie zapisuje bajt do przesunięcia w dół o 1 x: s%e=sum[mod x 12+1|x<-[s-1..e+23],x<e||s>e].
xnor

3

C #, 73 bajty

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

Dopuszczalne dane wejściowe: liczby całkowite w zakresie [0,23].

To rozwiązanie nie korzysta z LINQ.


Pełny program z przypadkami testowymi:

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

Galaretka , 17 16 15 14 bajtów

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

TryItOnline

W jaki sposób?

>×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 bajtów

yy>24*+&:12X\s

Format wejściowy jest jak w trzecim przykładzie w wyzwaniu, to znaczy dwie liczby w formacie 24-godzinnym.

Wypróbuj online!

Wyjaśnienie

Weź wejść 22, 10jako przykład.

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 bajtów

Format wejściowy „[1,24]” między 1 a 24

W tym wyzwaniu, którego nie znoszę, dlaczego PHP przegrywa z innymi językami. Wolę pokazać wszystkie moje pomysły. Być może inny crack PHP znajdzie krótsze rozwiązanie.

<?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 bajtów

<?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 bajtów na minutę z min. I maks

<?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;

okej, ten szalony pomysł działa z tablicą 149 bajtów wypełnia tablicę $y[0]i $y[1]jeśli $_GET["b"][0]<=$_GET["b"][1] tak, $y[1]to nullmożemy ją zsumować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)));

To może być golfowane w dół 124 bajtów

<?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]);

Teraz w tym momencie możemy zmniejszyć tablicę za pomocą tylko dwóch liczb całkowitych 101 bajtów Make 2 sumy $x[0]i$x[1]

list($f,$g)=$_GET[b];

jeśli $v=($f>$g następnie dodaj wartość do $x[$i<$f&$i>$g] innej wartości dodanej do $x[$i>=$f&$i<=$g] wyniku będzie znaleźć przypadekecho$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];

Po tym znalazłem sposób, aby obliczyć wynik bezpośrednio 112 bajtów

<?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;

rekurencyjne 103 bajty

<?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 bajtów

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

Ekstrakcja listy została zainspirowana odpowiedzią Jörga Hülsermanna, ale pozostałe podobieństwa są wynikiem zbieżnej ewolucji, a ponieważ jest ona znacznie krótsza, a warunki w pętli są wystarczająco różne, zamieszczam ją jako osobną odpowiedź.

Pobiera dane wejściowe jako 24 godziny (w porządku z 0 lub 24). Działaj jak:

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:0ma taką samą długość jak ($i>$a)*24 wiki.php.net/rfc/short_list_syntax Może chcesz skorzystać ze składni krótkiej listy, która jest nowa w [$x,$i,$a]=$argv;bajtach 7,1 -2 Zanim nie przetestowałem, że jej nie użyję . W dzisiejszych czasach nienawidzę mnie bardziej, że nie znalazłem tego w ten sposób.
Jörg Hülsermann

dzięki, wiedziałem o nadchodzącej składni krótkiej listy, ale ponieważ php 7.1 nie został jeszcze poprawnie wydany (wciąż w wersji kandydata 3 w momencie pisania), założyłem, że nie jest to jeszcze dozwolone w odpowiedziach PPCG.
user59178,

2

Java, 72 71 78 76 bajtów

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

Edytuj :

  • -1 bajt off. Dzięki @ 1Darco1
  • Naprawiono funkcję głowicy. +7 bajtów włączone.
  • -2 bajty wyłączone. Dzięki @Kevin Cruijssen
  • +2 bajty włączone. Teraz e/ clockjest inicjowany.

(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;}

Nie golfowany:

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;
}

Gdzie można zdefiniować a, a d, i b? Pełna metoda ma sens, ale chyba, że ​​coś poważnie mi brakuje, myślę, że musisz jeszcze raz spojrzeć na swoją golfę i spróbować ją wykonać. Dla dalszego golfa: (time+1)może się stać ++time.
1Darco1

W części golfowej występuje błąd: a+=a?powinien być b+=a?. Możesz whileteż zagrać w golfa o 2 bajty, zmieniając go w bezcielesny, fortaki jak ten:(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;}
Kevin Cruijssen

Przepraszam. To podejście napisałem z telefonu komórkowego i nie mogłem go przetestować. Naprawiony. :)
Roman Gräf

1

QBIC , 90 47 bajtów

Oto odpowiedź wypisująca tylko całkowitą liczbę dzwonków:

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

Dane wejściowe mieszczą się w zakresie 1-24; ai bsą wejściami ( ::w kodzie), cśledzą am / pm, dto całkowita liczba dzwonków. Po odliczeniu wszystkich godzin _Xdprogram zostaje zakończony i trwa drukowanie d.


OK, źle zrozumiałem pytanie i pomyślałem, że 1+2+3...=tekst jest częścią wyniku, więc napisałem:

::{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

Teraz koduję poprawną odpowiedź ...


1

Pyth - 11 bajtów

s|R12%R12}F

Pakiet testowy .


2
Nie liczy się to około północy, na przykład danych 23, 1wyjściowych, 144kiedy należy je wydrukować 24. (Taki przypadek powinien oczywiście być w trakcie testów!)
Jonathan Allan,

1

C #, 76 bajtów

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

Nie wygląda to tak, jakby zawijało się o północy.
Neil,

Wszystkie przypadki testowe powiodły się
downrep_nation

Nie pytałem o to.
Neil

W takim razie jaki przypadek testowy kończy się niepowodzeniem w mojej implementacji?
downrep_nation

a=23i b=0wydaje się być najbardziej oczywistym przykładem.
Neil,

1

Perl, 36 bajtów

Obejmuje +1 dla -p

Podaj czas rozpoczęcia i zakończenia w formacie 24-godzinnym w linii na STDIN:

toll.pl
11
15
^D

toll.pl:

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

1

Java 7, 64 bajty

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

Metoda rekurencyjna oparta na odpowiedzi Python 2 na @ETHproductions . Wykorzystuje 24-godzinny zegar wejściowy.

Kod niepoznany i testowy:

Wypróbuj tutaj.

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));
  }
}

Wydajność:

33
15
29
88
5

1

Partia, 168 91 bajtów

@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

Edycja: Zapisano 77 bajtów, przechodząc do zamkniętego formularza odpowiedzi.

  • %1i %2są dwoma parametrami wiersza poleceń
  • @ Wyłącz domyślne ustawienie Batch, które polega na powtórzeniu polecenia
  • cmd/c Fool Batch, aby natychmiast wydrukować wynik obliczeń
  • set/a Wykonaj obliczenia numeryczne
  • x=(%1+23)%%24, Normalizuj godzinę początkową jako liczbę godzin od 1 w nocy (1PM również by działała, ale 11 nie jest krótszy niż 23)
  • y=x+(%2+24-%1)%%24, Normalizuj godzinę końcową, aby wyprzedzić godzinę początkową, aw razie potrzeby przejdź do następnego dnia
  • z=y%%12+1, Liczba dzwonków uderzonych w godzinie zakończenia
  • (y/12-x/12)*78+ Liczba dzwonków ze względu na dodatkowe pół dnia
  • z*~-z/2- Liczba dzwonków od 1 do godziny zakończenia włącznie
  • (x%%=12) O jeden mniej niż liczba dzwonów uderzonych w godzinie początkowej
  • *-~x/2 Liczba dzwonków, które zostałyby uderzone od 1 do godziny początkowej, ale nie wliczając godziny początkowej

1

C, 56 bajtów

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

1

> <> , 48 + 2 = 50 bajtów

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

Oczekuje się, że dane wejściowe będą obecne na stosie przy starcie programu, więc +2 bajty dla -vflagi. Dane wejściowe to dwie liczby całkowite określające godzinę na zegarze 24-godzinnym, więc 10am - 10pmpodano je jako 10 22.

Wypróbuj online!


@LuisMendo Dzięki, to już naprawione
Sok

1

Cubix , 45 44 bajtów

Zaoszczędzono 1 bajt dzięki produktom @ETH

Mój pierwszy wypad do Cubix ...

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

Lub skostniałe:

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

Możesz to wypróbować u tłumacza online . Dane wejściowe są w formacie 24-godzinnym, z pierwszym czasem zakończenia. Na przykład od 17:00 do 1:00 wejście powinno być 1 17.


Poprzednia wersja, 45 bajtów:

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

1
Dziękuję za używanie mojego języka i świetną robotę :-) Widzę jeden mały bajt, który można zaoszczędzić, )$424tU4OI0Iuq;;-!^;^%&21u+rr;ss!;sqU>&%r$@;
zmieniając

0

Qbasic, 112 bajtów

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

Czy nie powinieneś wyprowadzać wartości 12, gdy godzina początkowa i końcowa są równe zero?
Neil

0

Python, 73 bajty

Byłoby więc znacznie krócej, jeśli nie muszą wspierać pmsię am. Korzystam z rekurencji, aby to wspierać.

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

Wypróbuj online

Bez obsługi pmdo am(45 bajtów):

lambda a,b:sum(~-i%12+1for i in range(a,b+1))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.