Artımlı Oyun Saati Biçimi


18

Artımlı Oyun Saati Biçimi

Hedef

Artımlı oyunlarda genellikle bir görev tamamlanana kadar günleri, saatleri, dakikaları ve saniyeleri ifade eden bir geri sayım sayacı bulunur. Kullanılabilir alana bağlı olarak, bunlar şu şekilde biçimlendirilebilir:

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

Bu kod golfünün amacı, bu biçimlendirmeyi yapan bir işlev veya program yazmaktır.

Girdiler

  • Toplam saniye sayısı.
  • Çıktılacak maksimum segment sayısı.

Çıktı

  • Segmentler şunları içerir:
    • 0w hafta
    • 0d günler
    • 0 saat
    • 0m dakika
    • 0 saniye
  • Her bölüm tek bir boşlukla ayrılır.
  • Görüntülenen segmentler bitişik olmalıdır. Örneğin, sıfır dakika olsa bile, dakika göstermeden saat ve saniye göstermezsiniz.
  • Tek basamaklı değerlerin başında sıfır yoktur, ancak sıfır değeri olarak gösterilmelidir 0.
  • Değerler aşağı yuvarlanır.
  • Görüntülenen ilk segment sıfır olmayan ilk değerdir.

Test Durumları

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

Kazanan

Bir haftadaki en düşük bayt sayımı çözümü "kabul" kazanacaktır.

Düzenlemeler

  • Örneklerde gösterildiği gibi ilk olarak hangi segmentin olduğu açıklandı.
  • İstek üzerine test durumu 4 eklendi.

Beklenen çıktı ne için 307891 1? 0wveya 1w.
jnovacho

1
@jnovacho Değil mi 3d? "Görüntülenen ilk segment sıfır olmayan ilk değer"
Luigi

@Luigi True. Bunu özledim.
jnovacho

Bunun "bazıları benim için bu kodu yazabilir mi?" Sorusu olduğunu düşünen tek kişi ben miyim?
fho

Bir kod golf görevi aslında her gün yararlı olmayabilir. Onunla git diyorum: D
Geobits

Yanıtlar:


7

CJam (enstantane), 41 38 bayt

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

Yukarıdaki karakter, iki karakter yazdırılamadığından düzeltme işareti kullanmaktadır.

2 bayt golf için @ Sp3000 sayesinde.

Test yapmak

En son kararlı sürümde (0.6.5), Longs yerine Integers döndürülmesine neden olabilecek bir hata var {}#. Oldukça paradoksal olarak, bu tamsayıya ( i) dökümle atlatılabilir .

Bunu çevrimiçi yorumlayıcıyla kodla çalıştırmak için bu kalıcı bağlantıyı tıklatın veya kodu bu yapıştırmadan kopyalayın .

Alternatif olarak, aşağıdaki komutları uygulayarak en son anlık görüntüyü indirip oluşturabilirsiniz:

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

CJam dosyasını şu şekilde oluşturabilirsiniz:

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

Nasıl çalışır

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.

6

Java, 197 191 bayt

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;}

Sadece Java'nın beyanı desteklediğini fark ettim String a[]. Bu da beni tekrar yazmamı engelleyen aynı satırın bve deklarasyonun çekilmesine izin verdi .zString


1
Gibi ;z=" ")- çok zeki.
OldCurmudgeon

5

Cı, 134 127 110 104 103 bayt

Yeni sürüm:

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;}

Önceki versiyon:

#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)}

4

Pyth, 39 43 bayt

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

edit: +4 karakter, çünkü 0stest vakasını unuttum .

Bu, yazdırılamaz 2 karakter içerir. Gerçek kodu alın ve çevrimiçi deneyin: Gösteri

Açıklama:

                                         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

3

Python 2.7 - 181 178 174 bayt

İlk denemede golf oynuyorum.

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])

1
Harika bir ilk deneme! Daha Altıncı girişimleri bazı ... daha;) Sen değiştirerek 3 bayt kesilmiş olabilir if n!=0lazım if n.
kirbyfan64sos

Oh evet, 0'ın Yanlış olarak değerlendirildiğini unutmuşum. Teşekkürler.
f.rodrigues

2

Julia, 158 bayt

Daha akıllıca bir yaklaşımla bunun daha kısa olabileceğinden eminim, ama şimdilik bu var.

(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")

Bu, iki tamsayıyı girdi olarak kabul eden ve bir dize döndüren adsız bir işlev oluşturur. Bunu aramak için bir ad verin, örn f=(s,g)->....

Ungolfed + açıklaması:

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

Örnekler:

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

julia> f(604800, 4)
"1w 0d 0h 0m"

1

Scala, 147 bayt

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(" ")

1

rs , 367 bayt

^(\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

Canlı demo ve tüm test senaryoları.

Dağınık, dağınık, dağınık ...

Android için Chrome'da test senaryolarını yürütmek yaklaşık 3-7 saniye sürer. Do not çünkü basılacaktır tüm çıkışın bu durumda tarayıcınızı dondurabilirsiniz hangi ayıklama modunu kullanın.


RS nedir? -----
Caleb Paul

@Wideshanks Başlığa bir bağlantı ekledim. Yazdığım regex tabanlı bir dil-ish şey.
kirbyfan64sos

0

C #, 239237170 164 bayt

Bu, diğer çözümler kadar kompakt bir yer değil, ancak bu zorluğu kendimden bir bıçak olmadan yapamam.

Bu son yineleme ESC'nin cevabından ilham aldı .

Netlik için girintili:

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();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.