Đơn giản hóa một ngày


9

Điều này tương tự với việc đơn giản hóa các phân số, nhưng với Ngày!

Đầu vào của chương trình của bạn phải có dạng mm/dd Ví dụ

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

Chúng tôi giả định rằng đầu vào sẽ hợp lệ sao cho các tháng có số ngày này trong đó:

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

Công việc của chương trình của bạn là lấy đầu vào hợp lệ giả định và lặp lại (hoặc đệ quy) đơn giản hóa ngày và tại mỗi lần lặp (bao gồm 0), xuất ngày với tên đầy đủ của tháng như được viết ở trên.

Ví dụ:

Đưa ra một đầu vào của:

12/18

Sẽ xuất

December 18
June 9
February 3

Một đầu vào đã được đơn giản hóa chỉ xuất ra chính nó:

11/17

Đầu ra:

November 17

Tên tháng không thể đến từ một chức năng trong ngôn ngữ của bạn. Các chuỗi có thể bị xáo trộn, tính toán, tuy nhiên bạn thích, nhưng bạn không thể sử dụng một hàm tiêu chuẩn như GetMonthString (4) hoặc một cái gì đó, bạn phải viết hàm đó hoặc tìm cách xuất tên tháng như mô tả.

Tôi không thể nghĩ về bất kỳ trường hợp nào mà ngày đơn giản hóa tạo ra một ngày bất hợp pháp, nhưng nếu bạn tạo ra một ngày bất hợp pháp trên đường đi, hãy xuất ra:

Illegal Date

Nhưng nếu bạn chắc chắn điều này không thể xảy ra, bạn không cần phải có mã bao gồm trường hợp này. Ngày xuất ra chỉ cần luôn có giá trị theo những gì được mô tả ở trên (không cần phải nói rằng tháng và ngày bắt đầu từ 1).

Thuật toán:

Ở mỗi lần lặp, bạn chia cho số nhỏ nhất chia tử số và mẫu số.

Nghĩa là, bạn tìm thấy tất cả các số sao cho việc chia cả tử số và mẫu số cho số này sẽ tạo ra một tử số và mẫu số mới là cả hai số nguyên (các thừa số chung). Chọn cái nhỏ nhất và chia riêng tử số và mẫu số để tạo ra một phân số mới. Nếu số duy nhất bạn có thể chia cho 1, thì bạn đã đơn giản hóa càng nhiều càng tốt và bạn dừng lại.

Tôi hy vọng điều này là rõ ràng.

Bất kỳ ngôn ngữ được cho phép. Đây là Code Golf, chiến thắng mã ngắn nhất!


Câu hỏi đã được đóng lại trong khi tôi đang đăng một câu trả lời. Đừng!
t-clausen.dk

@ t-clausen.dk Thử thách đã được mở lại.
admBorkBork

Tại sao từ 12/18đến 6/9và không 4/6(tôi không nhận được tất cả các mớ lặp lại ... khi tôi đơn giản hóa một phần tôi nhận được ngay lập tức giá trị đơn giản hóa kết quả)?
edc65

Câu trả lời:


2

Thạch , 59 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ṣ”/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 byte

Không được phép sử dụng tên dữ liệu tiêu chuẩn khiến tôi mất rất nhiều byte, tuy nhiên để tiết kiệm một vài byte, tôi đã sử dụng 3 ký tự đầu tiên của mô tả ngày mặc định (với định dạng mon dd yyyy hh: miAM (hoặc PM)) và thêm phần còn lại của tháng tên.

Chơi gôn

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

Dùng thử trực tuyến

Ung dung:

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

Umm ... hai dòng đầu tiên làm gì ở đó ???
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ dòng đầu tiên là cho biết cơ sở dữ liệu nào sẽ sử dụng cho tập lệnh này, dòng thứ hai đang khai báo biến đầu vào. Tôi chưa bao gồm chúng trong số đếm khi chúng xác định vị trí thực thi tập lệnh và cho biết biến đầu vào là gì
t-clausen.dk

Tôi thấy một '12/2'dòng trên dòng thứ hai, bạn có chắc bạn đang nói với tôi sự thật?
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Tôi e rằng tôi không hiểu câu hỏi của bạn
t-clausen.dk

Tôi nghĩ rằng bạn đang sử dụng một ngày mã hóa cứng, mặc dù tôi không chắc chắn nếu STDIN được hỗ trợ trong SQL và các biến thể ... Ngoài ra, có vẻ như bạn sai chính tả Septembervới Septemper. 'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik the Outgolfer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.