ワードクロックを印刷する


59

数年前に最初のものを見たので、私は常にこの種のワードクロックに支配されていました。

ワードクロック

その時計に表示されるテキストは次のとおりです。

IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK

あなたの仕事は、そのような作業クロックを書くことです。現在の時刻の印刷に関連する場合にのみ、単語が点灯します。それ以外の場合、それらは点灯します。単語は印刷されることにより「点灯」され、単語の長さであるスペースの数に置き換えられることにより「消灯」されます。

例:現在の時刻が17:23の場合、印刷されるテキストは次のとおりでなければなりません。

IT IS 
        TWENTY
FIVE MINUTES
PAST
         FIVE

ルール

  1. 印刷される時間は12hバリアントですが、AM / PMはありません。
  2. 四捨五入は分単位でのみ行われます(秒はまったく関係ありません)。丸めは5の最も近い倍数で行われます。たとえば、17:52:38は実際には17:55に最も近いですが、秒は無関係なので、17:52は実際には17:50に切り捨てられます。また、印刷されるテキストは「6分間で10分です」(関連するスペースを使用)です。XX5の倍数の場合XX、HH:(XX-2):00からHH:(XX + 2):59まで使用されます。単語がMINUTESあれば表示される必要がありますFIVETENまたはTWENTY(「TO」や「過去」の前に)分のセクションに点灯されています。
  3. 関係のない単語はすべて、必要な数のスペースに置き換えられ、上記のテンプレート内のテキストを保持します。末尾のスペースは削除される場合があります。テキストを予想される位置に保持することに関連するスペースを保持する必要があります。
  4. 末尾の行もトリミングできます。関連する空の行を表示するには、引き続き必要です。例:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. これらの値が時間を指している場合TEN、1行目またはFIVE3行目に点灯しないでください。

  6. 入力を受け入れることができます。入力を受け入れる場合、入力は任意の有効な形式(文字列、整数のリスト、言語サポートのネイティブ時間タイプなど)で印刷する時間になりますが、関連していない場合はパラメーターを使用できません印刷する時間に。入力をサポートしない場合は、現在の時刻を使用する必要があります。両方をサポートする場合、それは良いですが、ボーナスはありません;)
  7. コードはプログラム、関数、ラムダですが、スニペットではありません。
  8. 言語が何らかの方法で印刷をサポートしている場合、結果を印刷する必要があります(ファイルで、標準出力に、私は気にしません)。あなたの言語が何らかの方法で印刷をサポートしていない場合、期待されるテキストを単に「返す」ことが許可されます。結果は、両方が混在するのではなく、すべて大文字またはすべて小文字になる可能性があります。
  9. 標準の抜け穴が適用されます。
  10. これはコードゴルフなので、最短のコードが勝ちです!
  11. 可能な限り、あなたの言語のオンライン通訳へのリンクを提供してください。

テストケース

Input:  <no input> (the current local time is 19:20)
Output:     
IT IS
        TWENTY
     MINUTES
PAST 

    SEVEN

Input: 13:15
Output: (empty line is being printed)
IT IS
QUARTER

PAST
ONE

Input: 13:58
Output: (rounding)
IT IS


     TWO



       O'CLOCK

Input: 14:30
Output: (half is always a edge-case)
IT IS HALF


PAST TWO

Input: 15:35
Output: (light up "TO")
IT IS
        TWENTY
FIVE MINUTES TO

    FOUR

Input: 10:00
Output: (do not use the TEN or FIVE on the first line when referring to the hours)
IT IS





    TEN
      O'CLOCK

Input: 12:00
Output: (O'CLOCK and a lot of empty lines)
IT IS






TWELVE O'CLOCK

8
大きな挑戦、私は本当にそれが好きです!
ティムテック

回答:


14

PHP、387 384 353 352 342 323 310 306 298 293 291バイト

ゴルフをしてくれた@Christophと彼のすばらしい発見に感謝します
彼のアカウントには少なくとも45バイトがあります。彼に触発された16以上。

驚異のチームアップ!

IT IS <?foreach([HALF,TEN,QUARTER,TWENTY,FIVE,MINUTES,TO,PAST,TWO,THREE,ONE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,ELEVEN,TWELVE,"O'CLOCK"]as$w)echo strstr([w,ghj,dhj,ej,fhj,fghj,cj,fghi,fhi,ei,dhi,ghi][$m=date(i)/5+.5].mklnopqrstuvm[date(h)-($m<7)],99+$i)?$w:$w^$w^"       ","
  "[$i++%3^$i<3];

データをループし、現在のインデックスが、点灯する(文字にマッピングされた)単語のインデックスを含む生成された文字列にあるかどうかを確認します。インデックスに応じて改行またはスペースを追加します。

error_reporting(22519)のデフォルト値を使用しないと、通知が生成される場合があります。

オンラインでテストします。

壊す

IT IS <?
foreach([HALF,TEN,QUARTER,TWENTY,FIVE,MINUTES,TO,PAST,  // loop through words
TWO,THREE,ONE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,ELEVEN,TWELVE,"O'CLOCK"]as$w)
    echo strstr(                    // search word index in ...
        [w,ghj,dhj,ej,fhj,fghj,cj,fghi,fhi,ei,dhi,ghi][$m=date(i)/5+.5] // minutes & co
        .mklnopqrstuvm[date(h)-($m<7)]                          // hours (-1 if minutes<33)
    ,99+$i                          // (map 0..20 to c..w)
    )?$w:$w^$w^"       ",           // if found, print string, else print spaces
    "\n  "[$i++%3^$i<3];            // if $i in [3,5,8,...], print newline, else space

Golfs

  • $x/5+.5|0は、より2バイト短いですround($x/5)
  • の2つの呼び出しはdate(h)date結果を変数に割り当てるよりも1バイト短くなります。
  • 単一のアサインメントを使用すると、ライトアップインデックスが格納されている変数が削除されました。
  • 約30バイト保存された配列ではなく、ライトアップインデックスの文字列。
  • $w<Aは3バイトより短い$w=="\n"-区切り文字の後にスペースがないことを確認してください!
  • abs 分ワードで8バイトを節約しました。
  • ありがとう@Christoph:マップの数字から文字に移動すると、区切り記号が廃止され、配列ではなくもう1つの文字列が許可されました。23 + 8バイトを節約しました。
    アンダースコアを「それ」の選択肢に含めることができる最初のインデックスとして使用します。そして、それは時代の引用を廃止しました。
  • 1時間マップで値を複製すると、モジュロが廃止され、追加のゴルフで10バイト節約されました。@Christophに触発されました。
  • 改行とスペースをハードコーディングする代わりに計算すると、19バイト削られます
  • 文字列のビットロジックは7バイトを節約します:str_pad("",strlen($w))-> $w^$w^" "。(クリストフ)
  • ´2 strtr番目のパラメーターが文字列でない場合、ASCIIコードとして解釈されます。5バイト節約します。

これはすごく素敵!質問が解決可能であることを確認するときにJavaでこの実装を試しましたが、非常に複雑になるため、あきらめ、より長く、より簡単なアプローチを使用しました!私が失敗した場所で成功したことを祝福します;)
オリビエグレゴワール

1
残りのビート:$i++%3^($i<3)$i++%3^$i<3。公式に完全に無駄になりました。誰かが私たちと一致するまで休憩します。とても楽しかったです。チームワークをありがとう。
クリストフ

1
@Christophあなたは... GREATは小さな言葉のようです。\ o /
タイタス

18

TI-Basic、335 334バイト

TI-84 calcsには8x16文字のディスプレイがあり、これは8x15であるため、ほぼ完璧です。内部クロックを持たないTI-84より前の計算をサポートするために、日付が入力として使用されます。引数なしで、Inputデフォルトで入力になるXYに類似し、Prompt X,Y。そのためX、時間は何でも(何でも>=0正しく動作します)、Y数分にしてください。

Input 
ClrHome
int(Y/5-5.6
Output(1,1,"IT IS
If Ans=~6
Output(8,8,"O'CLOCK
If 2=abs(3-abs(Ans
Output(3,1,"FIVE
If 4=abs(Ans
Output(1,12,"TEN
If 3=abs(Ans
Output(2,1,"QUARTER
If 2=abs(Ans
Output(2,8,"TWENTY
If sum(abs(Ans)={1,2,4,5
Output(3,5,"MINUTES
If not(Ans
Output(1,7,"HALF
If Ans<1 and Ans+6
Output(4,1,"PAST
If Ans>0
Output(3,14,"TO
12fPart(12(^~1)(X+(Y>32->A
If not(Ans
12->A
{21,6,10,25,30,41,45,51,61,66,70,81
.05Ans(A
Output(int(4+Ans),20fPart(Ans),sub("ONE   TWO   THREE FOUR  FIVE  SIX   SEVEN EIGHT NINE  TEN   ELEVENTWELVE",6A-5,6

注1:TI-84の+の場合は、置き換えることができるInputようなものでgetTime:Ans(1->X:getTime:Ans(2->Y。また、int(Y/5-5.6と同等round(Y/5,0)-6です。いいえ、この場合int(はと交換できませんでしたiPart(

注2:これは入力を正常に出力しますが、おそらく、プログラムの終了時にメッセージが表示さPauseれないように、プログラムの最後に必要な理由から、数学的な理由でおそらく必要ですDone

編集:トークン化されたためバイト数が減少しました(以前のリビジョンに関する注意を参照)。@ Neilのおかげでバグも修正されました。3番目に、2バイトかかったはずのバグを修正しましたが、最適化は実際に全体で1バイトを節約しました。また、入力を取得しているので、電話する必要がないことにも気付きましたgetTime(ええ?)。最後に、このバイトカウントを確認したい人のために、唯一の2バイトトークンはsub(です。


O'CLOCKコードを出力した後も出力が続くように思えPASTます
ニール

2
545バイトを数えてください。
クリストフ

2
@Christoph関連するメタ投稿が見つかりました:meta.codegolf.stackexchange.com/a/4764/29637
クリストフ

1
@OlivierGrégoire実際には、前の行とはまったく関係ありません。実行しているのは、24時間から12時間への変換と、最も近い時間への変換です(例:分での丸め)。基本的に、通常の言語ではx+(y>32) mod 12、TI-Basicのように比較の結果が1または0の場合、次のようになります。
ティムテック

1
@Christophそれであなたはそのリンクであなた自身の質問に答えたように思えます、あなたはまだ私に説明してほしいですか?ASCIIスコアリングからトークン化への切り替えを行った場所を確認するには、リビジョン#4を確認してください。
ティムテック

11

JavaScriptの(ES6)、291の 303 295バイト

カリー化構文を使用して入力を2つの整数として受け取ります (h)(m)

h=>m=>console.log(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>(k/=2)&1?w:w.replace(/./g,' '),k=[x=1<<19,88,81,66,84,92,64.5,60,52,34,49,56,x,h=(m<33?h+11:h)%12][m/5+.4|0]*16|6|2048<<(h?h-(h<3):2)))

使い方

クロック全体は、オンまたはオフの23個のLEDとして見ることができます。そのため、クロック状態は23ビット整数です。

Bit | Word        Bit | Word
----+--------     ----+--------
00  | IT          12  | ONE
01  | IS          13  | FOUR
02  | HALF        14  | FIVE
03  | TEN         15  | SIX
04  | QUARTER     16  | SEVEN
05  | TWENTY      17  | EIGHT
06  | FIVE        18  | NINE
07  | MINUTES     19  | TEN
08  | TO          20  | ELEVEN
09  | PAST        21  | TWELVE
10  | TWO         22  | O'CLOCK
11  | THREE             

分の 1は、一見すると思うかもしれないとして、我々は適切な言葉を使用可能にするために実装する必要があるロジックは同じくらい簡単ではありません。魔法のゴルフの公式が存在するかもしれませんが、私は簡単な方法で行き、それぞれの可能な構成をハードコーディングすることにしました:

Minutes | Words                    | Enabled bits | Value   | Value / 8
--------+--------------------------+--------------+---------+----------
  00    | O'CLOCK                  | 22           | 4194304 | 524288
  05    | FIVE MINUTES PAST        | 6, 7, 9      | 704     | 88
  10    | TEN MINUTES PAST         | 3, 7, 9      | 648     | 81
  15    | QUARTER PAST             | 4, 9         | 528     | 66
  20    | TWENTY MINUTES PAST      | 5, 7, 9      | 672     | 84
  25    | TWENTY FIVE MINUTES PAST | 5, 6, 7, 9   | 736     | 92
  30    | HALF PAST                | 2, 9         | 516     | 64.5
  35    | TWENTY FIVE MINUTES TO   | 5, 6, 7, 8   | 480     | 60
  40    | TWENTY MINUTES TO        | 5, 7, 8      | 416     | 52
  45    | QUARTER TO               | 4, 8         | 272     | 34
  50    | TEN MINUTES TO           | 3, 7, 8      | 392     | 49
  55    | FIVE MINUTES TO          | 6, 7, 8      | 448     | 56

テストケース


2
非常に賢い。私は私のものからもう少しバイトをカットしようとしていました、そして、私はこれを見ました、そして、競争する望みがありません。
-edc65

タスク(ルール8)は、返されるだけでなく、印刷する必要があることを示しています
-smls

@smlsああ、あなたは正しい。それは修正されました。
アーナルド

とてもかっこいい。時刻が間違っていることを除いて:-(表示:h = 13 m = 15実際の時間:14:
ストロベリー

@Strawberryルール#6をご覧ください。この実装は、ローカル時間ではなく入力のみを使用しています。
アーナウド

6

バッチ、789バイト

@echo off
if not "%1"=="" setlocal&set time=%1
set/a"h=%time:~0,2%,m=6%time:~3,2%%%60+2,h+=m/35,h%%=12,m=6-m/5%%12,n=m%%3,o=m%%2
set p=
set s=
call:c %m:-=% "IT IS HALF" 0 "IT IS      TEN" 4 "IT IS"
call:c %m:-=% QUARTER 3 "        TWENTY" 2 "        TWENTY" 1
if %m% lss 0 set s= TO
call:c 0 "            " %n% "     MINUTES" %o% "FIVE MINUTES"
set s=
set p=PAST 
if %m%==6 set p=     
if %m% lss 0 set p=     
call:c %h% TWO 2 "    THREE" 3
set p=
call:c %h% ONE 1 "    FOUR" 4 "          FIVE" 5
call:c %h% SIX 6 "    SEVEN" 7 "          EIGHT" 8
call:c %h% NINE 9 "     TEN" 10 "         ELEVEN" 11
if %m%==6 set s= O'CLOCK
call:c %h% TWELVE 0 "      "
exit/b
:c
set t=%1
:l
if %t%==%3 echo(%p%%~2%s%&exit/b
shift
shift
if not "%3"=="" goto l
echo(%p%%~2%s%

注:PAST次の2行のそれぞれの末尾のスペースと5つの末尾のスペース。


私はそれを実行し、それはうまくいきます(時間3の1つの不足しているスペースを除いて)!何が起こっているのかわかりません(call:cたとえば)。私はおそらくいくつかのバッチを学ぶ必要があります:)
オリヴィエグレゴワール

@OlivierGrégoire悲しいことに、スペースがなくなっていましたが、現在は修正されています。
ニール

4

JavaScript、567 564 551 542 529 527 519バイト

引数として時間と分をとっても大丈夫かどうかはわかりません。あなたは「整数のリスト」と言いました。それでもカウントされますか?

ちなみに、初めてのゴルフです。どう思いますか?


編集:分を分割して数バイトを保存しました。ありがとう、オリビエ!


はい、そのルールの背後にある考え方は、引数を取ることができるということですが、それは入力に関連する場合にのみです。これは印刷の時間です。
オリビエグレゴワール

1
ゴルフについては、分を5で割ることを検討すれば、おそらく数バイトのゴルフをすることができます。また、c関数内で移動することもできます。そうすることでバイトを失うべきではありませんが、これは関数よりもスニペットのようになります(少なくとも、私にとっては、JSの達人はそうではないと言うでしょう)。
オリビエグレゴワール

4

JavaScript(ES6)360

入力パラメーターが時間(0..23)および分(0..59)の関数。たとえそれが不便であってもjavascriptの標準出力関数であるため、出力に
使用alertします。(そして短いです)

(k,n,m=(n+2)/5|0,h=(k+(m>6))%12,i=0)=>alert(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>[,,m-6,m-2&&m-10,m-3&&m-9,m-4&&m-8&&m-5&&m-7,m-1&&m-11&&m-5&&m-7,!(m%3),m<7|m==12,!m|m>6,h-2,h-3,h-1,h-4,h-5,h-6,h-7,h-8,h-9,h-10,h-11,h%12,m%12][i++]?w.replace(/./g,' '):w))

テスト注:安心のため、テストスニペットでアラート出力はページテキストにリダイレクトされます

F=
(k,n,m=(n+2)/5|0,h=(k+(m>6))%12,i=0)=>alert(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>[,,m-6,m-2&&m-10,m-3&&m-9,m-4&&m-8&&m-5&&m-7,m-1&&m-11&&m-5&&m-7,!(m%3),m<7|m==12,!m|m>6,h-2,h-3,h-1,h-4,h-5,h-6,h-7,h-8,h-9,h-10,h-11,h%12,m%12][i++]?w.replace(/./g,' '):w))

function alert(x) { O.textContent=x }
function update() { F(+H.value,+M.value) }

update()
input { width:3em }
Hours<input id=H type=number min=0 max=23 value=17 oninput='update()'>
Minutes<input id=M type=number min=0 max=59 value=37 oninput='update()'>
<pre id=O></pre>


あなたの答えが大好きです!それからたくさんのことを学びました!しかし、角括弧のある矢印関数では何が起こっているのでしょうか?また、役割はi何ですか?空白以外のすべてのグループ(「LED」)を取得し、各グループに記述した条件に基づいて、それらを空白に置き換えることがわかります。たとえば、h-2がの場合のみfalse h == 2になるので、どこかでそれを反転させると思いますか?これがどのように機能するか少し説明できますか?おそらくあなたの答えの編集として?本当にありがたいです!
Hristiyan Dodov

更新-私はあなたがやっていることをほとんど実現しました。ゼロとゼロ以外の要素の配列があり、i正規表現が一致するたびにインクリメントすることにより、正しい要素を参照するために使用します。真実であれば、一致した文字列を空白に置き換えます。それ以外の場合はそのままにします。 しかし、私は一つのことを理解していません。 指定された関数(この場合は矢印関数)replace()戻り値を使用します。どこに値を返しますか?三項演算子が表示されます。
Hristiyan Dodov

3
@HristiyanDodov式だけで作られた矢印関数は、その式の値を返すだけです。例(a,b)=>{ return a+b }は、(a,b)=>a+b
edc65

4

Pythonの2、 466460449452459の 449バイト

hおよびmを整数として受け入れる関数として許可されているため、数バイトを節約できます。オンラインでお試しください

def t(h,m):


m=(2+m)//5
 h=h%12
 n=0
 if m>6:n,m=1,12-m;h+=1
 a="""IT IS _HALF _TEN_
 _QUARTER _TWENTY_
 _FIVE _MINUTES _TO_
 _PAST _TWO _THREE_
 _ONE _FOUR _FIVE_
 _SIX _SEVEN _EIGHT_
 _NINE _TEN _ELEVEN_
 _TWELVE _O'CLOCK""".split("_")
 b=[1,m==6,m==2,1,m==3,3<m<6,1,m in[1,5],m in[1,2,4],n*m,1,(1-n)*m,h==2,h==3,1,h==1,h==4,h==5,1,h==6,h==7,h==8,1,h==9,h==10,h==11,1,h==0,m==0]
 for i,c in enumerate(a):
  if b[i]:print c,
  else:print' '*len(c),

TO/ PASTvsのロジックにいくつかのバグ(現在修正済み)がありましたO'CLOCK。また、数バイトを保存したenumerate変更、importおよび19<m<26代わりにm in [20,25]。数分よりも5分のチャンク評価者で作業するためにさらに8を節約しました。Rodは私にかなりのコストがかかるバグをいくつか指摘しましたが、より効率的な割り当てと私の好意で機能するバグ修正で少し回復しました。


@TitusのPHPの回答からトリックを取ります。私は、Pythonの者に負けてる==の比較として、私は、私はいくつかの改善ができ数えるhテスト
クリス・H

ちょうどprint c最後の行で、cすでにa[i]期限が切れていますenumerate
ロッド

1
出力フォーマットが壊れている、print各印刷の後に改行を追加し、あなたはそれが追加抑えることができます,c。また、単語が印刷されない場合は空白スペースを印刷する必要があります。最後の場合は、elseで修正できますelse:print' '*len(c),
Rod

1
降順の場合、バイトの順序が優れています。
グルパッドママダプール

@Rod、バグスポットのおかげで、それはずっと長くなりますが
クリスH

2

Perl 6の308の 296 293バイト

->\h,\m{my \n=round(m/5)%12;say "IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK".subst: /\S+/,{++$==1|2|(0,7,4,5,6,(6|7),3)[min n,12-n]|8*?(n%3)|(23,10,9)[(n+5)/6]|(13,11,12,|(14..*))[(h+m/33-1)%12]??$_!!" "x.comb},:g}

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

説明

基本的な構造は次のとおりです。

-> \h, \m {                             # A lambda taking two args (hour and minute).
    my \n = round(m / 5) % 12;          # Index from 0 to 11, representing the minutes.
    say "...".subst: /\S+/, {           # Print the template with each word replaced:
        ++$ == ...|...|...|...          # If counter equals one of expected indices,
            ?? $_                       # then replace the word with itself,
            !! " " x .comb              # else replace it with spaces.
    }, :g                               # (Use global matching.)
}

...|...|...|...上記のように省略された式は、1から始まる単語インデックスを表す整数のジャンクションであり、次のように構成されます。

  1|2                                   # IT IS
| (0,7,4,5,6,(6|7),3)[min n,12-n]       # FIVE / TEN / QUARTER / TWENTY / TWENTY FIVE / HALF
| 8*?(n%3)                              # MINUTES
| (23,10,9)[(n+5)/6]                    # O'CLOCK / PAST / TO
| (13,11,12,|(14..*))[(h+m/33-1)%12]    # ONE / TWO / THREE / FOUR / FIVE / SIX / SEVEN / ...

2

Python3、(569バイト)

この答えは、形式で時間を要するミリメートルHH .Iが触発され、「\ n」が印刷さを持っているために管理(スペースで区切られた整数)クリスさん method.Thanks、クリス!コードを減らすための助けをいただければ幸いです。

H,M=input().split()
w="""HALF _TEN_
_QUARTER _TWENTY_
_FIVE _MINUTES _TO_
_PAST _TWO _THREE_
_ONE _FOUR _FIVE_
_SIX _SEVEN _EIGHT_
_NINE _TEN _ELEVEN_
_TWELVE _O'CLOCK""".split("_")
h,m=int(H),int(M)
if h>12:h-=12
m=(m//5+1)*5 if m%5>2.5 else m//5*5
if m>30:
    m=60-m
    h=(h+1)%12
X=[m==30,m==10,1,m==15,m in[20,25],1,m in[5,25],m not in[0,15,30],int(M)>30 and m!=0,1,m!=0 and int(M)<31,h==2,h==3,1,h==1,h==4,h==5,1,h==6,h==7,h==8,1,h==9,h==10,h==11,1,h in[0,12],m==0]
t="IT IS "
for i in range(0,28):
    if(X[i]):t+=w[i]
    else:t+=" "*len(w[i])
print(t.strip())

オンラインで試す


wを単一の文字列に結合してから使用でき.split(',')ますか?いくつかを保存する必要があります。
エルペドロ

またH,M=input()、入力がH、Mである場所として入力を受け取ります。ルールでは2つの整数シーケンスが許可されます
。Python3で

@ElPedroに感謝します。57バイトを保存しました。 H,M=input()あなたが疑ったように動作しませんでした。
EffyCoder

1

Python 2443の 440バイト

R=range
w="HALF TEN QUARTER TWENTY FIVE MINUTES TO PAST TWO THREE ONE FOUR FIVE SIX SEVEN EIGHT NINE TEN ELEVEN TWELVE O'CLOCK".split(' ')
h=[10,8,9]+R(11,20)
c=['IT','IS']+[' '*len(x)for x in w]
i,j=input()
i=(i,i+1)[j>30]%13-1
j=int(round(j/5.0)*5.0)%60
for z in[[20],[4,5,7],[1,5,7],[2,7],[3,5,7],[3,4,5,7],[0,7],R(3,7),[3,5,6],[2,6],[1,5,6],R(4,7)][j/5]:c[z]=w[z]
c[h[i]]=w[h[i]]
x=0
for y in[4]+R(6,22,3)+[23]:print' '.join(c[x:y]);x=y

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

それはおそらく、さらにいくつかのゴルフから恩恵を受ける可能性があります。入力は整数のリストです(例:7,23 = 7:23)


1

SimpleTemplate737 708バイト

ええ、冗長性と「実際の」数学の欠如は、バイトカウントをひどく傷つけました。

{@seth argv.0}{@php$DATA[m]=ceil($DATA[argv][1]/5)*5%60|0}{@ifm}{@ifm is30}{@setA"HALF"}{@/}{@if"@[15]0$@"is matchesm}{@setB"TEN"}{@/}{@if"@[14]5$@"is matchesm}{@setC"QUARTER"}{@/}{@if"@[24]0$@"is matchesm}{@setD"TWENTY"}{@/}{@if"@^[25]?5$@"is matchesm}{@setE"FIVE"}{@/}{@if"@^([235]?5|[1245]0)$@" is matchesm}{@setF"MINUTES"}{@/}{@ifm is greater30}{@setG"TO"}{@else}{@setH"PAST"}{@/}{@else}{@setU"O\'CLOCK"}{@/}{@setZ"","ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN","ELEVEN","TWELVE"}{@setY"J"}{@incbyh Y}{@php$DATA[$DATA[Y]]=$DATA[Z][$DATA[h]]}{@print"IT IS%-6s%s\n%8s%s\n%-5s%-7s %s\n%4s %3s %s\n%3s %4s %s\n%3s %5s %s\n%4s %3s %s\n%6s %s",A,B,C,D,E,F,G,H,J,K,I,L,M,N,O,P,Q,R,S,T,U}

これは、クラスの1番目と2番目のパラメーターとして時間と分を想定しています。


ゴルフをしていない:

{@set hour argv.0}

{@//The bitwise is required for the `@if minutes is 30`}
{@//Otherwise, I would be forced to write `@if minutes is equal to 30`}
{@php $DATA['minutes'] = ((ceil($DATA['argv'][1] / 5) * 5) % 60) | 0}

{@if minutes}
    {@if minutes is 30}
        {@set A "HALF"}
    {@/}
    {@if "@[15]0$@" is matches minutes}
        {@set B "TEN"}
    {@/}
    {@if "@[14]5$@" is matches minutes}
        {@set C "QUARTER"}
    {@/}
    {@if "@[24]0$@" is matches minutes}
        {@set D "TWENTY"}
    {@/}
    {@if "@^[25]?5$@" is matches minutes}
        {@set E "FIVE"}
    {@/}
    {@if "@^([235]?5|[1245]0)$@" is matches minutes}
        {@set F "MINUTES"}
    {@/}
    {@if m is greater than 30}
        {@set G "TO"}
    {@else}
        {@set H "PAST"}
    {@/}
{@else}
    {@set U "O\'CLOCK"}
{@/}


{@set numbers "", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE"}
{@set key "J"}
{@inc by hour key}
{@php $DATA[$DATA['key']] = $DATA['numbers'][$DATA['hour']]}

{@print "IT IS%-6s%s\n%8s%s\n%-5s%-7s %s\n%4s %3s %s\n%3s %4s %s\n%3s %5s %s\n%4s %3s %s\n%6s %s", A, B, C, D, E, F, G, H, J, K, I, L, M, N, O, P, Q, R, S, T, U}

実行方法:

  1. からコードを取得する https://github.com/ismael-miguel/SimpleTemplateます
  2. 次のコードを実行します。

    <?php
        include 'SimpleTemplate.php';
    
        $template = new SimpleTemplate('<code>');
    
        $template->render($hour, $minutes);
    
        //system-time: $template->render(date('g'), date('i'));
    
  3. できた!


1

Java(OpenJDK 9)、437バイト

(h,m)->{h=(h+m/35+11)%12+1;Object[]s="HALF TEN QUARTER TWENTY FIVE MINUTES TO PAST TWO THREE ONE FOUR FIVE SIX SEVEN EIGHT NINE TEN ELEVEN TWELVE O'CLOCK".split(" ");for(int i=s.length,M[]={1<<20,176,162,132,168,184,129,120,104,68,98,112};i-->0;)s[i]=(7<i&i<20?h==i-(h>3?7:h>1?6:9):(M[(m+2)/5%12]&(1<<i))>0)?s[i]:"";System.out.printf("IT IS %4s %3s%n%7s %6s%n%4s %7s %2s%n%4s %3s %5s%n%3s %4s %4s%n%3s %5s %5s%n%4s %3s %6s%n%6s %7s",s);}

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

私は最終的に私の挑戦に打撃を与えると思った;)


1

Perl 5の487の 449バイト

($a,$_,$h)=localtime;s/[3-7]$/5/;s/[12]$/0/;$m=s/(.?)[89]$/($1+1)*10/er;$_="IT IS half ten
quarter tw
five minutes to
past 2two 3three
1one 4four 5five
6six 7seven 8eight
9nine 10ten 11eleven
12twelve oc";if($m>30){s/to/TO/;$h++;$m=60-$m}elsif($m){s/past/PAST/}$h=$h%12||12;$m!=30?$m%15?s/m\w+/uc$&/e:$m?s/q\w+/uc$&/e:s/oc/O'CLOCK/:s/half/HALF/;$m%10&&!/Q/&&s/five/FIVE/;$m>15&&$m<30?s/tw/TWENTY/:$m==10&&s/ten/TEN/;s/\b$h\w+/uc$&/es;y/a-z0-9/ /;say

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.