Định dạng thời gian trò chơi tăng dần


18

Định dạng thời gian trò chơi tăng dần

Mục tiêu

Các trò chơi tăng dần thường có đồng hồ đếm ngược thể hiện ngày, giờ, phút và giây cho đến khi hoàn thành nhiệm vụ. Tùy thuộc vào không gian có sẵn, chúng có thể được định dạng là:

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

Mục tiêu của mã golf này là viết một hàm hoặc chương trình thực hiện định dạng này.

Đầu vào

  • Tổng số giây.
  • Số lượng phân khúc tối đa để đầu ra.

Đầu ra

  • Các phân khúc bao gồm:
    • 0 tuần
    • 0 ngày
    • 0 giờ
    • 0 phút
    • 0 giây
  • Mỗi phân đoạn được phân tách bằng một không gian duy nhất.
  • Các đoạn được hiển thị phải liền kề nhau. Ví dụ: bạn sẽ không hiển thị giờ và giây mà không hiển thị phút, ngay cả khi không có phút nào.
  • Các giá trị một chữ số không có các số 0 đứng đầu, mặc dù giá trị bằng 0 phải được hiển thị là 0.
  • Các giá trị được làm tròn xuống.
  • Phân đoạn đầu tiên được hiển thị là giá trị khác không đầu tiên.

Các trường hợp thử nghiệm

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

Chiến thắng

Giải pháp đếm byte thấp nhất trong một tuần sẽ giành được "sự chấp nhận".

Chỉnh sửa

  • Làm rõ phân khúc nào là đầu tiên, như trong ví dụ.
  • Đã thêm trường hợp kiểm tra 4 theo yêu cầu.

Sản lượng dự kiến ​​là 307891 1gì? 0whoặc 1w.
jnovacho

1
@jnovacho Sẽ không 3d? "Phân đoạn đầu tiên được hiển thị là giá trị khác không đầu tiên"
Luigi

@Luigi Đúng. Tôi đã bỏ lỡ điều đó.
jnovacho

Tôi có phải là người duy nhất nghĩ rằng đây là câu hỏi "ai đó có thể vui lòng viết mã này cho tôi không?"
fho

Không phải ngày nào một nhiệm vụ golf mã thực sự có thể hữu ích. Tôi nói hãy đi với nó: D
Geobits

Câu trả lời:


7

CJam (ảnh chụp nhanh), 41 38 byte

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

Ở trên sử dụng ký hiệu dấu mũ, vì hai trong số các ký tự là không thể in được.

Cảm ơn @ Sp3000 vì đã chơi golf 2 byte.

Kiểm tra

Bản phát hành ổn định mới nhất (0.6.5) có một lỗi có thể gây ra {}#trả về Số nguyên thay vì Long. Nghịch lý thay, điều này có thể được phá vỡ bằng cách chuyển thành số nguyên ( i).

Để chạy mã này với mã với trình thông dịch trực tuyến, nhấp vào liên kết này hoặc sao chép mã từ dán này .

Ngoài ra, bạn có thể tải xuống và xây dựng ảnh chụp nhanh mới nhất bằng cách thực hiện các lệnh sau:

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

Bạn có thể tạo tệp CJam như thế này:

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

Làm thế nào nó hoạt động

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

Tôi chỉ nhận thấy rằng Java hỗ trợ khai báo như thế nào String a[]. Điều này cho phép tôi kéo tờ khai bzvào cùng một dòng, điều này giúp tôi không phải viết Stringlại.


1
Giống như ;z=" ")- rất thông minh.
OldCurmudgeon

5

C, 134 127 110 104 103 byte

Phiên bản mới:

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

Phiên bản trước:

#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 byte

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

chỉnh sửa: +4 ký tự, vì tôi quên 0strường hợp thử nghiệm.

Điều này bao gồm 2 ký tự không thể in được. Lấy mã thực tế và thử trực tuyến: Trình diễn

Giải trình:

                                         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 byte

Nỗ lực đầu tiên của tôi để chơi một cái gì đó.

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
Nỗ lực đầu tiên tuyệt vời! Tốt hơn một số lần thử thứ sáu của tôi ...;) Bạn có thể cắt 3 byte bằng cách thay đổi if n!=0thành chỉ if n.
kirbyfan64sos

Ồ vâng, quên rằng 0 đánh giá thành Sai. Cảm ơn.
f.rodrigues

2

Julia, 158 byte

Tôi chắc chắn rằng điều này có thể ngắn hơn với một cách tiếp cận thông minh hơn, nhưng đây là những gì tôi có cho đến bây giờ.

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

Điều này tạo ra một hàm không tên, chấp nhận hai số nguyên làm đầu vào và trả về một chuỗi. Để gọi nó, đặt tên cho nó, vd f=(s,g)->....

Ungolfed + giải thích:

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

Ví dụ:

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

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

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

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

Bản demo trực tiếp và tất cả các trường hợp thử nghiệm.

Lộn xộn, lộn xộn, lộn xộn ...

Mất khoảng 3 - 7 giây để thực hiện các trường hợp thử nghiệm trên Chrome dành cho Android. Đừng không sử dụng chế độ debug, có thể đóng băng trình duyệt của bạn trong trường hợp này vì tất cả các đầu ra sẽ được in.


Rs là gì? -----
Caleb Paul

@W slideshowanks Tôi đã thêm một liên kết trong tiêu đề. Đó là một thứ ngôn ngữ dựa trên regex tôi đã viết.
kirbyfan64sos

0

C #, 239 237 170 164 byte

Đây không phải là nơi gần như nhỏ gọn như các giải pháp khác, nhưng tôi không thể đặt ra thách thức này mà không tự đâm vào nó.

Lặp đi lặp lại mới nhất này được lấy cảm hứng từ câu trả lời của ESC .

Ấn định cho rõ ràng:

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();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.