รูปแบบเวลาของเกมที่เพิ่มขึ้น


18

รูปแบบเวลาของเกมที่เพิ่มขึ้น

เป้าหมาย

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

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

เป้าหมายของรหัสกอล์ฟนี้คือการเขียนฟังก์ชั่นหรือโปรแกรมที่ดำเนินการจัดรูปแบบนี้

ปัจจัยการผลิต

  • จำนวนวินาทีทั้งหมด
  • จำนวนเซ็กเมนต์สูงสุดที่จะส่งออก

เอาท์พุต

  • กลุ่มรวมถึง:
    • 0สัปดาห์
    • 0วัน
    • 0hชั่วโมง
    • 0นาที
    • 0วินาที
  • แต่ละส่วนจะถูกคั่นด้วยช่องว่างเดียว
  • กลุ่มที่แสดงจะต้องต่อเนื่องกัน ตัวอย่างเช่นคุณจะไม่แสดงชั่วโมงและวินาทีโดยไม่แสดงนาทีแม้ว่าจะมีศูนย์เป็นนาที
  • 0ค่าหลักเดียวไม่ได้มีเลขศูนย์นำแม้ว่าค่าเป็นศูนย์จะต้องแสดงให้เห็นว่า
  • ค่าจะถูกปัดเศษลง
  • ส่วนแรกที่แสดงเป็นค่าที่ไม่ใช่ศูนย์แรก

กรณีทดสอบ

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

การชนะ

โซลูชันนับไบต์ต่ำสุดในหนึ่งสัปดาห์จะได้รับ "การยอมรับ"

การแก้ไข

  • ชี้แจงว่าส่วนใดเป็นอันดับแรกดังที่แสดงในตัวอย่าง
  • เพิ่มกรณีทดสอบ 4 ตามคำขอ

ผลลัพธ์ที่คาดหวังไว้คืออะไร307891 1? หรือ0w 1w
jnovacho

1
@jnovacho มันจะ3dไม่เป็นอย่างนั้นหรือ "ส่วนแรกที่แสดงเป็นค่าที่ไม่ใช่ศูนย์แรก"
Luigi

@Luigi True ฉันคิดถึงสิ่งนั้น
jnovacho

ฉันเป็นคนเดียวที่คิดว่านี่เป็นคำถาม "ใครบางคนได้โปรดเขียนรหัสนี้สำหรับฉัน" คำถาม?
fho

ไม่ใช่ทุกวันงานกอล์ฟรหัสอาจมีประโยชน์จริง ๆ ฉันพูดไปด้วย: D
Geobits

คำตอบ:


7

CJam (ภาพรวม), 41 38 ไบต์

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

ด้านบนใช้เครื่องหมายรูปหมวกเนื่องจากตัวอักษรสองตัวไม่สามารถพิมพ์ได้

ขอบคุณ @ Sp3000 สำหรับการเล่นกอล์ฟขนาด 2 ไบต์

การทดสอบ

รุ่นเสถียรล่าสุด (0.6.5) มีข้อบกพร่องที่สามารถทำให้{}#คืนค่าจำนวนเต็มแทน Longs ค่อนข้างขัดแย้งสิ่งนี้สามารถหลีกเลี่ยงได้โดยการหล่อเป็นจำนวนเต็ม ( i)

หากต้องการเรียกใช้ด้วยรหัสที่มีล่ามออนไลน์ให้คลิกลิงก์นี้หรือคัดลอกรหัสจากวางนี้

หรือคุณสามารถดาวน์โหลดและสร้างสแน็ปช็อตล่าสุดโดยดำเนินการคำสั่งต่อไปนี้:

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

คุณสามารถสร้างไฟล์ CJam เช่นนี้:

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

มันทำงานอย่างไร

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

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

ฉันเพิ่งสังเกตเห็นว่า Java String a[]สนับสนุนเช่นการประกาศ สิ่งนี้ทำให้ฉันสามารถดึงการประกาศของbและzลงในบรรทัดเดียวกันซึ่งช่วยฉันจากการเขียนStringอีกครั้ง


1
ชอบ;z=" ")- ฉลาดมาก
OldCurmudgeon

5

C, 134 127 110 104 103 ไบต์

เวอร์ชั่นใหม่:

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

รุ่นก่อนหน้า:

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

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

แก้ไข: +4 ตัวอักษรเพราะฉันลืม 0sกรณีทดสอบ

ซึ่งรวมถึง 2 ตัวอักษรที่ไม่สามารถพิมพ์ได้ รับรหัสจริงและลองออนไลน์:สาธิต

คำอธิบาย:

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

ความพยายามครั้งแรกของฉันในการเล่นกอล์ฟ

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
เยี่ยมครั้งแรก! ดีกว่าบางของความพยายามที่หกของฉัน ... ;) คุณสามารถตัด 3 ไบต์โดยการเปลี่ยนเพียงแค่if n!=0 if n
kirbyfan64sos

โอ้ใช่ลืมว่า 0 ประเมินว่าเป็นเท็จ ขอบคุณ
f.rodrigues

2

Julia, 158 ไบต์

ฉันแน่ใจว่านี่อาจสั้นกว่านี้ด้วยวิธีที่ชาญฉลาดกว่านี้ แต่นี่คือสิ่งที่ฉันมีในตอนนี้

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

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

คำอธิบาย Ungolfed +:

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

ตัวอย่าง:

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

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

1

สกาลา, 147 ไบต์

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

อาร์เอส , 367 ไบต์

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

การสาธิตสดและกรณีทดสอบทั้งหมด

ยุ่งยุ่ง ...

ใช้เวลาประมาณ 3-7 วินาทีในการดำเนินการกรณีทดสอบบน Chrome สำหรับ Android ไม่ได้ใช้โหมดการแก้ปัญหาซึ่งสามารถตรึงเบราว์เซอร์ของคุณในกรณีนี้เพราะทุกการแสดงผลที่จะได้รับการตีพิมพ์


อาร์เอสคืออะไร -----
คาเลบพอล

@Wanksanks ฉันเพิ่มลิงค์ในชื่อ มันเป็นสิ่งที่ฉันเขียนตามภาษา regex
kirbyfan64sos

0

C #, 239 237 170 164 ไบต์

นี่ไม่ใช่จุดที่ใกล้เคียงกับโซลูชันอื่น ๆ แต่ฉันไม่สามารถทำสิ่งที่ท้าทายนี้ได้โดยไม่ต้องแทงเอง

นี้ซ้ำล่าสุดได้รับแรงบันดาลใจจากคำตอบของ ESC

เยื้องเพื่อความชัดเจน:

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