เวลาเท่าไรในหน่วย Unicode?


12

ความท้าทายเป็นเรื่องง่ายกำหนดเวลาอินพุตเป็นสตริงในรูปแบบใดรูปแบบหนึ่งต่อไปนี้:

hh, hh:mmหรือhh:mm:ssมี0 ≤ hh ≤ 23, และ0 ≤ mm ≤ 590 ≤ ss ≤ 59

แสดงผลเวลาที่ใช้สัญลักษณ์ต่อไปนี้:

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  

ในรูปแบบต่อไปนี้:

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

ตัวอย่าง (รวมถึงกรณีขอบทั้งหมด):

กรณีที่มีเพียงชั่วโมง ...

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

กรณีที่มีชั่วโมงและนาที ...

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

กรณีที่มีเพียงชั่วโมง แต่มีนาทีรวมเป็น 00 ...

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

กรณีที่มีชั่วโมงนาทีและวินาที ...

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

กรณีที่มีชั่วโมงและนาที แต่มีวินาทีรวมเป็น 00 ...

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

กรณีที่มีชั่วโมงและนาทีโดยมีน้อยกว่าหนึ่งนาทีจนถึงชั่วโมงถัดไป ...

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

คุณไม่จำเป็นต้องเปลี่ยนจากพหูพจน์เป็นเอกพจน์


กรณีที่มีชั่วโมงและนาทีโดยมี 1 นาทีถึงชั่วโมงถัดไป ...

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

คุณไม่จำเป็นต้องเปลี่ยนจากพหูพจน์เป็นเอกพจน์


กรณีที่ใช้เวลาทหาร (ใช่คุณต้องจัดการเรื่องนี้) ...

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

กรณีไม่ถูกต้อง ...

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.

คุณไม่จำเป็นต้องสอดคล้องกับรูปแบบของผลลัพธ์ใด ๆ สำหรับกรณีที่ไม่ถูกต้องข้อผิดพลาดได้


โดยรวมแล้วความท้าทายค่อนข้างง่าย แต่ดูเหมือนจะมีพลังมากพอที่จะสนุกในความคิดของฉัน รหัสที่สั้นที่สุดในที่นี้คือผู้ชนะเนื่องจากไม่มีความกว้างของตัวแปรมากไปกว่ารหัสอื่น ๆ



นี่ควรเป็นโปรแกรมทั้งหมดหรือเป็นฟังก์ชั่น / แลมบ์ดาเพียงพอหรือไม่
devRicher

2
ผมคิดว่าแทน0 < hh < 24, 0 < mm < 60และ0 < ss < 60คุณหมาย0 ≤ hh ≤ 23, และ0 ≤ mm ≤ 59 0 ≤ ss ≤ 59
Erik the Outgolfer

2
โครงสร้าง Date / DateTime เฉพาะภาษาอนุญาตให้ป้อนข้อมูลหรือไม่
devRicher

2
@carcusocomputing คุณระบุว่ารหัสจะต้องจัดการกับเวลา 24 ชั่วโมงรหัสจะต้องจัดการAMหรือPMแท็ก?
Taylor Scott

คำตอบ:


3

Befunge ขนาด 256 250 ไบต์

>&~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!#^

ลองออนไลน์!

ผลลัพธ์ได้รับการเข้ารหัสเป็น utf-8 เนื่องจากทำงานได้ดีที่สุดกับ TIO แต่ถ้าคุณทดสอบในพื้นที่คุณอาจต้องปรับหน้ารหัสเริ่มต้นของระบบเพื่อดูหน้าปัดนาฬิกาอย่างถูกต้อง มิฉะนั้นเพียงแค่เปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์และเปิดในเอดิเตอร์ที่เข้ากันได้กับ utf-8

คำอธิบาย

สามบรรทัดแรกอ่านชั่วโมงนาทีและวินาทีจาก stdin ตรวจสอบ EOF หรือ linefeed หลังจากแต่ละค่าและแทนค่าศูนย์สำหรับส่วนประกอบที่หายไปจากอินพุต ในบรรทัดที่สี่เราปรับค่านาทีถ้าวินาทีไม่ใช่ศูนย์แปลงค่าชั่วโมงเป็นช่วง 0 ถึง 11 (เพื่อจับคู่อักขระ Unicode ที่เหมาะสมสำหรับแต่ละชั่วโมง) และเขียนส่วนเริ่มต้นของเอาต์พุตรวมถึง หน้าปัดนาฬิกาแรก

มันมาถึงจุดนี้แล้วเราจำเป็นต้องติดตามสาขาที่แตกต่างกันขึ้นอยู่กับส่วนประกอบที่ไม่ใช่ศูนย์ การทดสอบครั้งแรกที่จุดเริ่มต้นของบรรทัดที่ห้าเพียงตรวจสอบว่าทั้งนาทีและวินาทีเป็นศูนย์หรือไม่ ถ้าเป็นเช่นนั้นเราเขียนออกสุดท้าย.และออก มิฉะนั้นบรรทัดที่หกและเจ็ดจะจัดการกับกรณีที่เหลือ - เขียนข้อความและค่าที่เหมาะสมก่อนที่เส้นทางทั้งหมดจะรวมกันอีกครั้งในบรรทัดที่ห้าเพื่อเขียนหน้าปัดนาฬิกาสุดท้าย (รันจากขวาไปซ้าย)


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):''))

น้อย golfed

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)
      : ''
    )
)

ทดสอบ

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>


ฉันไม่รู้วิธีเลือกผู้ชนะสำหรับเรื่องนี้คุณทั้งคู่โพสต์ภายใน 2 นาทีซึ่งกันและกันด้วย 201 ไบต์ในภาษาเดียวกัน
Magic Octopus Urn

@carusocomputing แน่นอนคุณควรเลือกฉัน ผม. ฉันฉันฉัน! ...
edc65

@carusocomputing หรือมิฉะนั้นคุณสามารถเลือกคำตอบที่มีคะแนนน้อยลง (โดยไม่มีเหตุผล) เพียงเพื่อให้ได้ยอดคงเหลือ
edc65

หรือคุณสามารถแทนที่คำStringในรหัสของคุณด้วย""สตริงว่างเพื่อบันทึกตัวเอง 4 ไบต์ :) อึอึเขาทำได้เหมือนกัน
Magic Octopus Urn

แสดงให้เห็นIt is currently 🕛 with 60 minutes until 🕐ว่า ฉันคิดว่ามันควรจะเป็นIt is currently 🕛.
Roman Gräf

2

JavaScript (ES6), 201 ไบต์

(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 ไบต์หากคุณคำนึงถึงพหูพจน์:

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 ไบต์

เขียน UTF-8 ไปยัง stdout

#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".");}

ลองออนไลน์!

รหัสที่มีช่องว่าง:

#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".");
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.