ベルタワーは何回鳴りますか?


24

前書き

鐘楼は、時間ごとにその鐘を鳴らすnと、時間をn午前と午後に現在の時間であること。

たとえば、ベルは午後5時に5回、午前10時に10回鳴ります。

仕事

適切な形式で2回指定すると、開始時刻と終了時刻を含めてベルが鳴る回数が出力されます

"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

ご覧のとおり、入力方法を選択できますが、出力は整数(または受け入れ可能な代替)である必要があります。

注意:

  • 入力は、ある日の午後から次の日の朝まで及ぶ場合があります。
  • 2つの時間の差は24時間を超えることはありません。
  • 入力がどの形式であるかを明確に述べている限り、入力は柔軟です。
  • 入力にはAMとPMを明確に区別する必要があります。

2
独自の入力方法を選択しますか、それとも前述のすべてをサポートする必要がありますか?
匿名

1
あなたは、入力方法を選択することができます
ショーン・ワイルド

1
入力がからpmに進む可能性があることを明確にする必要がありますam
mbomb007

3
真夜中は0または24として与えられますか?
-xnor

4
メインサイトに投稿される前に、Sandboxを使用して課題に関する問題を解決することをお勧めします。
メゴ

回答:


12

JavaScript(ES6)、38 35バイト

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

現在のベルリングの数を合計に再帰的に追加します。と呼ばれるf(11,15); 真夜中はとして表され24ます。@xnorの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

Python 2、46バイト

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

JSの回答に基づきます。解の再帰式fは次のように定義されます。

  1. 2つの整数xyから始めます。
  2. テイクのxのmod 12を、これが0の場合、代わりに12を使用します。
  3. x!= yの場合、f(x + 1 mod 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それは完全な(使用可能な)機能である必要があります
ロッド

(y + 24)%24はちょうどy
ウラジミールクラベロ

1
@Rodは必要ありませんa=。純粋なラムダにすることができます。
-Yytsi

1
@VladimirCraveroもちろんそうではありません。と同じy%24です。
エリックアウトゴルファー16年


3

Python、42バイト

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

拡大23に0から2つの数値を取る再帰関数~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を法として増分され、再帰結果の関数が追加されます。つまり、現在の時間が終了時間でない限り、その場合は停止します。

代わりに、純粋に算術的なソリューションを作成しようとしていましたが、これまでのところ、長くて厄介な式しか見つかりませんでした。


ああ、私はそれを手に入れました:それは基本的に私の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]。次に、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

入力形式は、チャレンジの3番目の例のとおりです。つまり、24時間形式の2つの数値です。

オンラインでお試しください!

説明

入力を取り2210一例として。

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クラックがより短い解決策を見つけたのかもしれません。

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

この時点で、2つの整数だけで配列を減らすことができます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;

リストの抽出は、JörgHü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バイトの新しい短いリスト構文を使用したいかもしれません。ただ今、私はこの方法ではないことがわかったのが嫌いです。
ヨルグヒュルサーマン

おかげで、私は今後の短いリストの構文について知っていましたが、php 7.1はまだ適切にリリースされていないので(執筆時点ではまだリリース候補3です)、PPCGの回答ではまだ許可されていないと仮定しました。
user59178

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

あなたはどこに定義しないad、とb?完全な方法は理にかなっていますが、何かをひどく見逃していない限り、ゴルフラムダをもう一度見て、実際に実行する必要があると思います。さらにゴルフをする場合:に(time+1)なり++timeます。
1Darco1

ゴルフパートにエラーがあります:するa+=a?必要がありますb+=a?。また、あなたが変更することにより、2つのバイトによってゴルフをすることができますwhilebodylessに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

QBIC90 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

STDINの各行に、開始時刻と終了時刻を24時間形式で指定します。

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回答に基づく再帰的方法。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は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) 開始時間に打たれたベルの数より1つ少ない
  • *-~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時間制の時間を指定する2つの整数であるため、10am - 10pmとして指定され10 22ます。

オンラインでお試しください!


@LuisMendoありがとう、それは現在修正済みです
ソク

1

Cubix45 44バイト

@ETHproductionsのおかげで1バイト節約

キュービックスへの私の最初の進出...

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

または、cubified:

      ) $ 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を落とすことで節約できる1バイトを見る:)$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

開始時刻と終了時刻の両方がゼロのときに12を出力すべきではありませんか?
ニール

0

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

オンラインで試す

(45バイト)pmへのサポートなしam

lambda a,b:sum(~-i%12+1for i in range(a,b+1))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.