Thời gian nào trong unicode?


12

Thách thức rất đơn giản, với thời gian đầu vào là một chuỗi ở bất kỳ một trong các định dạng sau:

hh, hh:mmHoặc hh:mm:ssvới 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 590 ≤ ss ≤ 59 .

Xuất ra thời gian hiện tại nó đang sử dụng các ký hiệu sau:

AA  LABEL FOR CHARACTER     CODE POINT   HEXADECIMAL
==  ====================    ==========   ===========
🕐  Clock Face 01 Oclock    128336       0x1F550  
🕑  Clock Face 02 Oclock    128337       0x1F551  
🕒  Clock Face 03 Oclock    128338       0x1F552  
🕓  Clock Face 04 Oclock    128339       0x1F553  
🕔  Clock Face 05 Oclock    128340       0x1F554  
🕕  Clock Face 06 Oclock    128341       0x1F555  
🕖  Clock Face 07 Oclock    128342       0x1F556  
🕗  Clock Face 08 Oclock    128343       0x1F557  
🕘  Clock Face 09 Oclock    128344       0x1F558  
🕙  Clock Face 10 Oclock    128345       0x1F559  
🕚  Clock Face 11 Oclock    128346       0x1F55A  
🕛  Clock Face 12 Oclock    128347       0x1F55B  

Theo định dạng sau:

It is currently {Clock Face 1} with {mm} minutes and {ss} seconds until {Clock Face 2}.

Ví dụ (Bao gồm tất cả các trường hợp bên lề):

Trường hợp chỉ có vài giờ ...

f("12") = "It is currently 🕛."

Trường hợp với giờ và phút ...

f("12:30") = "It is currently 🕛 with 30 minutes until 🕐."

Trường hợp chỉ có giờ, nhưng có phút bao gồm 00 ...

f("12:00") = "It is currently 🕛."

Trường hợp với giờ, phút và giây ...

f("12:30:30") = "It is currently 🕛 with 29 minutes and 30 seconds until 🕐."

Trường hợp có giờ và phút, nhưng có giây bao gồm 00 ...

f("12:30:00") = "It is currently 🕛 with 30 minutes until 🕐."

Trường hợp với giờ và phút, với ít hơn một phút cho đến giờ tiếp theo ...

f("12:59:59") = "It is currently 🕛 with 1 seconds until 🕐."

Bạn không phải thay đổi từ số nhiều sang số ít.


Trường hợp với giờ và phút, với 1 phút đến giờ tiếp theo ...

f("12:59") = "It is currently 🕛 with 1 minutes until 🕐."

Bạn không phải thay đổi từ số nhiều sang số ít.


Trường hợp sử dụng thời gian quân sự (vâng, bạn phải xử lý việc này) ...

f("23:30:30") = "It is currently 🕚 with 29 minutes and 30 seconds until 🕛."

Các trường hợp không hợp lệ ...

f("PPCG") = This cannot occur, you are guaranteed a valid format by the definition of the problem.
f(66:66:66) = This cannot occur, you are guaranteed valid numbers by the definition of the problem.
f(24:60:60) = This cannot occur, you are guaranteed valid numbers by the definition of the problem.

Bạn không phải tuân theo bất kỳ kiểu đầu ra nào cho các trường hợp không hợp lệ, lỗi vẫn ổn.


Nhìn chung, thử thách này khá đơn giản, nhưng dường như tôi đủ năng động để vui vẻ theo ý kiến ​​của tôi. Mã ngắn nhất ở đây là người chiến thắng vì không có nhiều khía cạnh khác nhau đối với mã ngoài độ dài.



Đây có nên là toàn bộ chương trình hay là một chức năng / lambda đủ?
devR Rich

2
Tôi nghĩ rằng thay vì 0 < hh < 24, 0 < mm < 600 < ss < 60, bạn có nghĩa là 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 590 ≤ ss ≤ 59.
Erik the Outgolfer

2
Cấu trúc Date / DateTime cụ thể của ngôn ngữ có được phép làm đầu vào không?
devRicher

2
@carcusocomputing Bạn xác định rằng mã phải xử lý thời gian 24 giờ, mã có phải xử lý AMhoặc PMthẻ không?
Taylor Scott

Câu trả lời:


3

Befunge, 256 250 byte

>&~85+`v
8~-&"<"_00v`+5
0v%\-&"<<"_
v>:00p!!-"<"%10p65++:66+%0" yltnerruc si tI">:#,_$"Hu 5x"2*,3*,+,2*+,10g00g+
_".",@,".",+*2,+,*3,*2"x5 uH"%+66+1$_,#!>#:<v0
" litnu  htiw ",,,,,,10g:>#v_$"sdnoces"00g.^>
_>,,,,,,,>" dna ">,,,,,00^ >."setunim"00g!#^

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

Các kết quả được mã hóa dưới dạng utf-8, vì nó hoạt động tốt nhất với TIO, nhưng nếu bạn đang kiểm tra cục bộ, bạn có thể cần điều chỉnh trang mã mặc định của hệ thống để xem mặt đồng hồ chính xác. Mặt khác, chỉ cần chuyển hướng đầu ra đến một tệp và mở nó trong trình soạn thảo tương thích utf-8.

Giải trình

Ba dòng đầu tiên đọc số giờ và giây từ stdin, kiểm tra EOF hoặc nguồn cấp dữ liệu sau mỗi giá trị và thay thế số không cho các thành phần bị thiếu từ đầu vào. Trên dòng bốn, chúng tôi điều chỉnh giá trị phút nếu số giây khác không, chuyển đổi giá trị giờ thành phạm vi 0 thành 11 (để khớp với ký tự unicode thích hợp cho mỗi giờ) và viết ra phần ban đầu của đầu ra, bao gồm mặt đồng hồ đầu tiên.

Tại thời điểm này, chúng ta cần theo các nhánh khác nhau tùy thuộc vào thành phần nào khác không. Thử nghiệm đầu tiên, ở đầu dòng năm, chỉ kiểm tra xem cả hai phút và giây có bằng không. Nếu vậy, chúng tôi viết ra một cuối cùng .và thoát. Mặt khác, dòng sáu và bảy xử lý các trường hợp còn lại - viết ra văn bản và giá trị phù hợp, trước khi tất cả các đường dẫn kết hợp lại trên dòng năm để viết ra mặt đồng hồ cuối cùng (thực hiện từ phải sang trái).


3

JavaScript (ES6), 201

t=>(T=h=>String.fromCodePoint(128336+h%12),[h,m,s]=t.match(/\d+/g),'It is currently '+T(h-=~10)+((m-=-!!-s)?` with ${60-m?60-m+' minutes'+(-s?' and ':''):''}${-s?60-s+' seconds':''} until `+T(-~h):''))

Ít chơi gôn

t=>(
  T=h=>String.fromCodePoint(128336+h%12),
  [h,m,s]=t.match(/\d+/g),
  'It is currently '+T(h-=~10)
   +( 
      // if seconds is not 0, increment m else just convert to number
      // have to use '- -' to force conversion to number 
     (m -= - !!-s) 
-s?++m:m)
      ? ` with ${60-m ? 60-m+' minutes'+(-s?' and ':''):''}${-s?60-s+' seconds':''} until `+T(-~h)
      : ''
    )
)

Kiểm tra

F=
t=>(T=h=>String.fromCodePoint(128336+h%12),[h,m,s]=t.match(/\d+/g),'It is currently '+T(h-=~10)+((m-=-!!-s)?` with ${60-m?60-m+' minutes'+(-s?' and ':''):''}${-s?60-s+' seconds':''} until `+T(-~h):'')
)


var tid=0

function getTime(t)
{
  var a=t.match(/\d+/g)
  if (a) {
    var [h,m,s]=a
    h|=0, s|=0, m|=0
    if(h>=0 & h<24 & m>=0 & m<60 & s>=0 & s<60) 
      return [h,m,s]
  }
  return null
}      

function update()
{
  clearTimeout(tid)
  var t=I.value, a=getTime(t)
  if (a) {
    O.textContent = F(t)
    tid = setTimeout(again,5000)
  }
  else {
    O.textContent = 'invalid ' + t
  }
}
function again()
{      
  var t=I.value, a=getTime(t)
  if (a) {
    var [h,m,s]=a
    ++s>59?(s=0,++m>59?(m=0,++h):0):0
    h%=24
    s<10?s='0'+s:0
    m<10?m='0'+m:0
    t = h+(-m-s?':'+m+(-s?':'+s:''):'')
    I.value = t
    O.textContent=F(t)
    tid = setTimeout(again, 1000)
  }
}

update()
#O { font-size:16px }
Time <input id=I value='12' oninput='update()' onkeydown='update()'>
(modify current time as you wish - but use valid values)
<pre id=O></pre>


Tôi không biết làm thế nào để chọn một người chiến thắng cho điều này, cả hai bạn đã đăng trong vòng 2 phút với nhau với 201 byte trong cùng một ngôn ngữ.
Bạch tuộc ma thuật Urn

@carusocomputing tất nhiên bạn nên chọn tôi. Tôi. TÔI TÔI TÔI! ...
edc65

@carusocomputing nếu không bạn có thể chọn câu trả lời có ít phiếu hơn (không có lý do) chỉ để lấy lại số dư
edc65

Hoặc bạn có thể thay thế từ Stringtrong mã của mình bằng ""một chuỗi trống để tiết kiệm cho mình 4 byte :). Ah, tào lao, anh cũng có thể.
Bạch tuộc ma thuật Urn

Cho thấy It is currently 🕛 with 60 minutes until 🕐. Tôi nghĩ rằng nó nênIt is currently 🕛.
Roman Gräf

2

JavaScript (ES6), 201 byte

(i,[h,m,s]=i.split`:`,c=n=>String.fromCodePoint(128336+(n+11)%12))=>`It is currently ${c(+h)}${m|s?` with ${(m=59+!+s-m)?m+` minutes`:``}${+s&&m?` and `:``}${+s?60-s+` seconds`:``} until `+c(-~h):``}.`

226 byte nếu bạn đưa số nhiều vào tài khoản:

f=
(i,[h,m,s]=i.split`:`,c=n=>String.fromCodePoint(128336+(n+11)%12))=>`It is currently ${c(+h)}${m|s?` with ${(m=59+!+s-m)?m+` minute`+(m-1?`s`:``):``}${+s&&m?` and `:``}${+s?60-s+` second`+(59-s?`s`:``):``} until `+c(-~h):``}.`
<input oninput=o.textContent=f(this.value)><div id=o>



1

C, 241 byte

Viết UTF-8 đến thiết bị xuất chuẩn.

#define p printf(
c(v,h){p"%s \xf0\x9f\x95%c",v,144+h%12);}f(t){int h=0,m=0,s=0;sscanf(t,"%d:%d:%d",&h,&m,&s);m=(59-m+!s)%60;c("It is currently",h-1);m&&p" with %d minutes",m);s&&p" %s %d seconds",m?"and":"with",60-s);m|s&&c(" to",h);p".");}

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

Mã có khoảng trắng:

#define p printf(

c(v, h) {
    p"%s \xf0\x9f\x95%c", v, 144 + h % 12);
}

f(t) {
    int h = 0, m = 0, s = 0;

    sscanf(t, "%d:%d:%d", &h, &m, &s);
    c("It is currently", h - 1);
    m = (59 - m + !s) % 60;
    m && p" with %d minutes", m);
    s && p" %s %d seconds", m ? "and" : "with", 60 - s);
    m | s && c(" to", h);
    p".");
}
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.