날짜 단순화


9

이것은 분수를 단순화하는 것과 비슷하지만 날짜가 있습니다!

프로그램의 입력은 형식이어야합니다 mm/dd 예를 들어,

3/4 //March 4
12/15 //December 15
1/1 // January 1

우리는 입력이 유효 할 것으로 가정합니다.

January 31
February 28
March 31
April 30
May 31
June 30
July 31
August 31
September 30
October 31
November 30
December 31

프로그램의 작업은 가정 된 유효한 입력을 취하고 날짜를 반복적으로 (또는 재귀 적으로) 단순화하고 반복 할 때마다 (0을 포함하여) 위에 작성된 달의 전체 이름으로 날짜를 출력하는 것입니다.

예를 들면 다음과 같습니다.

다음과 같은 입력이 주어집니다.

12/18

출력 할 것이다

December 18
June 9
February 3

이미 단순화 된 입력은 자체 출력 만합니다.

11/17

출력 :

November 17

월 이름은 해당 언어의 함수에서 올 수 없습니다. 문자열을 난독 처리하고 계산할 수 있지만 원하는대로 GetMonthString (4)과 같은 표준 함수를 사용할 수 없으며 해당 함수를 작성하거나 설명 된대로 월 이름을 출력 할 방법을 찾아야합니다.

단순화 된 날짜가 불법 날짜를 생성하는 경우는 생각할 수 없지만 그 과정에서 불법 날짜를 생성하는 경우 출력 :

Illegal Date

그러나 이것이 일어날 수 없다고 확신한다면,이 경우를 다루는 코드가 필요하지 않습니다. 출력 날짜는 항상 위에서 설명한 내용에 따라 항상 유효해야합니다 (달과 일이 1에서 시작한다는 것은 말할 것도 없습니다).

알고리즘 :

각 반복에서 분자와 분모를 나누는 가장 작은 숫자로 나눕니다.

즉, 분자와 분모를이 숫자로 나누면 정수 (공통 요소) 인 새로운 분자와 분모가 생성됩니다. 가장 작은 것을 선택하고 분자와 분모를 개별적으로 나눠서 새로운 분수를 만듭니다. 나눌 수있는 유일한 숫자가 1이면 가능한 한 단순화 한 다음 중지합니다.

이것이 분명하기를 바랍니다.

모든 언어가 허용됩니다. 이것은 코드 골프, 가장 짧은 코드 승리입니다!


답변을 게시하는 동안 질문이 마감되었습니다. 도!
t-clausen.dk

@ t-clausen.dk 도전이 재개되었습니다.
AdmBorkBork

이유에서 12/186/9가 아니라 4/6(내가 immedialtely있어 일부 결과 단순화 된 값을 간단하게 때 나는 ... 모든 반복 혼란을하지 않음)?
edc65

답변:


2

젤리 , 59 바이트

ṣ”/VµÆDf/2ị:@µÐĿị1¦€“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»ṣ⁶¤j€⁶j⁷

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

작동 원리

ṣ”/VµÆDf/2ị:@µÐĿị1¦€“...»ṣ⁶¤j€⁶j⁷  Main link. Argument: mm/dd

ṣ”/                                Split at slashes.
   V                               Eval each chunk, yielding [m, d] (integers).
    µ                              Begin a new, monadic chain. Argument: [m, d]
             µÐĿ                   Execute the chain to the left until the results
                                   are no longer unique. Yield the list of all
                                   intermediate results.
     ÆD                              Compute the divisors of each number.
       f/                            Intersect them.
         2ị                          Select the one at index 2. If there is only
                                     one divisor, ị wraps around and selects 1.
           :@                        Divide [m, d] by this common divisor.
                        ¤            Combine the links to the left into a chain.
                 “...»                 Yield the month's name, space-separated.
                      ṣ⁶               Split at spaces.
                €                    For each pair...
             ị                          index into the month's names...
              1¦                        for the first element.
                         j⁶€         Join each pair, separating by spaces.
                            j⁷       Join, separating by linefeeds.


0

TSQL 296 바이트

표준 날짜 이름을 사용할 수 없으므로 많은 바이트가 필요하지만 몇 바이트를 절약하기 위해 기본 날짜 설명의 처음 3자를 mon dd yyyy hh : miAM (또는 PM) 형식으로 사용하고 달 이름의 나머지.

골프 :

use master
DECLARE @ varchar(5) = '12/2'

DECLARE @m int=month('2000/'+@),@d INT=day('2000/'+@)WHILE @m>0BEGIN PRINT left(dateadd(d,@m*29,0),3)+choose(@m,'uary','uary','ch','il','','e','y','ust','tember','ober','ember','ember')+' '+LEFT(@d,2)SELECT @m/=min(n),@d/=min(n)FROM(SELECT number FROM spt_values)x(n)WHERE @m%n+@d%n=0 and n>1 END

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

언 골프 드 :

use master
DECLARE @ varchar(5) = '12/2'

DECLARE @m int=month('2000/'+@),@d INT=day('2000/'+@)
WHILE @m>0
BEGIN
PRINT
 left(dateadd(d,@m*29,0),3)
 +choose(@m,'uary','uary','ch','il','','e','y','ust',
  'tember','ober','ember','ember')+' '+LEFT(@d,2)
SELECT @m/=min(n),@d/=min(n)
FROM
(
  SELECT number
  FROM spt_values
)x(n)
WHERE
  @m%n+@d%n=0
  and n>1
END

음 ... 거기서 처음 두 줄은 무엇입니까 ???
Outgolfer Erik

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ 첫 번째 줄은이 스크립트에 사용할 데이터베이스를 말하고 두 번째 줄은 입력 변수를 선언합니다. 그들이 스크립트를 실행하고 입력 변수가 무엇인지 이야기 할 위치를 정의로 나는 카운트를 포함하지 않은
t-clausen.dk

내가 보는 '12/2'두 번째 줄에, 당신은 당신이 저에게 진실을 말하고 있는지입니까?
Outgolfer Erik

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ 귀하의 질문을 이해하지 못합니다
t-clausen.dk

STDIN이 SQL 및 변형에서 지원되는지 확실하지 않지만 하드 코딩 된 날짜를 사용하고 있다고 생각합니다 ... 또한 철자 September가 틀린 것 같습니다 Septemper. 'temper','ober','ember','ember')+' '+LEFT(@d,2)
Outgolfer Erik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.