종탑은 몇 번 울리나요?


24

소개

종루는 벨 매 시간마다, 울립니다 n로, 시간을 n12 시간 시계의 현재 시간 서비스를 제공합니다.

예를 들어 종은 오후 5시에 5 번, 오전 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
우리는 우리 자신의 입력 방법을 선택합니까 아니면 언급 된 모든 방법을 지원해야합니까?
anonymous2

1
입력 방법을 선택할 수 있습니다
Shaun Wild

1
입력이에서 (으) pm로 이동 am하여 2 일째 날로 갈 수 있음을 더 명확하게해야합니다 .
mbomb007

3
자정에 0 또는 24가 부여됩니까?
xnor

4
샌드 박스 를 사용하여 문제가 발생하는 문제를 기본 사이트에 게시하기 전에 해결할 것을 권장합니다 .
Mego

답변:


12

자바 스크립트 (ES6), 38 35 바이트

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

현재 벨 벨 수를 재귀 적으로 합계에 추가합니다. 처럼 호출 f(11,15); 자정은로 표시됩니다 24. @ xnor 's Python answer~- 에서 트릭의 일부를 얻었습니다 .

테스트 스 니펫

비 재귀 버전 (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

파이썬 2, 46 바이트

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

내 JS 답변을 기반으로합니다. 솔루션 의 재귀 공식 f 는 다음과 같이 정의됩니다.

  1. 두 개의 정수 xy로 시작하십시오 .
  2. x mod 12를 취하십시오 ; 이 값이 0이면 대신 12를 사용하십시오.
  3. 경우 X! = Y 의 추가 결과 F (X + 1 모드 (24)를 Y) .

6

파이썬 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이다
블라디미르 Cravero에

1
@로드 당신은 필요하지 않습니다 a=. 순수한 람다가 될 수 있습니다.
Yytsi

1
@VladimirCravero 물론 아닙니다. 와 동일합니다 y%24.
Outgolfer Erik


3

파이썬, 42 바이트

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

확장 (23)에 0 내지 두 숫자를 취하는 재귀 함수 ~x에 님을 -x-1준다

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

표현은 (a+1)%12+1링의 수를 한 번에 변환 112. 그 다음, 하한은 모듈로 24 증가하고 재귀 결과에 대한 기능이 추가됩니다. 즉, 현재 시간이 종료 시간이 아니라면 중지합니다.

나는 순수하게 산술 솔루션을 작성하려고 노력했지만 지금까지 길고 지저분한 표현 만 발견했습니다.


아, 나는 그것을 얻는다 : 그것은 기본적으로 내 파이썬 답변과 같은 기술이지만, 주위를 돌아 다니는 정말 영리한 방법입니다 or. 좋은 것!
ETHproductions

3

하스켈, 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]. 그런 다음 바이트를 저장하여 x를 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 바이트 배열을 채 웁니다 배열 작동 $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]);

지금이 시점에서 우리는 두 가지의 int 101 바이트 배열을 줄이 개 금액을 확인 할 수 있습니다 $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;

목록 추출은 Jörg Hülsermann의 답변에서 영감을 얻었지만 나머지 유사점은 수렴 진화의 결과이며 훨씬 짧고 루프의 조건이 다르기 때문에 별도의 답변으로 게시하고 있습니다.

입력을 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 바이트의 새로운 짧은 목록 구문을 사용하고 싶을 수도 있습니다 . 좋은 방법은 지금 나는이 방법을 찾을 수 없다는 것을 더 싫어.
Jörg Hülsermann

고마워, 다가오는 짧은 목록 구문에 대해 알고 있었지만 PHP 7.1이 아직 제대로 릴리스되지 않았기 때문에 (작성 시점에 릴리스 후보 3) 여전히 PPCG 답변에 허용되지 않았다고 가정했습니다.
user59178

2

자바, 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?. 또한 다음 과 같이 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;}
Kevin Cruijssen

죄송합니다. 모바일에서이 접근 방식을 작성했지만 테스트 할 수 없었습니다. 결정된. :)
Roman Gräf

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

마치 자정에 싸는 것처럼 보이지 않습니다.
Neil

모든 테스트 사례 성공
downrep_nation

나는 묻지 않았다.
Neil

그렇다면 구현에 실패한 테스트 사례는 무엇입니까?
downrep_nation

a=23그리고 b=0가장 확실한 예가 될 것 같다.
Neil

1

펄, 36 바이트

에 +1 포함 -p

STDIN에서 각각 한 줄에 24 시간 형식으로 시작 및 종료 시간을 제공하십시오.

toll.pl
11
15
^D

toll.pl:

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

1

자바 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 답변을 기반으로 한 재귀 메서드 . 24 시간 시계 입력을 사용합니다.

언 골프 및 테스트 코드 :

여기에서 시도하십시오.

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 계산 결과를 즉시 인쇄하는 바보 배치
  • set/a 숫자 계산 수행
  • x=(%1+23)%%24, 시작 시간을 오전 1시 이후의 시간 수로 정규화합니다 (1PM도 작동하지만 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;

프로그램 시작시 스택에 입력이있을 것으로 예상되므로 -v플래그의 경우 +2 바이트입니다 . 입력은 24 시간 제로 시간을 지정하는 두 개의 정수이므로 10am - 10pm로 지정됩니다 10 22.

온라인으로 사용해보십시오!


@LuisMendo 감사합니다, 이제 수정되었습니다
Sok

1

Cubix , 45 44 바이트

@ETHproductions 덕분에 1 바이트 절약

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
내 언어를 사용 해주셔서 감사합니다. 훌륭한 직업입니다 :-) 약간 재정렬하고 no-op를 제거하여 절약 할 수있는 작은 바이트 하나를 봅니다 .)$424tU4OI0Iuq;;-!^;^%&21u+rr;ss!;sqU>&%r$@;
ETHproductions

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

시작 시간과 종료 시간이 모두 0 일 때 12를 출력해서는 안됩니까?
Neil

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

온라인으로 사용해보십시오

지지 않고 pmam(45 바이트)

lambda a,b:sum(~-i%12+1for i in range(a,b+1))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.