จัดรูปแบบไมโครวินาทีเป็นชั่วโมง: นาที: วินาที ฯลฯ


28

ต่อไปนี้เป็นแรงบันดาลใจจากคำถามที่ขึ้นมาบนกองมากเกินในวันนี้

ได้รับหมายเลขของไมโคร0 <= n <= 86400000000(เช่น12345678900) เอาท์พุทสตริงรูปแบบเช่นhh:mm:ss:000:00003:25:45:678:900

          0 -> '00:00:00:000:000'
12345678900 -> '03:25:45:678:900'
86400000000 -> '24:00:00:000:000'

ฉันมีวิธีแก้ปัญหาใน Python ขนาด 209 ไบต์ แต่มันลดลงได้ไหม


1
ฉันรู้แล้วว่านี่ไม่ใช่รูปแบบมาตรฐานสำหรับการเขียนเวลาจริง ๆ และhh:mm:ss.000000น่าจะดีกว่า (และง่ายกว่า) ยังไม่สามารถเปลี่ยนได้ในขณะนี้
Sam

1
จากความอยากรู้สิ่งที่โพสต์ดังนั้นคืออะไร?
บาดเจ็บทางดิจิตอล

@DigitalTrauma stackoverflow.com/questions/31251377โดยผู้ใช้ที่ค่อนข้างใหม่ คำตอบที่ถูกต้องได้รับเลือกแล้วฉันเพิ่งเล่นไปรอบ ๆ ใน IDLE และมาพร้อมกับความเข้าใจพจนานุกรมที่ดูพิลึกที่ไม่ได้เป็นคำตอบที่ดีโดยเฉพาะกับคำถาม มีคนเห็นและชี้ให้เห็นไซต์นี้ในความคิดเห็น ฉันมาที่นี่เขียนคำถาม (ต่างจากโพสต์ SO เล็กน้อย) และเขียนคำตอบของฉันที่ปรับปรุงแล้ว (ซึ่งฉันยังไม่ได้โพสต์และตอนนี้ซ้ำซ้อนกับคำตอบที่กระชับและจินตนาการทั้งหมดด้านล่าง) .
Sam

มีการ จำกัด จำนวนชั่วโมงในอินพุตหรือไม่
FUZxxl

ใช่ฉันสร้างมันขึ้นมา <= 86400000000 microsec ดังนั้น <= 24 ชั่วโมง
Sam

คำตอบ:


15

Python 2, 82 79 ไบต์

n=input()
o=""
for k in[1000]*2+[60]*3:o=":%0*d"%(k%7/2,n%k)+o;n/=k
print o[1:]

สร้างสตริงทำซ้ำผ่านชุดของ divmods บิตแฟนซีเพียงอย่างเดียวคือ%7/2ซึ่งแผนที่และ1000 -> 360 -> 2


6

Pyth, 31 ไบต์

j\:_m>l`td+"00"%~/QddCM"ϨϨ<<<

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

                                 implicit: Q = input number
                       "ϨϨ<<<   string "ϨϨ<<<" (5 chars but 7 bytes)
                     CM          convert each to number => [1000, 1000, 60, 60, 60]
    m                            map each number d to:
                 /Qd                divide Q by d
                ~                   and update Q with the new value
               %~ Q d               but use the old value to calculate Q mod d
          +"00"                     add the result to the string "00"
     >                              but only take the last 
      l`td                          len(str(d-1)) chars
   _                             revert order
j\:                              join the strings with ":"s



4

C, 97 ไบต์

q=1000,s=60;
#define f(n)printf("%02d:%02d:%02d:%03d:%03d",n/s/s/q/q,n/s/q/q%s,n/q/q%s,n/q%q,n%q)

รหัสทดสอบ:

int main(int intc, char **argv)
{
    long long n = atoll(argv[1]);
    f(n);
}

1
รู้รอบในภาษาซีควรเป็นโปรแกรมที่สมบูรณ์ ไม่ใช่ตัวอย่าง
NobodyNada - Reinstate Monica

มันไม่ได้กล่าวถึงในคำถาม มีข้อกำหนดระดับโลกบ้างไหม?
ผู้ใช้บางคน


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

3
คำตอบมากมายในเว็บไซต์นี้ใช้ฟังก์ชั่นแทนโปรแกรมเต็ม - ตัวอย่างเช่นฉันไม่คิดว่าฉันเคยเห็นคำตอบ Java ที่เป็นโปรแกรมที่สมบูรณ์ ...
Jerry Jeremiah

4

q (34)

ฉันแน่ใจว่ามันจะสั้นกว่านี้

":"sv 0 8 11__[;8]15$2_($)16h$1e3*

เช่น

q)f:":"sv 0 8 11__[;8]15$2_($)16h$1e3*
q)f 12345678900
"03:25:45:678:900"

4
คอมไพเลอร์ออนไลน์ใด ๆ ในคำอื่น ๆ - ฉันจะเรียกใช้เป็นคนขี้เกียจได้อย่างไร
เครื่องมือเพิ่มประสิทธิภาพ

รุ่น 32 บิตให้บริการฟรีที่kx.com
skeevey

จุดที่ดี น่าเสียดายที่การแก้ไขเพิ่มอักขระบางตัว
skeevey

1
คุณสามารถลดจำนวนไบต์ได้มากขึ้นที่นี่":"sv 0 8 11__[;8]15$2_($)"n"$1e3*
WooiKent Lee

3

Julia, 110 96 95 ไบต์

t->(o="";for i=int([36e8,6e7,1e6,1e3,1]) x,t=t÷i,t%i;o*=lpad(x,i>1e3?2:3,0)*":"end;o[1:end-1])

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่รับจำนวนเต็มเป็นอินพุตและส่งคืนสตริง f=t->...เรียกว่าให้มันชื่อเช่น

คำอธิบาย Ungolfed +:

function f(t)
    # Initialize an output string
    o = ""

    # Loop over an array consisting of the number of microseconds in
    # an hour, minute, second, millisecond, and microsecond
    for i = int([36e8, 6e7, 1e6, 1e3, 1])

        # Get the quotient and remainder for microseconds into t,
        # setting t to be the remainder
        x, t = t ÷ i, t % i

        # Left-pad x with zeroes and append it to the output
        o *= lpad(x, i > 1e3 ? 2 : 3, 0) * ":"
    end

    # o has a trailing :, so return everything but the last character
    o[1:end-1]
end

ตัวอย่าง:

julia> f(12345678900)
"03:25:45:678:900"

julia> f(0)
"00:00:00:000:000"

julia> f(86400000000)
"24:00:00:000:000"

ทำได้ดีนี่. คุณได้รับการโหวตของฉันเพราะคุณเป็นแรงบันดาลใจคำตอบ Matlab ของฉัน :-)
Hoki

3

C #, 179 175 ไบต์

เมื่อคุณมีบิวอินในการกำจัดทำไมไม่ใช้ 'em

static void Main(string[]a){var t=TimeSpan.FromTicks(long.Parse(Console.ReadLine())*10);Console.Write(t.ToString((t.Days<1?"hh":@"\2\4")+@"\:mm\:ss\:ffffff").Insert(12,":"));}

ด้วยการจัดรูปแบบที่ดีกว่า:

static void Main(string[]a){
    var t = TimeSpan.FromTicks(long.Parse(Console.ReadLine())*10);
    Console.Write(t.ToString((t.Days<1?"hh":@"\2\4")+@"\:mm\:ss\:ffffff").Insert(12,":"));
    Console.Read();
}

3

Excel, 65 63 ตัวอักษร

สมมติว่าไมโครวินาทีของคุณอยู่ในA1 :

=TEXT(A1/50/1200^3,"[HH]:mm:ss:")&RIGHT(TEXT(A1,"000\:000"),7)

เอาท์พุท:

        A              B
1            0  00:00:00:000:000
2  12345678900  03:25:46:678:900
3  86400000000  24:00:00:000:000

2

Perl, 141 78 ไบต์

printf"%02d"x3.%03d:%03d",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_‌​%1e3

77 ไบต์ของรหัส +1 สำหรับ-nธง ทำงานด้วย:

echo 12345678900 | perl -ne'printf"%02d"x3.%03d:%03d",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_‌​%1e3'

ขอบคุณ Thomas Kwa และ chilemagic สำหรับการลดขนาดรหัสของฉันเกือบครึ่ง


ผมคิดว่าอาจจะเป็น3600000000 36e8
lirtosiast

แทนที่จะใช้chomp($n=<STDIN>);คุณสามารถเรียกใช้เป็นหนึ่งซับด้วย-nแฟล็ก (ซึ่งนับเป็น 1 อักขระ) นอกจากนี้คุณยังไม่จำเป็นต้องใช้ในแต่ละรอบint(..) $_การใช้ปลายของโทมัสเช่นกันเราสามารถทำให้มันลงไปecho 12345678900 | perl -ne'printf"%02d:%02d:%02d:%03d:%03d\n",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_%1e3'และอาจจะมีวิธีที่สั้นกว่าด้วย
hmatt1

คุณไม่จำเป็นต้องใช้\nสตริงในเอาต์พุต คุณสามารถแทนที่สตริงด้วย"%02d:"x3 ."%03d:%03d"
hmatt1

@chilemagic การใช้ "echo" นับเป็นการเพิ่มจำนวนไบต์หรือไม่?
ASCIIThenANSI

@ ASCIIThenANSI ไม่ได้เป็นเพราะไม่ใช่ส่วนหนึ่งของโปรแกรมของคุณ อักขระที่คุณจะนับเป็นตัวอักษรระหว่างเครื่องหมายคำพูดเดี่ยวprintf"%02d:%02d:%02d:%03d:%03d\n",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_‌​%1e3และจากนั้นคุณเพิ่มไบต์เพิ่มเติมสำหรับการ-nตั้งค่าสถานะ หากคุณใช้-nleตัวอย่างเช่นนั่นจะนับเป็น 2 เพิ่มเติม (สำหรับnและและl) คุณจะได้รับ-และe(หรือEถ้าคุณจำเป็นต้องใช้say) ฟรี
hmatt1

1

Matlab - 88 89ไบต์

รับหนึ่งไบต์ด้วยโซลูชันโดยไม่ใช้ฟังก์ชันในตัว:

n=[36e8,6e7,1e6,1e3];f=@(t)sprintf('%02d:%02d:%02d:%03d:%03d',fix([t mod(t,n)]./[n 1]))

สร้างฟังก์ชั่นอินไลน์ซึ่งรับอาร์กิวเมนต์อินพุตtและส่งคืนสตริง

มันใช้การรวมเวกเตอร์fixและmodเพื่อแยกองค์ประกอบเวลาจากนั้นแสดง

มันค่อนข้างน่าผิดหวังที่การจัดรูปแบบของสตริงออกจะใช้เวลามากกว่าการคำนวณ ...

ทดสอบ:

for t=[0 12345678900 86400000000]
    f(t)
end

ans =
00:00:00:000:000
ans =
03:25:45:678:900
ans =
24:00:00:000:000

รุ่น 89 ไบต์:

f=@(t)sprintf('%s:%03d:%03d',datestr(fix(t/1e6)/86400,13),fix(mod(t,1e6)/1e3),mod(t,1e3))

มันแยกจำนวนใช้ฟังก์ชันในตัวสำหรับส่วน hh: mm: ss ซึ่งไม่สามารถจัดการกับไมโครวินาทีดังนั้นสตริงจึงเสร็จสมบูรณ์พร้อมการรวมกันของfixและmodการดำเนินงาน


1

JavaScript (ES6), 128 118 116 111 ไบต์

อาจมีความเป็นไปได้ในการเล่นกอล์ฟ

f=t=>(t<864e8?new Date(t/1e3).toJSON().slice(11,-1):`24:00:00:000`).replace(`.`,`:`)+':'+('00'+t%1e3).slice(-3)

การสาธิต

มันคือ ES6 ดังนั้น Firefox เท่านั้นสำหรับตอนนี้อย่างไรก็ตาม:

f=t=>(t<864e8?new Date(t/1e3).toJSON().slice(11,-1):`24:00:00:000`).replace(`.`,`:`)+':'+('00'+t%1e3).slice(-3)

// DEMO
document.body.innerHTML += '<br>' + f(0);
document.body.innerHTML += '<br>' + f(12345678020);
document.body.innerHTML += '<br>' + f(86400000000);


ไม่จำเป็นต้องตรวจสอบครั้งแรกเนื่องจากคำถามนั้นชัดเจน: 0 <= n <= 86400000000
edc65

@ edc65 หากไม่มีการตรวจสอบครั้งแรกฉันจะได้รับช่วง 0 ≤ n <86400000000 เท่านั้นเนื่องจาก 8.64e10 จะพลิกไปในวันถัดไป
rink.attendant.6

โอ้ใช่ฉันพลาดไป toJSON () แทน toISOString ()?
edc65

1

C, 113 103 105 105 ไบต์

แก้ไข: ผลักออกอีกไบต์

การแก้ไข: ลบแบบยาวแล้วขอบคุณผู้ใช้บางคน

ไม่ใช่คำตอบ C ที่สั้นที่สุด แต่ฉันสนุกกับการรับคืนดังนั้นฉันรู้สึกเหมือนว่าบางคนอาจจะชอบสิ่งนี้

i,k,p=16;
#define f(n)for(;i<5;p-=i++<2?4:3)k=i<2?1000:60,printf("%0*d%c\r",p,n%k,i?58:13),n/=k;puts("");

เรียกว่าชอบ:

int main() {
    long long n = 12345678900;
    f(n);

    return 0;
}

ขึ้นอยู่กับแพลตฟอร์ม "ยาว" อาจเป็นเพียง 32- บิต (ดูen.wikipedia.org/wiki/64-bit_computing#64-bit_data_models ) ฉันหลีกเลี่ยงปัญหาโดยการประกาศ "f" เป็นมาโครแทนที่จะเป็นฟังก์ชัน
ผู้ใช้บางคน

ฉันสังเกตว่า. ฉันสันนิษฐานว่า GCC บน x64 แก้ไขได้ในวันพรุ่งนี้
Andrea Biondo

0

CoffeeScript, 127 ไบต์

เอาวิธีการในคำตอบของ ASCIIThenANSI มันแย่มากที่API คอนโซล JavaScript ไม่มีตัวยึดตำแหน่งรูปแบบสำหรับการใส่หมายเลข

p=(a,b)->('00'+~~a).slice -b||-2
f=(t)->console.log '%s:%s:%s:%s:%s',p(t/36e8),p(t/6e7%60),p(t/1e6%60),p(t/1e3%1e3,3),p t%1e3,3

0

Powershell 153

$t=[timespan]::FromTicks(($a=$args[0]));"{0:D2}:{1:D2}:{2:D2}:{3:D3}:{4:000}"-f
[int]($t.TotalHours),$t.Minutes,$t.Seconds,$t.Milliseconds,(($a%1e4)/10)

การใช้

powershell -nologo .\modprintsec.ps1 123456789000    
03:25:45:678:900   
powershell -nologo .\modprintsec.ps1 864000000000   
24:00:00:000:000   
powershell -nologo .\modprintsec.ps1 0   
00:00:00:000:000 

0

F #, 111 92 102 ไบต์

การวนซ้ำครั้งแรก: แนวคิดพื้นฐาน

การวนซ้ำที่สอง: ค่าคงที่ที่เล็กกว่า

การทำซ้ำครั้งที่สาม: การจัดรูปแบบที่ถูกต้องสำหรับส่วนหลักเดียว

หมายเหตุฟังก์ชั่นนี้จะต้องให้ int64 ทำงาน

let s,t=60L,1000L
let f n=sprintf"%02d:%02d:%02d:%03d:%03d"(n/s/s/t/t)(n/s/t/t%s)(n/t/t%s)(n/t%t)(n%t)

ตัวอย่างผลลัพธ์:

f 0L           -> "00:00:00:000:000"
f 12345678900L -> "03:25:45:678:900"
f 86400000000L -> "24:00:00:000:000"

0

PHP - 115 102 ไบต์

วิธีการแก้ปัญหาใน 155 ไบต์ (ห่อที่นี่ใน 3 บรรทัดสำหรับการอ่าน):

$a=$argv[1];
$h=($a-($m=($a=($a-($s=($a=($a-($t=($a=($a-($u=$a%1000))/1000)%1000))/1000)%60))/60)%60))/60;
printf("%02d:%02d:%02d:%03d:%03d",$h,$m,$s,$t,$u);

บรรทัดที่สองคำนวณ (จากภายในสู่ภายนอก) ค่าที่แน่นอนของส่วนประกอบเริ่มต้นด้วย microseconds

เวอร์ชันที่สั้นกว่า (115 ไบต์ห่อด้วยสองบรรทัดเพื่อให้อ่านได้):

$u=$argv[1];$h=($m=($s=($t=$u/1000)/1000)/60)/60;
printf("%02d:%02d:%02d:%03d:%03d",$h,$m%60,$s%60,$t%1000,$u%1000);

นอกจากนี้ยังใช้การมอบหมายแบบฝังตัวเพื่อคำนวณการแปลงจำนวนอินพุตของไมโครวินาทีเป็นมิลลิวินาทีวินาทีนาทีและชั่วโมงโดยใช้หมายเลขทศนิยม ตัวดำเนินการโมดูลัส ( %) และรูปแบบตัวเลขทศนิยม ( %d) ของprintf()จะถูกใช้เพื่อบังคับให้ตัวเลขจำนวนเต็ม (ส่วนที่เป็นเศษส่วนจะถูกละเว้น)

โซลูชันอื่นที่ใช้ฟังก์ชันวันที่ (102 ไบต์)

$u=$argv[1];
echo gmdate("H:i:s",strtotime("@".substr($u,0,-6))),":",substr($u,-6,3),":",substr($u,-3);

ชั่วโมง: นาที: ส่วนวินาทีถูกจัดการโดยฟังก์ชั่นวันที่ของ PHP gmdate()และstrtotime()มิลลิวินาทีและไมโครวินาทีจะถูกแยกออกเป็นสตริงจากค่าอินพุต

การใช้งาน:

$ php -r '$u=$argv[1];echo gmdate("H:i:s",strtotime("@".substr($u,0,-6))),":",substr($u,-6,3),":",substr($u,-3);' 7198898787; echo
01:59:58:898:787

0

Java, 215 ไบต์

String f(long n){return p(n/3600000000l,2)+":"+p(n/60000000%60,2)+":"+p(n/1000000%60,2)+":"+p(n/1000%1000,3)+":"+p(n%1000,3);}String p(long n,int i){String s=String.valueOf(n);while(s.length()<i){s="0"+s;}return s;}

วิธีการfคำนวณบางอย่างในnการทำงานชั่วโมงนาที ฯลฯ และมอบหมายให้วิธีpการจัดรูปแบบแต่ละค่าอย่างถูกต้อง

จัดรูปแบบ:

String f(long n) {
    return p(n / 3600000000l, 2) + ":" + p(n / 60000000 % 60, 2) + ":" 
            + p(n / 1000000 % 60, 2) + ":" + p(n / 1000 % 1000, 3) + ":" + p(n % 1000, 3);
}

String p(long n, int i) {
    String s = String.valueOf(n);
    while (s.length() < i) {
        s = "0" + s;
    }
    return s;
}

การใช้งาน:

public void demo() {
    long n = 12345678900l;
    System.out.println(f(n));
}

-1

Ruby - 82 ไบต์

puts (t=Time.at(0,gets.to_i)).strftime("%2H:%2M:%2S:%3L:#{(t.usec%1000).to_s.rjust(3,?0)}")

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