Інкрементальний формат часу гри


18

Інкрементальний формат часу гри

Мета

Інкрементальні ігри часто мають таймер зворотного відліку, що виражає дні, години, хвилини та секунди до завершення завдання. Залежно від наявного місця, вони можуть бути відформатовані у вигляді:

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

Мета цього коду гольфу - написати функцію або програму, яка виконує таке форматування.

Вхідні дані

  • Загальна кількість секунд.
  • Максимальна кількість сегментів для виведення.

Вихід

  • Сегменти включають:
    • 0w тижнів
    • днів
    • 0 год
    • 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 True. Я пропустив це.
jnovacho

Чи я єдиний, хто думає, що це питання "хтось, будь ласка, напишіть цей код для мене"?
вчора

Це не кожен день завдання з гольфу з кодом може бути корисним. Я кажу: піди з цим: D
Геобіт

Відповіді:


7

CJam (знімок), 41 38 байт

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

У вищезазначеному використовується позначення каретки, оскільки два символи не можна друкувати.

Завдяки @ Sp3000 за те, що ви граєте в 2 байти.

Тестування

Останній стабільний випуск (0.6.5) містить помилку, яка може спричинити {}#повернення Integers замість 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

Ява, 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

С, 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

Джулія, 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)->....

Недоліки + пояснення:

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

rs , 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

Демо-версія та всі тестові приклади.

Брудний, безладний, безладний ...

На виконання тестових випадків у Chrome для Android потрібно близько 3-7 секунд. Як НЕ використовувати режим налагодження, який може заморозити ваш браузер в цьому випадку з - за всієї продукції , яка буде друкуватися.


Що у вас? -----
Калеб Пол

@Wideshanks Я додав посилання у назві. Це я написав на основі регулярних виразів мовою.
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();
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.