Format Waktu Game Tambahan

18

Format Waktu Game Tambahan

Tujuan

Game tambahan sering kali memiliki penghitung waktu mundur yang menyatakan hari, jam, menit, dan detik hingga tugas selesai. Bergantung pada ruang yang tersedia, mereka dapat diformat sebagai:

2d 13h
23h 59m 48s
14m
3h 0m 0s

Tujuan golf kode ini adalah untuk menulis fungsi atau program yang melakukan pemformatan ini.

Input

  • Total jumlah detik.
  • Jumlah maksimum segmen untuk diproduksi.

Keluaran

  • Segmen meliputi:
    • 0w minggu
    • Hari 0d
    • Jam 0jam
    • 0 m menit
    • 0 detik
  • Setiap segmen dipisahkan oleh satu ruang.
  • Segmen yang ditampilkan harus bersebelahan. Misalnya, Anda tidak akan menampilkan jam dan detik tanpa menunjukkan menit, bahkan jika ada nol menit.
  • Nilai satu digit tidak memiliki nol di depan, meskipun nilai nol harus ditunjukkan sebagai 0.
  • Nilai dibulatkan ke bawah.
  • Segmen pertama yang ditampilkan adalah nilai bukan nol pertama.

Uji Kasus

seconds  segments  output
     0      1      0s
   123      1      2m
   123      2      2m 3s
   123      3      2m 3s
 82815      3      23h 0m 15s
307891      2      3d 13h
307891      4      3d 13h 31m 31s
604800      1      1w
604800      6      1w 0d 0h 0m 0s

Kemenangan

Solusi byte-count terendah dalam satu minggu akan memenangkan "penerimaan".

Suntingan

  • Klarifikasi segmen mana yang lebih dulu, seperti yang ditunjukkan dalam contoh.
  • Menambahkan test case 4 sesuai permintaan.
Makanan Tangan
sumber
Untuk apa output yang diharapkan 307891 1? 0watau 1w.
jnovacho
1
@ jnovacho bukan 3d? "Segmen pertama yang ditampilkan adalah nilai bukan nol pertama"
Luigi
@Luigi Benar. Saya merindukan itu.
jnovacho
Apakah saya satu-satunya yang berpikir bahwa ini adalah pertanyaan "bisakah seseorang menulis kode ini untuk saya"?
untuk
Tidak setiap hari tugas kode golf sebenarnya berguna. Saya katakan pergi bersamanya: D
Geobits

Jawaban:

7

CJam (snapshot), 41 38 byte

q~"<<^X^G"{imd\}%W%"wdhms":s.+_{0=}#><S*

Di atas menggunakan notasi tanda kuret, karena dua karakter tidak dicetak.

Terima kasih kepada @ Sp3000 untuk bermain golf 2 byte.

Pengujian

Rilis stabil terbaru (0.6.5) memiliki bug yang dapat menyebabkan {}#mengembalikan Integer, bukan Longs. Cukup paradoks, ini dapat dielakkan dengan casting ke integer ( i).

Untuk menjalankan ini dengan kode dengan penerjemah online, klik tautan permanen ini atau salin kode dari tempel ini .

Atau, Anda dapat mengunduh dan membuat snapshot terbaru dengan menjalankan perintah berikut:

hg clone http://hg.code.sf.net/p/cjam/code cjam-code
cd cjam-code/
ant

Anda dapat membuat file CJam seperti ini:

base64 -d > game-time.cjam <<< cX4iPDwYByJ7aW1kXH0lVyUid2RobXMiOnMuK197MD19Iz48Uyo=

Bagaimana itu bekerja

q~        e# Read an evaluate the input.
"<<^X^G"  e# Push the string corresponding to the array [60 60 24 7
{         e# For each character:
  i       e#   Replace it by its code point.
  md      e#   Push divisor and residue of the division by that code point.
  \       e#   Swap their order.
}%
W%        e# Reverse the resulting array.
"wdhms":s e# Push ["w" "d" "h" "m" "s"].
.+        e# Perform vectorized concatenation.
_         e# Push a copy.
{0=}#     e# Find the index of the first pair with positive integer.
>         e# Remove the preceding pairs.
<         e# Truncate to the number of pairs specified in the input.
S*        e# Join, separating by spaces.
Dennis
sumber
6

Java, 197 191 byte

String p(int s,int m){String a[]={s%60+"s",(s/=60)%60+"m",(s/=60)%24+"h",(s/=24)%7+"d",(s/7)+"w"},b="",z="";for(s=5;s>0&&a[--s].charAt(0)=='0';);for(;s>=0&&--m>=0;z=" ")b+=z+a[s--];return b;}

Saya hanya memperhatikan bahwa Java mendukung deklarasi seperti String a[]. Ini memungkinkan saya untuk menarik deklarasi bdan zke baris yang sama, yang menyelamatkan saya dari menulis Stringlagi.

ECS
sumber
1
Seperti ;z=" ")- sangat pintar.
OldCurmudgeon
5

C, 134 127 110 104 103 byte

Versi baru:

a,e=5;f(n,x){for(;e;n%=a)a=(int[]){1,60,3600,86400,604800}[--e],x>e?printf("%u%c ",n/a,"smhdw"[e]):0;}

Versi sebelumnya:

#define p(a) x>--e?printf("%u%c ",n/a,"smhdw"[e]):0;n%=a;
e=5;f(n,x){p(604800)p(86400)p(3600)p(60)p(1)}
openaddr
sumber
4

Pyth, 39 43 byte

jd_>vz+V?u?GeGPG+m%~/QddCM"<<"Q)Q]0"smhdw

sunting: +4 karakter, karena saya lupa 0stest case.

Ini termasuk 2 karakter yang tidak diinginkan. Dapatkan kode aktual dan coba online: Demonstrasi

Penjelasan:

                                         z = 1st input line (segments, as string)
                                         Q = 2nd input line (time, as int)
                         "<<.."          string with 4 chars
                       CM                convert to ASCCI-values => [60,60,24,7]
                m                        map each d of ^ to:
                   /Qd                     Q / d 
                  ~                        update Q, but use the old value for
                 %  Q d                    Q mod d
                                         this gives [sec, min, hour, day]
               +               Q         add Q (week)
        u                       )        apply the following expression to G, 
                                         starting with G = [s,m,h,d,w], until
                                         G stops changing:
         ? eG                              if eG != 0:
          G                                  update G with G (stop changing)
                                           else:
             PG                              update G with G[-1]
                                         this gets rid of trailing zeros
      +V                         "smhdw  vectorized add with "smhdw"
   >vz                                   only use the last eval(z) items
  _                                      reverse order
jd                                       join by spaces and print
Jakube
sumber
3

Python 2.7 - 181 178 174 byte

Upaya pertama saya untuk bermain golf sesuatu.

def I(s,M):
 z=[0]*5;j=0
 for i in [604800,86400,3600,60,1]:z[j],s=s/i,s%i;j+=1
 l=[z.index(n)for n in z if n][0]
 return" ".join([str(i)+n for n,i in zip('wdhms',z)][l:l+M])
f. tawaran
sumber
1
Usaha pertama yang bagus! Lebih baik daripada beberapa upaya keenam saya ...;) Anda dapat memotong 3 byte dengan mengubah if n!=0menjadi adil if n.
kirbyfan64sos
Oh ya, lupa bahwa 0 bernilai False. Terima kasih.
f.rodrigues
2

Julia, 158 byte

Saya yakin ini bisa lebih pendek dengan pendekatan yang lebih pintar, tapi inilah yang saya miliki untuk saat ini.

(s,g)->(j=0;p=cell(5,1);for i=[604800,86400,3600,60,1] p[j+=1],s=s÷i,s%i end;z=findfirst(p);z>0?join([string(p[i],"wdhms"[i])for i=z:min(z+g-1,5)]," "):"0s")

Ini menciptakan fungsi tanpa nama yang menerima dua bilangan bulat sebagai input dan mengembalikan string. Untuk menyebutnya, berikan nama, mis f=(s,g)->....

Penjelasan + tidak dikumpulkan:

function f(s, g)
    # Initialize an array and an index
    p = cell(5, 1)
    j = 0

    # Loop over the number of seconds in a week, day, hour,
    # minute, and second
    for i in [604800, 86400, 3600, 60, 1]
        # Set the jth element in p to be the quotient and s
        # to be the remainder of i into s
        p[j+=1], s = s ÷ i, s % i
    end

    # Get the index of the first nonzero value in p
    z = findfirst(p)

    if z > 0
        # We start the string at the first nonzero value
        # and continue until we hit the desired number of
        # units (z+g-1) or the maximum number of units (5),
        # whichever comes first. The appropriate unit is
        # appended to each value and the values are then
        # joined with a space.
        join([string(p[i], "wdhms"[i]) for i in z:min(z+g-1,5)], " ")
    else
        # If there are no nonzero values in p, we just
        # have 0 seconds
        "0s"
    end
end

Contoh:

julia> f(82815, 6)
"23h 0m 15s"

julia> f(604800, 4)
"1w 0d 0h 0m"
Alex A.
sumber
1

Scala, 147 byte

def p(s:Int,i:Int)=List(s/604800+"w",s/86400%7+"d",s/3600%24+"h",s/60%60+"m",s%60+"s").dropWhile(k=>k.head=='0'&&k.tail!="s").take(i).mkString(" ")
pengguna42083
sumber
1

rs , 367 byte

^(\d+)/(_)^^(\1)
(_*) (\d)/\1!\2
_{60}/#
#{60}/@
@{24}/:
:{7}/;
(_+)/(^^\1)s
(#+)/(^^\1)m
(@+)/(^^\1)h
(:+)/(^^\1)d
(;+)/(^^\1)w
([a-z])/\1 
w ((\d+[^\dd])|!)/w 0d \1
d ((\d+[^\dh])|!)/d 0h \1
h ((\d+[^\dm])|!)/h 0m \1
(m|^) ?!/\1 0s!
!(\d+)/!(_)^^(\1)
#
+#(\d+)([a-z]) ?(.*)!(_*)/\1\2 #\3!\4@
#/
(@+)/ (_)^^((^^\1))
!(_+) \1(_*)/!\2
_+ _+/
+\d+[a-z] ?!_/!
 *!/
^$/0s

Demo langsung dan semua kasus uji.

Berantakan, berantakan, berantakan ...

Diperlukan waktu sekitar 3-7 detik untuk menjalankan kasus uji di Chrome untuk Android. Jangan tidak menggunakan mode debug, yang dapat membekukan browser Anda dalam hal ini karena semua output yang akan dicetak.

kirbyfan64sos
sumber
Apa rs? -----
Caleb Paul
@Wideshanks Saya menambahkan tautan dalam judul. Ini adalah hal-ish berbasis bahasa regex yang saya tulis.
kirbyfan64sos
0

C #, 239 237 170 164 byte

Ini bukan tempat yang sekompak solusi lain, tapi saya tidak bisa menghadapi tantangan ini tanpa harus menusuknya sendiri.

Iterasi terbaru ini terinspirasi oleh jawaban ESC .

Diindentasi untuk kejelasan:

string G(int s,int n){
    int[]x={s%60,(s/=60)%60,(s/=60)%24,(s/=24)%7,s/7};
    for(s=5;x[--s]==0&s>0;);
    var o="";
    while(n-->0&s>=0)
        o+=" "+x[s]+"smhdw"[s--];
    return o.Trim();
}
Makanan Tangan
sumber