Sederhanakan suatu Tanggal

9

Ini mirip dengan penyederhanaan fraksi, tetapi dengan Tanggal!

Input dari program Anda harus dalam bentuk mm/dd Misalnya

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

Kami berasumsi bahwa input akan valid sehingga bulan memiliki jumlah hari di dalamnya:

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

Tugas program Anda adalah mengambil input yang dianggap benar, dan secara iteratif (atau secara rekursif) menyederhanakan tanggal, dan pada setiap iterasi (termasuk tanggal 0), buat tanggal dengan nama lengkap bulan seperti tertulis di atas.

Sebagai contoh:

Diberikan input dari:

12/18

Akan menghasilkan

December 18
June 9
February 3

Input yang sudah disederhanakan hanya menghasilkan sendiri:

11/17

Output:

November 17

Nama bulan tidak dapat berasal dari fungsi dalam bahasa Anda. String dapat dikaburkan, dihitung, sesuka Anda, tetapi Anda tidak dapat menggunakan fungsi standar seperti GetMonthString (4) atau sesuatu, Anda harus menulis fungsi itu, atau menemukan cara untuk menampilkan nama bulan seperti yang dijelaskan.

Saya tidak dapat memikirkan kasus di mana tanggal yang disederhanakan menghasilkan tanggal yang ilegal, tetapi jika pernah Anda menghasilkan tanggal yang ilegal di sepanjang jalan, hasilnya:

Illegal Date

Tetapi jika Anda yakin ini tidak dapat terjadi, Anda tidak perlu memiliki kode yang mencakup kasus ini. Tanggal yang dikeluarkan hanya selalu perlu valid sesuai dengan apa yang dijelaskan di atas (tidak perlu dikatakan bahwa bulan dan hari mulai dari 1).

Algoritma:

Pada setiap iterasi Anda membaginya dengan angka terkecil yang membagi pembilang dan penyebut.

Artinya, Anda menemukan semua angka sehingga, membagi pembilang dan penyebut dengan angka ini menghasilkan pembilang dan penyebut baru yang keduanya bilangan bulat (faktor umum). Pilih yang terkecil dan pisahkan pembilang dan penyebut untuk menghasilkan pecahan baru. Jika satu-satunya angka yang dapat Anda bagi dengan adalah 1, maka Anda telah menyederhanakan sebanyak mungkin dan Anda berhenti.

Saya harap ini jelas.

Bahasa apa pun diizinkan. Ini Golf Code, kode terpendek menang!

jmasterx
sumber
pertanyaan ditutup ketika saya memposting jawaban. Doh!
t-clausen.dk
@ t-clausen.dk Tantangan telah dibuka kembali.
AdmBorkBork
Mengapa dari 12/18ke 6/9dan tidak 4/6(saya tidak mendapatkan semua kekacauan iterasi ... ketika saya menyederhanakan sebagian kecil saya langsung mendapatkan nilai yang disederhanakan)?
edc65

Jawaban:

2

Jelly , 59 byte

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

Cobalah online!

Bagaimana itu bekerja

ṣ”/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.
Dennis
sumber
4

Pyth - 116 87 byte

jm++@rR3c."ayÖèÈÒ+J÷z4wëÝ~ñ!Õ¥´{mCØóy|å²z¼qP?ë"\qhd;ed.u/RYNPiFKsMcz\/K

Test Suite .

Maltysen
sumber
Penjelasannya tolong? : 3
Downgoat
0

TSQL 296 byte

Tidak diizinkan untuk menggunakan nama file standar yang membuat saya kehilangan banyak byte, namun untuk menghemat beberapa byte, saya menggunakan 3 karakter pertama dari deskripsi tanggal default (dengan format mon dd yyyy hh: miAM (atau PM)) dan menambahkan sisa nama bulan.

Golf:

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

Cobalah online

Tidak Disatukan:

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
t-clausen.dk
sumber
Umm ... apa yang dilakukan dua baris pertama di sana ???
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ baris pertama memberitahu database mana yang akan digunakan untuk skrip ini, baris kedua mendeklarasikan variabel input. Saya belum memasukkan mereka ke dalam penghitungan karena mereka menentukan di mana untuk mengeksekusi skrip dan mengatakan apa variabel inputnya
t-clausen.dk
Saya melihat '12/2'di baris kedua, apakah Anda yakin Anda mengatakan yang sebenarnya?
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Saya khawatir saya tidak mengerti pertanyaan Anda
t-clausen.dk
Saya pikir Anda menggunakan tanggal hard-kode, meskipun saya tidak yakin apakah STDIN didukung dalam SQL dan varian ... Juga, tampaknya Anda salah eja Septemberdengan Septemper. 'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik the Outgolfer