ตัวแปลงเวลา 12 ชั่วโมงถึง 24 ชั่วโมง


27

น่าแปลกใจที่งานง่าย ๆ นี้ดูเหมือนจะยังไม่มีอยู่ดังนั้น ...

งานของคุณคือการเขียนโปรแกรมที่ใช้เวลาในการป้อนข้อมูลเป็นเวลา 12 ชั่วโมงและแปลงเป็น "เวลาทหาร" หรือรูปแบบเวลา 24 ชั่วโมง

ข้อมูลที่ป้อนจะอยู่ในรูปแบบ:

HH:MM am/pm

แม้ว่าจะอนุญาตให้มีการเปลี่ยนแปลงเล็กน้อย:

  • พื้นที่ที่แยก am / pm จากเวลาที่เหลือเป็นทางเลือก

  • ส่วนสุดท้ายอาจเป็น "am" / "pm" หรือ "a" / "p"

  • การใช้อักษรตัวพิมพ์ใหญ่ใด ๆ ก็ใช้ได้

เอาท์พุทจะเป็นเวลาที่ป้อนเข้าจะถูกแปลงเป็นรูปแบบ 24 ชั่วโมง มันอาจเป็นตัวเลขหรือสตริงก็ได้

สำหรับทั้งอินพุตและเอาต์พุต:

  • 0s ในตอนแรกเป็นตัวเลือก 0s ใน 3 สถานที่สุดท้ายมีผลบังคับใช้

  • ตัวคั่นคั่นชั่วโมงและนาทีอาจเป็น ":", "" (ช่องว่าง) หรือไม่มีอะไร

หมายเหตุอื่น ๆ :

  • เที่ยงคืนสามารถแสดงได้ทั้งแบบ 0000 หรือ 2,400

  • เที่ยงคืนจะถูกพิจารณาว่าเป็น "am" ในขณะที่เที่ยงจะถูกพิจารณาเป็น "pm"

โปรแกรมของคุณอาจเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบและควรส่งคืนผลลัพธ์หรือส่งออกไปยัง stdout ช่องว่างต่อท้ายก็โอเค

ตัวอย่าง (คุณไม่จำเป็นต้องรองรับทุกรูปแบบ):

12:00am -> 0000
1200 pm -> 1200
1234Am  -> 00:34
134a    -> 134
01:34PM -> 13 34
1234pm  -> 1234  

นี่คือรหัสกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ เนื่องจากเป็นเรื่องง่ายมากที่จะแก้ปัญหาโดยใช้บิวด์อินมันจะเป็นการดีหากได้เห็นโค้ดบางอย่างที่แก้ปัญหานี้ด้วยตนเอง (แต่การใช้บิวด์อินนั้นดี)

เพียงชี้แจงคุณไม่จำเป็นต้องสนับสนุนทุกรูปแบบที่เป็นไปได้ รองรับเพียงอินพุตเดียวและรูปแบบเอาต์พุตเดียว (ที่คุณเลือก) นั้นใช้ได้ อย่างไรก็ตามฉันต้องการ จำกัด รูปแบบตามที่ระบุไว้ข้างต้น (ซึ่งค่อนข้างฟรีแล้ว) {1134,'pm'}ตัวอย่างเช่นจะยอมรับไม่ได้


เราต้องการรูปแบบใดบ้างที่จะสนับสนุน แค่หนึ่ง?
redstarcoder

@redstarcoder ใช่ รูปแบบใด ๆ ที่เป็นไปตามข้อกำหนดข้างต้นนั้นใช้ได้ แต่ตามที่กล่าวไว้ข้างต้นกรณีตัวอย่างคุณไม่จำเป็นต้องสนับสนุนทุกรูปแบบ รูปแบบอินพุตเดียวและเอาต์พุตรูปแบบเดียวนั้นใช้ได้
Carcigenicate

รูปแบบของเราได้รับอนุญาตให้ต้องการเลขศูนย์นำหน้าหรือไม่ ตัวอย่างเช่น01:54pmทำงานได้ แต่1:54pmจะไม่?
FlipTack

ใช่. คุณสามารถเลือกรูปแบบอินพุตที่ต้องการ
Carcigenicate

เราได้รับอนุญาตให้รวมวินาทีในอินพุตและเอาต์พุตของเราหรือไม่
12Me21

คำตอบ:


8

V , 21 17 ไบต์

ขอบคุณ @DJMcMayhem เป็นเวลา 4 ไบต์!

í12:/0:
çp/12
$x

ลองออนไลน์! รูปแบบนี้ใช้รูปแบบHH:MMxที่xเป็นaหรือหรือpและส่งคืนเป็นรูปแบบHH:MM

hexdump:

00000000: ed31 323a 2f30 3a0a e770 2f31 3201 2478  .12:/0:..p/12.$x
00000010: 0ae7 612f 2478                           ..a/$x

คำอธิบาย:

í12:/0:   | find and replace 12: with 0: (to avoid replacing HH:12)
ç         | on every line
 p/       | that contains a p
   12^A   | increment 12 times (the first number, hours)
$x        | delete the character at the end of the line

อินพุตจะถูก[1-12]ต้องหรือไม่ ในกรณีนี้ฉันคิดว่าคุณสามารถทำได้ó^12/0แทนที่จะเป็นcw^R=^R"%12
DJMcMayhem

1
นอกจากนี้คุณสามารถใช้ "คำสั่งทั่วโลก" เพื่อใช้คำสั่งกับบรรทัดที่ตรงกับ regex ซึ่งสั้นกว่าการทำลายแมโคร çp/12^Aซึ่งเทียบเท่ากับ:g/p/norm 12<C-a>ในกลุ่ม
DJMcMayhem

ฉันยอมรับสิ่งนี้เพราะมันเป็นคำตอบที่ให้คะแนนต่ำที่สุดซึ่งทำให้เห็นได้ชัดว่าไม่ได้ใช้งานบิวด์อิน หากใครมีปัญหากับตัวเลือกนี้ฉันสามารถเปลี่ยนคำตอบของฉันให้เป็นธรรม ฉันคิดว่าคำตอบนี้เป็นสิ่งที่สมควรได้รับมากที่สุด
Carcigenicate

12

MATL , 4 ไบต์

15XO

ลองออนไลน์!

คำอธิบาย

ฟังก์ชั่นในตัว: การแปลงสตริงวันที่ด้วยการตรวจจับรูปแบบอินพุตและรูปแบบเอาต์พุต15ที่สอดคล้องกัน'HH:MM'โดยอัตโนมัติ นี้จะเทียบเท่ากับ@ StewieGriffin คำตอบของคู่


10

คู่, 21 17 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณ Luis Mendo ฉันสามารถระบุจำนวนรูปแบบ 15 'HHMM'แทน

@(c)datestr(c,15)

คำอธิบาย:

นี้เป็นฟังก์ชั่นที่ไม่ระบุชื่อการสตริงเป็นข้อมูลเกี่ยวกับรูปแบบ:c ตระหนักถึงรูปแบบโดยอัตโนมัติเป็นหนึ่งในรูปแบบวันที่มาตรฐานและเอาท์พุทในจำนวนรูปแบบที่กำหนด 15 ซึ่งเป็น'11:34 AM'datestrHH:MM

เนื่องจากรูปแบบผลลัพธ์ที่ระบุไม่มีAMหรือPMOctave แปลงเป็นรูปแบบเวลาที่คุณอ้างถึงโดยอัตโนมัติ

ลองออนไลน์


รุ่นที่ไม่ได้ใช้งานdatestrโดยใช้ 35 ไบต์

@(c)[c(1:4)+[1,2,0,0]*(c(5)>97),'']

คำอธิบาย:

สตริงการป้อนข้อมูลในรูปแบบc1134am

@(c)                              % Anonymous function
[c(1:4)                           % First 4 elements of the string
       +[1,2,0,0]                 % Add 1 and 2 to the first to the ASCII-value of the 
                                    first two characters
                 *)c(5)>97)       % if the fifth element is larger than 97 
                                    (the ASCII code for `a`).
                            ,'']  % Implicitly convert to string

หรือวิธีอื่น 37 ไบต์:

@(c)[c(1:4)+('1200'-48)*(c(5)>97),'']

7

PowerShell , 23 20 19 ไบต์

date "$args"-f HHmm

ลองออนไลน์!

(หากคุณใช้ Windows คุณสามารถละเว้นget-เพื่อลงได้ถึง 19 ไบต์บน TIO จะต้องใช้Get-Dateชื่อเต็ม)

รับอินพุตเป็นสตริง$args[0]ใช้สิ่งนั้นเป็นอินพุตไปยังGet-Datecmdlet ซึ่งแยกวิเคราะห์ลงในdatetimeวัตถุ. NET นั่นคือการส่งผ่านด้วย-fพารามิเตอร์ ormat ของHHmmการแปลงเป็นเวลาทางทหาร (ทุนHHระบุเวลา 24 ชั่วโมง) เอาท์พุทเป็นนัย

เอ็นจิ้นการแจงค่อนข้างแข็งแกร่งดังนั้นอินพุตเพิ่มเติมที่อนุญาต12amหรือ12:00amอนุญาต เล่นกับอินพุตบน TIO และดูว่าอะไรทำงาน

( บันทึกแล้ว 3 ไบต์ขอบคุณ @admalledd ... บันทึกอีกไบต์ขอบคุณ @briantist )


ควรจะสามารถที่จะลบช่องว่างระหว่าง$args[0]และ-fเช่นเดียวกับการเอาราคาเดียวทั่ว STR date $args[0]-f HHmmรูปแบบ: อย่างน้อยก็ใช้งานได้กับ
ขุมพลัง

@admalledd สำหรับการร้องไห้ออกมาดัง ๆ ฉันมักจะลืมคำพูดเหล่านั้น อย่างจริงจังฉันคิดว่าทุกครั้งที่ฉันใช้Get-Dateกับ-fใครบางคนได้เตือนฉันว่าคุณไม่ต้องการคำพูด และการโทรที่ดีด้วยการลบที่ว่างเช่นกันเนื่องจาก parser ปฏิบัติต่อ]เมื่อสิ้นสุดโทเค็น ขอบคุณ!
AdmBorkBork

5

Python 2, 44 ไบต์

lambda s:`int(s[:2])%12+12*("p"in s)`+s[3:5]

รูปแบบอินพุต: 01:23amตัวเลือกmและช่องว่างหลังจากนาที
รูปแบบผลลัพธ์:123


5

Pyth, 21 20 ไบต์

Aczd++*12}\pH%sG12PH

รับอินพุตของแบบฟอร์ม01 23aเป็น "01:23 am" 0 เริ่มต้นเป็นตัวเลือก
เอาท์พุทเป็นรูปแบบที่123มีการเริ่มต้น 0 ละเว้น

ใน pseudocode:

                         z = input()
A                        G, H =
 czd                         z.split(" ")       # splits into the form ["1","23p"]
                         (
     +*12}\pH            12*('p' in H) +        # add 12 if 'p' is in the string
             %sG12         int(G) % 12
    +             PH     ) + H[:-1]             # prepend hour to minutes, with a/p removed

ลองออนไลน์!


4

PHP, 35 32 ไบต์

รูปแบบการป้อน: กรณีตายต้องลำไส้ใหญ่และรูปแบบการส่งออกm hhmmใช้บิวด์อิน:

<?=date(Hi,strtotime($argv[1]));

รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งแรก

PHP, 45 ไบต์, ไม่มีบิลด์อิน

รูปแบบการป้อนตัวพิมพ์เล็กรูปแบบการออก(h)h:mm a(m)(h)hmm

<?=($s=$argv[1])%12+12*($s[6]>a).$s[3].$s[4];

4
ทำไมต้องลงคะแนน
ติตัส

ฉันแค่คาดเดา แต่อาจเป็นเพราะคุณใช้ PHP และผู้ลงคะแนนไม่ชอบ PHP ใช่หรือไม่ : p
bash0r

3

JavaScript (ES6), 40 ไบต์

a=>(new Date('1/1/1/'+a)+a).slice(16,21)

อินพุตควรจัดรูปแบบดังนี้: 12:32 am


3

CoreUtils GNU ( 18 16 ไบต์)

จากเชลล์สคริปต์:

ไม่ยอมรับช่องว่างในอินพุต

ณ จุดนี้อาจใช้ $ 1 และละเว้น args เพิ่มเติม

date -d$1 +%H%M

⇒ echo 'date -d$1 +%H%M' > time24
⇒ sh time24 1:45pm
1345
⇒ sh time24 1:45 pm
0145 # Wrong answer, “pm” ignored because of space

เป็นต้นฉบับ

ในการอนุญาตช่องว่างในอินพุต

date -d"$@" +%H%M

3

C #, 46 ไบต์

s=>System.DateTime.Parse(s).ToString("HH:mm");

สายอักขระถูกถ่ายในอินพุตเหมือน 12:00 AM

ทำสิ่งเดียวกัน แต่ซับสตริงบนเอาต์พุตจากการเรียกไปที่ค่าเริ่มต้นToString(สมมติว่าเป็นวัฒนธรรมen-GB) มีขนาด 3 ไบต์นานกว่า 49 ไบต์:

s=>(System.DateTime.Parse(s)+"").Substring(11,5);

3

date, 0 + 8 = 8 ไบต์

ในเรื่องของการใช้เครื่องมือที่เหมาะสมสำหรับงาน ...

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ทำงานด้วย+%H%M -d(การลงโทษ 8 ไบต์) ไม่มีโปรแกรมจริงที่นี่; งานทั้งหมดทำโดยอาร์กิวเมนต์บรรทัดคำสั่ง (นี่เป็นการสาธิตที่ดีว่าทำไมจึงมีบทลงโทษสำหรับอาร์กิวเมนต์บรรทัดคำสั่ง!)

ตัวอย่าง:

$ date +%H%M -d "12:05 am"
0005

3

Java 7, 138 106 105 104 ไบต์

String a(String a){return new java.text.SimpleDateFormat("Hmm").format(new java.util.Date("Ja1,0,"+a));}

ลองออนไลน์!

อินพุตเป็นตัวคั่นลำไส้ใหญ่และมีช่องว่างระหว่างเวลาและ am / pm เอาต์พุตไม่ได้คั่นด้วยโคลอน

-1 ไบต์ต้องขอบคุณKevin Cruijssen


การแข่งขันสั้นที่สุดเท่าที่ได้รับสำหรับ Java, 20% ของรหัสเป็นแพคเกจคัดเลือก
Magic Octopus Urn

กฎกระทรวงนี้ " สำหรับทั้งเข้าและส่งออก: - 0s ในสถานที่แรกเป็นตัวเลือก 0s ในช่วง 3 สถานที่ที่มีผลบังคับใช้.. " ซึ่งหมายความว่าคุณสามารถเปลี่ยนไปHHmm Hmm
Kevin Cruijssen

@KevinCruijssen จับได้ดีมาก!
Poke

2

Japt , 14 ไบต์

Ð"1/"+U s sG21

ลองออนไลน์!

ใช้งานได้กับ Chrome เท่านั้น นี่คือเวอร์ชันที่ใช้งานได้ในเบราว์เซอร์ทั้งหมด:

Ð"1/"³+U s sG21

ขอขอบคุณอีกครั้งถึง ETH ผลิตภัณฑ์สำหรับความช่วยเหลือ!


2

Perl, 45 28 37ไบต์

28 37 ไบต์

(c / o @Dada)

(รหัส 36 ไบต์, 1 ไบต์สำหรับ-pสวิตช์คอมไพเลอร์)

ยอมรับ0145pmรูปแบบชนิดที่มี am / pm หรือ a / p เลขศูนย์นำหน้าในอินพุตที่ต้องการ

s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1

ทดสอบ:

⇒ echo 0145pm | perl -p time24
1345
⇒ echo 0245pm | perl -p time24
1445
⇒ echo 1245pm | perl -p time24
1245
⇒ echo 1245am | perl -p time24
045

คำตอบเดิมของฉัน

(แก้ไขเบา ๆ ด้วย)

(รหัส 39 ไบต์, 1 ไบต์สำหรับ-pสวิตช์คอมไพเลอร์)

ยอมรับเฉพาะรูปแบบเช่น 0145p หรือ 0145a และไม่มีรูปแบบอื่นและต้องใช้perl -pโหมดในการทำงาน

s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e

ทดสอบ:

⇒ echo 0145p | perl -p time24
1345
⇒ echo 1222a | perl -p time24
022
⇒ echo 1234p | perl -p time24
1234

ยินดีต้อนรับสู่ PPCG คำตอบแรกที่ดี คุณสามารถใช้สวิตช์ได้ แต่จะนับเป็น bytecount ของคุณ (ดังอธิบายไว้ที่นี่ ) ในกรณีของคุณนั่นจะเป็น +1 ไบต์ (เพราะ-pจำเป็นเท่านั้น) หากคุณเปลี่ยนเครื่องหมายคำพูดเดี่ยวสำหรับเครื่องหมายคำพูดคู่
Dada

ขอบคุณ ไม่พบคำถามที่พบบ่อยสงสัยว่ากองแลกเปลี่ยนทีมสามารถตรึงไว้ในหน้าคำตอบหรืออะไร?
BRPocock

ตกลงฉันได้รับ Perling ตั้งแต่ 4 ซีรีส์และนั่นทำให้ฉันเจ็บคุณควรเอาเครดิตและโพสต์ตัวเองด้วย ☺
BRPocock

ฉันคิดว่ามันควรจะครอบคลุมตอนนี้หรือไม่
BRPocock

ฉันทำผิดวิธีนี้จะไม่ทำงานเมื่อนาทีอยู่ระหว่าง 0 ถึง 9 รหัสนี้ใช้งานได้แล้ว: s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1(37 ไบต์) และโดยวิธีการแก้ปัญหาแรกของคุณสามารถเล่นกอล์ฟลงเล็กน้อย: s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e(40 bytes)
Dada

2

Commodore 64 BASIC, 301 bytes ก่อนเรียกใช้, 321 bytes ใช้ครั้งเดียว

0 A$="12:34AM":A=VAL(LEFT$(A$,2)+MID$(A$,4,2)):ON-(RIGHT$(A$,2)="AM")+1GOSUB1,2:TI$=A$:PRINTTI$:END
1 ON-(A=>1200ANDA<=1259)GOTO3:A=A+1200:GOTO3
2 ON-(A=>1200ANDA<=1259)GOTO4:ON-(A<=959)GOTO7:RETURN
3 A$=RIGHT$(STR$(A)+"00",6):RETURN
4 A=A-1200:IFA=0THENA$="000000":RETURN
5 IFA<10THENA$="000"+RIGHT$(STR$(A),1)+"00":RETURN
6 A$="00"+RIGHT$(STR$(A),2)+"00":RETURN
7 A$="0"+RIGHT$(STR$(A),3)+"00":RETURN

ในการป้อนข้อมูลนี้ใน Commodore 64 จริงคุณจะต้องใช้ตัวย่อคำหลักพื้นฐานเช่น LE [shift] F for LEFT$, M [shift] I MID$เป็นต้นและ ... หรือคุณสามารถลอง CBM PRG STUDIO

TI$ตัวแปรในพลเรือจัตวาขั้นพื้นฐานที่มีการจัดเวลาในรูปแบบนาฬิกา 24 ชั่วโมงเป็น HHMMSS เมื่อพิมพ์ การเว้นช่องว่างหลังจากหมายเลขบรรทัดไม่ได้บันทึกหน่วยความจำใด ๆ เนื่องจาก Commodore BASIC จะเพิ่มพื้นที่โดยอัตโนมัติเมื่อคุณแสดงรายการโปรแกรมหลังจากป้อน

เมื่อแปลงตัวเลขเป็นสตริงด้วยSTR$Commodore BASIC จะเพิ่มในช่องว่าง (ดังนั้นถ้าคุณPRINT Aจะเห็นช่องว่างก่อนแสดงหมายเลข) ฉันได้ลบช่องว่างในการแปลงสตริงเป็นตัวเลขด้วยRIGHT$คำสั่ง คุณสามารถบันทึกไม่กี่ไบต์โดยการแก้ไขศูนย์บรรทัดไปที่:

0 A=VAL(LEFT$(A$,2)+MID$(A$,4,2)):ON-(RIGHT$(A$,2)="AM")+1GOSUB1,2:TI$=A$:PRINTTI$:END

ดังนั้นคุณจะต้องประกาศเวลาของคุณในการแปลงก่อนเรียกใช้โปรแกรมดังต่อไปนี้:

A$="01:22AM":GOTO 0

หลังจากนั้นไม่นานคุณจะเห็นเวลาปัจจุบันด้วย:

? TI$

การเล่นโค้ดกอล์ฟบนเครื่อง 8 บิตนั้นน่าสนใจจริง ๆ เพราะมันแสดงให้เห็นว่าการทำงานของโปรแกรมเมอร์ในยุคปัจจุบันทำได้โดยไม่ต้องคิดอะไรเลย
Shaun Bebbers

2

Java, 171 ไบต์

enum t{;public static void main(String[] a){a=a[0].split("[: ]");System.out.format("%02d%02d",(Long.parseLong(a[0])+(a[2].charAt(0)=='p'?12:0))%24,Long.parseLong(a[1]));}}

รูปแบบอินพุตเป็นและรูปแบบการออกเป็นHH:MM a/p HHMMการใช้ความผิดที่ฟังก์ชั่นหลักมีอาร์เรย์ของสตริงเพื่อแยกอินพุตเป็น 3 ส่วน: ตัวบ่งชี้ชั่วโมงนาทีและ a / p

ตัวอย่างอินพุตและเอาต์พุต:

Input: 01:02 a
Output: 0102

Input: 01:02 p
Output: 13:02

Input: 12:22 p
Output: 0022

เวอร์ชันที่ไม่ถูกปรับแต่ง:

enum t {
    ;

    public static void main(String[] a) {
        a = a[0].split("[: ]");
        System.out.format("%02d%02d", (Long.parseLong(a[0]) + (a[2].charAt(0) == 'p' ? 12 : 0)) % 24, Long.parseLong(a[1]));
    }
}

ผมไม่ได้เห็นมาใช้ในการถือenum mainดี :)
Robert Benson

คุณสามารถเว้นช่องว่างในลายเซ็นของเมธอดหลัก: public void main main (String [] a) {...
staticmethod

2

REXX, 33 ไบต์

arg h':'m a
say h+((a=pm)*12)':'m

ใช้:

12:34 pm -> 24:34
1:34 pm -> 13:34
1:34 am -> 1:34
0:34 AM -> 0:34

สิ่งนี้สามารถสั้นลงได้สองสามไบต์หากไม่ใช้โคลอนเป็นตัวคั่น


ตัวคั่นลำไส้ใหญ่เป็นตัวเลือก
Carcigenicate

ใช่ แต่มันดูไม่ดี
idrougge

เนื่องจากนี่เป็นความท้าทายของการเล่นกอล์ฟรหัสหากคุณมีตัวเลือกของโปรแกรมที่ยาวขึ้นด้วยเอาต์พุตที่ค่อนข้างสวยหรือโปรแกรมที่สั้นกว่าที่มีเอาท์พุตที่ไม่ดีให้เลือกอันหลัง ไม่มีใครจะตัดสินคุณ
Carcigenicate

2

C (เสียงดังกราว) , 94 ไบต์

h,m;f(){char a,b;scanf("%d:%d%c%c",&h,&m,&a,&b);printf("%02d%02d",a=='a'?(h%12):(12+h%12),m);}

ลองออนไลน์!

ฉันมาที่นี่เพื่อเรียนรู้ดังนั้นยินดีต้อนรับเคล็ดลับเกี่ยวกับวิธีที่ฉันสามารถเพิ่มประสิทธิภาพรหัสยินดีต้อนรับ

@ Johan du Toit ขอบคุณสำหรับการบันทึกไม่กี่ไบต์!


คุณไม่ต้องทดสอบว่า b == 'm' และคุณสามารถทำให้สั้นลงได้มากโดยใช้ข้อความ inline if:printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
Johan du Toit

1
@JohanduToit ฉันป้อนข้อมูลอะไรคือ 6: 00pc :)
Abel Tom

1
ที่จะก่อให้เกิดอันตรายซึ่งไม่สามารถแก้ไขได้อย่างต่อเนื่องต่อกาลเวลา
Johan du Toit


2

C, 87 72 ไบต์

บันทึก 15 ไบต์ขอบคุณ @Johan du Toit

โทรf()ด้วยสตริงที่ไม่แน่นอนเป็นอาร์กิวเมนต์อินพุตเป็นเอาต์พุต

รูปแบบที่เป็นHH:MMa/pที่a/pเป็นตัวพิมพ์เล็กอย่างใดอย่างหนึ่งหรือตัวพิมพ์เล็กa pไม่อนุญาตให้มีช่องว่างระหว่างเวลากับตัวระบุเที่ยง

i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}

ลองบน ideone


คุณสามารถบันทึกสองสามไบต์ได้โดยใช้สิ่งต่อไปนี้:i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}
Johan du Toit

แนะนำ(p[5]!=97)*12;แทน(p[5]^97?12:0);
ceilingcat


2

SmileBASIC ขนาด 67 ไบต์

INPUT T$P=POP(T$)>"a
TMREAD"00:"+T$OUT,H,M?H MOD 12+12*P,T$[3];T$[4]

การป้อนข้อมูล: HH:MMa/p

เอาท์พุท: HH MM


1

R, 68 ไบต์

x=substr(strptime(scan(,""),"%I:%M %p"),12,16);`if`(x=="","00:00",x)

อ่านอินพุตจาก stdin และสันนิษฐานว่าเป็นหนึ่งในรูปแบบต่อไปนี้:

  • 12:00 AM
  • 12:00 am
  • 12:00AM
  • 12:00am

และเอาต์พุตอยู่ในรูปแบบ: [1] "00:00"

ในกรณีส่วนใหญ่strptime()เอาท์พุทอยู่ในรูปแบบ: "2017-01-06 12:00:00 CET"วันที่เป็นวันที่ท้องถิ่น ดังนั้นเราจำเป็นต้องใช้substr()เพื่อส่งคืนเวลาเท่านั้นอย่างไรก็ตามหากอินพุตเป็นเที่ยงคืน (เช่น12:00am) เอาต์พุตนั้นเป็นเพียง"2017-01-06 CET"เหตุผลของifสิ่งที่สิ้นสุด (ต้องมีวิธีแก้ปัญหาที่ฉลาดกว่า)


ฉันต้องการหาวิธีที่สั้นกว่าlubridateแต่ชื่อของแพ็คเกจนั้นยาวเกินไป (ในบรรดาปัญหาอื่น ๆ )
BLT

1

C, 159 152 ไบต์

#define C c[0]
main(i,c)char**c;{scanf("%s",C);i=atoi(C);if(C[5]-97){i+=i-12?12:0;sprintf(C,"%d",i);}else if(i==12)C[0]=C[1]=48;C[2]=58;C[5]=0;puts(C);}

รูปแบบอินพุต: 07:30am



1

Mathematica, 33 ไบต์

#~DateString~{"Hour24","Minute"}&

ฟังก์ชั่นไม่ระบุชื่อ รับสตริงเป็นอินพุตและส่งคืนสตริงเป็นเอาต์พุต hh:mm AM/PMทำงานร่วมกับรูปแบบมากที่สุดรวมทั้ง



1

Haskell, 61 ตัวอักษร

เวอร์ชั่นสั้น:

c[a,b,c,d,e]=(mod(read[a,b]::Int)12+f e,[c,d])
f 'a'=0
f _=12

รูปแบบอินพุต: HHMM(a/p)โดยที่(a/p)'a' หรือ 'p' โดยไม่มีวงเล็บ

รูปแบบผลลัพธ์: (hs, MM)- tuple ที่มีชั่วโมงเป็นจำนวนเต็มและ MM ยังคงเป็นสตริง

ตัวอย่าง:

> c "1200p"
(12,"00")
> c "1200a"
(0,"00")

รุ่นที่ยาวกว่า (ที่มีชื่อที่มีประโยชน์มากขึ้นและการทดแทนหนึ่งรายการhs):

conv [h0,h1,m0,m1,ap] = (mod hs 12 + offset ap, [m0,m1])
    where hs = read [h0,h1] :: Int

offset 'a'=  0
offset  _ = 12

1

เสียงกระเพื่อมสามัญ ( 151 122 ไบต์)

โอเค CL ไม่ได้หมายถึง "terse" แต่ฉันแค่แปลกใจว่ามันไม่ได้ดีที่สุดสำหรับเรื่องนี้

นี่คือรุ่น 122 ไบต์ซึ่งต้องใช้อินพุตตำแหน่งคงที่ 0145pmหรือ145pเป็นที่ยอมรับได้ (โดยมีช่องว่างนำหน้าในตำแหน่งอักขระแรก)

(defun a(x)(let((h(parse-integer(subseq x 0 2)))(m(subseq x 2 4)))(format nil "~a~a" (+(mod h 12)(if(find #\p x)12 0))m)))

pprint:

(DEFUN A (X)
  (LET ((H (PARSE-INTEGER (SUBSEQ X 0 2)))
        (M (SUBSEQ X 2 4)))
    (FORMAT NIL
            "~a~a"
            (+ (MOD H 12) (IF (FIND #\p X) 12 0))
            M)))

ดีกว่า แต่ใหญ่กว่า

ใช้เฉพาะCommon-Lispแพ็คเกจ ยอมรับอินพุต (เท่านั้น) ในรูปแบบของจำนวนเต็มชั่วโมง (ไม่ว่าจะมีหรือไม่มีผู้นำ0) :นาทีตัวอักษรสองหลักและต่อท้ายตัวเลือกamหรือpm(ในกรณีที่ต่ำกว่าเท่านั้น) ใบอนุญาตช่องว่างรอบเวลาและรอบ AM / PM :แต่ไม่ได้โดยตรงหลังจากที่

(defun a(x)(let*((c(position #\: x))(h(parse-integer(subseq x 0 c)))(m(subseq x(1+ c)(+ 3 c))))(format nil "~a~a" (+(mod h 12)(if(find #\p x)12 0))m)))

ทดสอบ:

GOLF> (a "  1:45 am ")
"1:45"
GOLF> (a "  1:45 pm ")
"13:45"
GOLF> (a " 12:45 am ")
"0:45"
GOLF> (a "12:45p")
"12:45"

pprint นิยามฟังก์ชั่น:

(DEFUN A (X)
  (LET* ((C (POSITION #\: X))
         (H (PARSE-INTEGER (SUBSEQ X 0 C)))
         (M (SUBSEQ X (1+ C) (+ 3 C))))
    (FORMAT NIL "~a~a"
            (+ (MOD H 12)
               (IF (FIND #\p X)
                   12
                   0))
            M)))

De-obfuscated:

(defun 12->24-hour (timestring) 
  "Given a  TIMESTRING with  hours:minutes and a  trailing “am”  or “pm”
   \(lowercase-only), return the 24-hour time without a delimiter as
   a  string \(eg,  \"1:45am\" →  \"0145\"). Spaces  surrounding the
   time or  meridian markers are ignored  \(eg, \" 02:22 pm  \") but
   other junk in the string may cause incorrect behavior."
  (let ((colon (position #\: timestring)))
    (let ((hours (parse-integer (subseq timestring 0 colon)))
          (minutes (subseq timestring (+ 1 colon) (+ 3 colon))))
      (format nil "~a~a"
              (+ (mod hours 12) (if (find #\p timestring) 12 0))
              minutes))))

1

เรติน่า61 61ไบต์

^12(.*)a
00$1
^(12.*)p
$1
a

(\d\d)(.*)p
$1$*x12$*x$2
x+
$.&

อินพุตจะได้รับโดยไม่ต้องโคลอนแยกนำหน้าบังคับ0และใช้เฉพาะaหรือpแทนamหรือpmเช่น0134aคือ 01:34 น. แสดงผลในเวลาทหารโดยใช้ 0000 เป็นเที่ยงคืน (ฉันสามารถบันทึกบางไบต์ถ้าฉันได้รับอนุญาตให้แปลงตัวอย่างเป็น 12:30 น. 2430แต่ฉันสงสัยว่าเป็นที่ยอมรับได้)

ลองออนไลน์!

คำอธิบาย

สองกรณีแรกจัดการกับ "12" ชั่วโมงเนื่องจาก am / pm ถูกย้อนกลับเป็น 12:

^12(.*)a
00$1

ถ้าเวลาคือระหว่างเที่ยงคืน (00:00) และ 01:00 เปลี่ยนไป 00 แทน 12 aและลบ

^(12.*)p
$1

หากเวลาอยู่ระหว่างเที่ยง (12.00 น.) และ 13.00 น. ให้ลบ p เพื่อให้ได้เวลา 24 ชั่วโมง

ชั่วโมงอื่น ๆ :

a
 

หากเวลาเป็นเพียงลบออกaเพื่อรับเวลา 24 ชั่วโมง

(\d\d)(.*)p
$1$*x12$*x$2
x+
$.&

pถ้าเวลาที่นลบ แปลงองค์ประกอบชั่วโมงเป็น unary เพิ่ม 12 และแปลงกลับเป็นทศนิยม ปล่อยให้นาทีไม่เปลี่ยนแปลง


1

แบตช์ 40 ไบต์

@set/aa=0,p=12,h=%1%%12+%3
@echo %h% %2

รับอินพุตเป็นสามอาร์กิวเมนต์ ถือว่าอาร์กิวเมนต์ที่สองมีศูนย์นำกรณีที่จำเป็นอาร์กิวเมนต์ที่สามเป็นอย่างใดอย่างหนึ่งหรือa pทำงานโดยถืออาร์กิวเมนต์ที่สามเป็นชื่อตัวแปรทางอ้อมดังนั้นจึงเพิ่มเข้าไปในจำนวนชั่วโมง จำนวนนาทีไม่ได้รับผลกระทบจึงเป็นผลลัพธ์โดยตรง หากการผสมรูปแบบที่แตกต่างกันก็โอเคคุณสามารถลบพื้นที่สุดท้ายเพื่อบันทึกไบต์

(ค่อนข้างน่ารำคาญคำถามนี้ไม่ปรากฏในหน้าคำถามเมื่อฉันโหลด แต่แรกและฉันสะดุดเพราะฉันค้นหาคำถามอื่น)

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