단어 시계 인쇄


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. 인쇄 시간은 12 시간이지만 AM / PM은 없습니다.
  2. 반올림은 분 단위로만 수행됩니다 (초는 완전히 관련이 없음). 반올림은 5의 가장 가까운 배수로 수행됩니다. 예를 들어 17:52:38이 실제로 17:55에 가장 가깝지만 초가 관련이 없으므로 17:52는 실제로 17:50으로 내림됩니다. 인쇄 된 텍스트는 "6 분에 10 분입니다"(관련된 간격으로)입니다. 따라서 XX5의 배수 라면 XXHH : (XX-2) : 00에서 HH : (XX + 2) : 59까지 사용됩니다. 단어 MINUTESFIVE, TEN또는 TWENTY분 섹션에서 켜져 있어야합니다 ( "TO"또는 "PAST"앞).
  3. 위의 템플릿에서 텍스트가있는 곳에 텍스트를 유지하기 위해 필요한만큼의 공백으로 대체합니다. 후행 공백이 잘릴 수 있습니다. 텍스트를 예상 위치에 유지하는 것과 관련된 공간을 유지해야합니다.
  4. 후행 줄도 잘릴 수 있습니다. 관련 빈 줄이 여전히 나타나야합니다. 예:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. 이 값이 시간을 나타내는 경우 TEN첫 번째 줄이나 FIVE세 번째 줄에 불을 켜지 마십시오 .

  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
큰 도전, 난 정말 좋아!
Timtech

답변:


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

골프 :

  • $x/5+.5|0보다 2 바이트 짧습니다 round($x/5).
  • 두 번의 호출은 결과를 변수에 date(h)할당하는 것보다 1 바이트 짧습니다 date.
  • 단일 어설 션을 사용하여 라이트 업 인덱스가 저장된 변수를 골라냅니다.
  • 배열 대신 라이트 업 인덱스의 문자열은 약 30 바이트를 절약했습니다 .
  • $w<A세 바이트보다 짧은 바이트입니다 $w=="\n"-구분 기호 뒤에 공백이 없는지 확인하십시오!
  • abs 분 단어에 8 바이트를 저장했습니다.
  • 감사합니다 @Christoph :지도에서 숫자에서 문자로 이동하면 구분 기호가 더 이상 사용되지 않고 배열 대신 문자열이 하나 더 허용되었습니다. 23 + 8 바이트를 절약했습니다 .
    밑줄을 첫 번째 색인으로 사용하여 "it is"대안에 포함시킬 수 있습니다. 그리고 그것은 시간에 대한 인용을 쓸모 없게 만들었다.
  • 1시간 맵에서 값을 복제하면 모듈로가 더 이상 사용되지 않으며 추가 골프를 치는 경우 10 바이트가 절약됩니다. @Christoph에서 영감을 얻었습니다.
  • 줄 바꿈과 공백을 하드 코딩하는 대신 19 바이트를 줄 였습니다.
  • 문자열의 비트 로직은 7 바이트를 절약합니다 : str_pad("",strlen($w))-> $w^$w^" ". (크리스토프)
  • 경우 strtr의 두 번째 매개 변수에는 문자열이 없다, 그것은 아스키 코드로 해석됩니다. 5 바이트를 절약합니다.

이것은 매우 좋군요! 질문을 해결할 수있을 때 Java 로이 구현을 시도했지만 결국 너무 복잡하여 포기하고 더 길지만 더 간단한 접근 방식을 사용했습니다! 내가 실패한 곳에서 성공한 것을
Olivier Grégoire

1
나머지를 때리는 : $i++%3^($i<3)to $i++%3^$i<3. 나는 공식적으로 지금 완전히 낭비되고 있습니다. 누군가 우리와 일치 할 때까지 휴식을 취하겠습니다. 정말 재미 있었다. 팀워크에 대해 Titus에게 감사합니다!
Christoph

1
@ 크리스토프 당신은 ... 작은 단어로 보인다. \ o /
Titus

18

TI-기본, 335 334 바이트

TI-84 calc는 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 : 이것은 입력을 잘 인쇄하지만, asethetic 한 이유로 프로그램 종료시 프로그램 종료시 메시지 Pause를 피하기를 원할 것입니다 Done.

편집 : 토큰 화되어 바이트 수가 줄어 들었습니다 (이전 개정판 참고 참조). @Neil 덕분에 버그가 수정되었습니다. 셋째, 내가 찾은 버그를 수정하여 2 바이트의 비용이 들었지만 최적화는 실제로 전체적으로 1 바이트를 절약했으며 입력을 받고 있다는 것을 깨달았으므로 전화를 걸 필요가 없습니다 getTime(duh?). 마지막으로이 바이트 수를 확인하려는 사람은 2 바이트 토큰 만입니다 sub(.


O'CLOCK코드를 출력 한 후에도 출력 을 계속할 것으로 보입니다 PAST...
Neil

2
나는 545 바이트를 계산해 주시겠습니까?
Christoph


1
@ OlivierGrégoire 사실 그것은 이전 줄과 전혀 관련이 없습니다. 그것이하는 일은 24 시간에서 12 시간으로 변환하고 가장 가까운 시간으로 변환하는 것입니다 (예 : 분을 계산하는 반올림). 기본적으로 일반 언어 x+(y>32) mod 12에서는 TI-Basic에서와 같이 비교 결과가 1 또는 0 인 경우와 유사합니다.
Timtech

1
그래서 @Christoph 그것은 당신이 그 링크로 당신의 자신의 질문에 대답 한 것처럼 보입니다, 당신은 여전히 ​​설명을 원하십니까? ASCII 스코어링에서 토큰 화로 전환 한 위치를 확인하려면 개정 # 4를 확인하십시오.
Timtech

11

자바 스크립트 (ES6), 291 (303) 295 바이트

카레 구문으로 두 개의 정수로 입력을받습니다. (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)))

작동 원리

전체 시계는 ON 또는 OFF 인 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             

분의 하나가 언뜻 생각으로 우리가 올바른 단어를 사용하도록 구현해야하는 논리는 간단하지 않습니다. 마술 골프 공식이 존재할 수 있지만 쉬운 방법으로 가서 가능한 각 구성을 하드 코딩하기로 결정했습니다.

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 아, 맞아. 고정되어 있습니다.
Arnauld

매우 시원합니다. 시간이 잘못되었다는 것을 제외하고 :-( 표시 : h = 13 m = 15 실제 시간 : 14:43
Strawberry

@Strawberry 규칙 # 6을 참조하십시오. 이 구현은 현지 시간이 아닌 입력을 독점적으로 사용하고 있습니다.
Arnauld

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다음 두 줄 각각의 후행 공백과 5 개의 후행 공백.


나는 그것을 실행했고 그것은 잘 작동합니다 (3 시간 동안 하나의 누락 된 공간). 나는 단지 무슨 일이 일어나고 있는지 이해하지 못합니다 ( call:c예를 들어)! 아마 배치를 배워야 할 것입니다 :)
Olivier Grégoire

@ OlivierGrégoire 슬프게도 공간이 사라졌지 만 이제는 고정되었습니다.
Neil

4

자바 스크립트, 567564551542 529 527 519 바이트

시간과 분을 인수로 취하는 것이 괜찮은지 모르겠습니다. "정수 목록"이라고했습니다. 아직도 계산 되나요?

그건 그렇고 내 골프는 처음이야. 어떻게 생각해?


편집 : 분을 나누어 몇 바이트를 절약했습니다. 고마워, 올리비에!


그렇습니다.이 규칙의 기본 개념은 인수를 입력 할 수 있지만 입력과 관련된 경우에만 인쇄 할 수 있다는 것입니다.
Olivier Grégoire

1
골프와 관련하여 분을 5로 나누는 것을 고려하면 아마도 몇 바이트를 골프로 칠 수 있습니다. 또한 c함수 내부 로 이동하고 싶을 수도 있습니다 . 그렇게하면 바이트를 잃어 버리지 않아야하지만, 이것은 함수보다 스 니펫과 비슷하게 만듭니다 (적어도 JS 전문가는 다르게 말할 것입니다).
Olivier Grégoire

4

자바 스크립트 (ES6) 360

입력 매개 변수 시간 (0..23) 및 분 (0..59)이있는 기능. 불편한 경우에도 자바 스크립트의 표준 출력 함수이므로 출력에
사용 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의 경우에만 거짓 h == 2이므로 어딘가에 반전한다고 가정합니까? 이것이 어떻게 작동하는지 조금 설명해 주시겠습니까? 아마도 귀하의 답변을 편집 한 것입니까? 정말 고마워요!
Hristiyan Dodov

업데이트-나는 당신이하는 일을 거의 깨달았습니다. 0과 0이 아닌 요소로 구성된 배열이 있으며 i각 정규식 일치 후 증가하여 올바른 요소 를 참조하는 데 사용 합니다. 그것이 사실이라면, 당신은 일치하는 문자열을 공백으로 대체하고, 그렇지 않으면 그대로 둡니다. 그래도 한 가지 이해하지 못한다. 지정된 함수 (이 경우 화살표 함수) replace()반환 값 을 사용합니다 . 어디에서 값을 반환합니까? 나는 삼항 연산자를 본다.
Hristiyan Dodov

3
@HristiyanDodov 식으로 만 구성된 화살표 함수는 해당 식의 값을 반환합니다. 예 (a,b)=>{ return a+b }:(a,b)=>a+b
edc65

4

파이썬 2, 466 , 460 , 449 , 452 , 459 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 답변에서 유용한 정보를 얻습니다. 나는 파이썬의에게 잃고 ==비교 나는 내가 몇 가지 개선 할 수 이해 할수 h테스트
크리스 H

당신은 print c마지막 줄에 c이미있을 a[i]예정입니다enumerate
Rod

1
출력 형식이 깨져서 print각 인쇄 후에 줄 바꿈을 추가하면 ,after 추가를 억제 할 수 있습니다 c. 또한 단어가 인쇄되지 않으면 빈 공간을 인쇄해야합니다. 마지막 경우에 다른 것으로 수정할 수 있습니다else:print' '*len(c),
Rod

1
내림차순이면 바이트 순서가 더 좋습니다.
Gurupad Mamadapur

@Rod, 버그 스팟에 감사합니다. 비록 훨씬 더 길어졌지만
Chris H

2

펄 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 mm (공백으로 구분 된 정수) 형식의 시간이 필요합니다 . '\ n'을 인쇄했습니다 .Chris 방법에서 영감을 얻었습니다. 감사합니다, Chris! 코드를 줄이는 데 도움을 주시면 감사하겠습니다.

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(',')있습니까? 몇 가지를 저장해야합니다.
ElPedro

또한 H,M=input()입력이 H, M 인 곳으로 입력하십시오. 규칙에 따라 두 개의 정수 시퀀스가 ​​허용됩니다. 이것이 Python 3에서 의도 한대로 작동하는지 확실하지 않습니다. 나는 여전히 2 명의 남자입니다 :-)
ElPedro

감사합니다 @ElPedro. 저장 57 바이트. H,M=input()의심 한대로 작동하지 않았습니다.
EffyCoder 2018 년

1

파이썬 2 , 443440 바이트

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

SimpleTemplate , 737708 바이트

네, 자세한 표현과 "실제"수학이 부족하면 바이트 수가 크게 나빠졌습니다.

{@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}

클래스의 첫 번째 및 두 번째 매개 변수로 시간과 분이 필요합니다.


언 골프 드 :

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

자바 (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.