Перераховуйте всі часи дня за півтори години


31

Найкоротша відповідь виграє.

Він повинен бути відсортований, і за 24 години. Заключний рядок не містить коми.

Вихід повинен бути таким:

'00:00',
'00:30',
'01:00',
'01:30',
'02:00',
'02:30',
'03:00',
'03:30',
'04:00',
'04:30',
'05:00',
'05:30',
'06:00',
'06:30',
'07:00',
'07:30',
'08:00',
'08:30',
'09:00',
'09:30',
'10:00',
'10:30',
'11:00',
'11:30',
'12:00',
'12:30',
'13:00',
'13:30',
'14:00',
'14:30',
'15:00',
'15:30',
'16:00',
'16:30',
'17:00',
'17:30',
'18:00',
'18:30',
'19:00',
'19:30',
'20:00',
'20:30',
'21:00',
'21:30',
'22:00',
'22:30',
'23:00',
'23:30'

6
Це 24 години часу? Не могли б ви надати весь результат?
xnor

1
Потрібно сортувати вихід?
orlp

44
Що робити, якщо для моєї програми потрібно 23,5 годин?
tfitzger

9
Я не бачу, чому це буде негативним.
Еспен Шульстад

6
Лише невелика пропозиція щодо грошей. Я намагаюся підкріпити кожну обгрунтовану відповідь на виклик, який я створюю як невелику винагороду за докладені зусилля. У мене є багато представників, і тут насправді не потрібно підсилювати, але, будь ласка, врахуйте інших відповідачів, які можуть відмовитись від відповіді, якщо їх відповіді будуть проігноровані після багато роздумів і налагодження.
Логічний лицар

Відповіді:


17

Pyth, 26 байт

Pjbm%"'%02d:%s0',"d*U24"03

Демонстрація.

Почнемо з декартового добутку range(24)( U24) зі струною "03".

Потім ми відображаємо ці значення у відповідну підстановку, що формує рядок ( m%"'%02d:%s0',"d).

Потім отримані рядки з'єднуються в символі нового рядка ( jb).

Нарешті, ми видаляємо коду ( P) і друкуємо.


1
Схоже, у нас є новий претендент на приз. Автор pyth, це майже обман;)
Еспен Шульстад

15

Befunge-93, 63 байти

0>"'",:2/:55+/.55+%.":",:2%3*v
 ^,+55,","<_@#-*86:+1,"'".0. <

 

animation (анімація, зроблена з BefunExec )


14

Баш: 58 47 46 символів

h=`echo \'{00..23}:{0,3}0\'`
echo "${h// /,
}"

Мені подобається таке рішення :)
Еспен Шульстад

1
Анонімний користувач запропонував echo \'{00..23}:{0,3}0\'|sed 's/ /,\n/g'40 символів. Приємно. Спасибі. Але я вважаю за краще використовувати bashвласні сили.
манатура

1
printf "'%s',\n" {00..23}:{0,3}0
izabera

@manatwork ой, я не прочитав це питання добре, вибачте ...
izabera

printf "'%s'\n" {00..23}:{0,3}0|sed $\!s/$/,/ становить 45 байт
izabera

10

CJam, 31 30 29 байт

24,[U3]m*"'%02d:%d0',
"fe%~7<

Це досить прямо вперед із використанням форматування printf:

24,                              e# get the array 0..23
   [U3]                          e# put array [0 3] on stack
       m*                        e# do a cartesian product between 0..23 and [0 3] array
                                 e# now we have tuples like [[0 0], [0 3] ... ] etc
         "'%02d:%d0',
"fe%                             e# this is standard printf formatting. What we do here is
                                 e# is that we format each tuple on this string
    ~7<                          e# unwrap and remove comma and new line from last line
                                 e# by taking only first 7 characters

Спробуйте його онлайн тут


Схоже, це золото візьме. Ми дамо це до завтра;)
Еспен Шульстад

@EspenSchulstad Я б хотів, щоб це справді дало мені золото. зітхання
Оптимізатор

3
Пам’ятайте, це не тільки віртуальне золото, а й честь. Що ми робимо в житті, відгукнеться луною у вічності.
Еспен Шульстад

10

Python 2, 58 56 байт

for i in range(48):print"'%02d:%s0',"[:57-i]%(i/2,i%2*3)

Як і відповідь sentiao, але використовуючи forцикл, з нарізанням для видалення коми. Дякуємо @grc за збиття двох байтів.


Чи "'%02d:%s0',"[:57-i]
вдасться

@grc Ахаха, звичайно, це набагато краще
Sp3000

Краще, ніж я міг би зробити!
Тім

6

Java - 119 байт

Я почав з StringJoiner Java 8, але це означає, що включати заяву про імпорт, тому я вирішив зробити це по-старому:

void f(){String s="";for(int i=0;i<24;)s+=s.format(",\n'%02d:00',\n'%02d:30'",i,i++);System.out.print(s.substring(2));}

Можливо, це можна покращити, позбавившись від кількох виникаючих Stringі Systemключових слів.


версія в groovy можливо :)
Espen Schulstad

Ви можете скоротити це до 159: Видаліть пробіл раніше a, перемістіть iприріст, втрачайте forдужки та перенесіть косу / нову лінію на початок (що дозволяє використовувати коротший substringта позбутися length()). Оскільки функції дозволені за замовчуванням, ви можете зробити її ще коротшою, усунувши коробну панель: void f(){String s="";for(int i=0;i<24;)s+=String.format(",\n'%02d:00',\n'%02d:30'",i,i++);System.out.print(s.substring(2));}Навіть трохи більше, якщо ви змусите її просто повернути рядок замість того, щоб роздрукувати її, але це, здається, суперечить духу, якщо не букві.
Геобіць

Чорт, це геніально! Я маю пам’ятати про ці хитрощі, дякую!
Сандер

О, ще кілька: зміни String.formatна s.format. Ваш компілятор / IDE може скаржитися на це, але це працює;)
Geobits

1
Хороший! формат - статичний метод, тому до нього слід отримати доступ до його класу, але, дійсно, його використання також працює!
Сандер

5

Рубі, 94 61 56 51

$><<(0..47).map{|i|"'%02d:%02d'"%[i/2,i%2*30]}*",
"

Дякуємо @blutorange (знову) за допомогу в гольфі!


Ви можете зменшити це до 61 байта: puts (0..47).to_a.map{|h|"'%02d:%02d'"%[h/2,h%2*30]}.join","(є новий рядок після останньої коми)
blutorange

Ще раз дякую вам! Я насправді не дуже пробував ...
rorlork

Рубі потрібна якась любов. 58 байт;)puts Array.new(48){|i|"'%02d:%02d'"%[i/2,i%2*30]}.join','
blutorange

@blutorange @rcrmn ви можете зменшити ще 4 байти (і перейдіть до мого рішення нижче :))) замінивши .joinна *:)
Tomáš Dundáček


4

JAVA 95 94 байт

Мені подобається те, що printf існує на Java:

void p(){for(int i=0;i<24;)System.out.printf("'%02d:00',\n'%02d:30'%c\n", i,i++,(i<24)?44:0);}

Безумовно

void p(){
    for(int i=0;i<24;)
        System.out.printf("'%02d:00',\n'%02d:30'%c\n", i,i++,(i<24)?44:0);
}

EDIT Замінено ','з44


24.times {printf ("'% 02d: 00', \ n '% 02d: 30'% c \ n", it, it, (it <24)? 44: 0)} in groovy :) те саме рішення , тільки що це до 65
ч.

@EspenSchulstad Чи вважатиметься це окремою функцією, чи є інша плита, яка потрібна для її запуску?
tfitzger

1
Якщо у вас є groovy, ви можете це запустити у groovys або просто як groovy скрипт у .groovy-файлі. тоді вам не потрібна функція.
Еспен Шульстад


@EspenSchulstad Цікаво. Я лише мінімально працював з Groovy.
tfitzger

4

Pyth, 32 31 байт

Я щось гольфував у python, але виявилося так само, як відповідь Sp3000. Тому я вирішив спробувати Pyth:

V48<%"'%02d:%d0',",/N2*3%N2-54N

Це точний переклад відповіді Sp3000:

for i in range(48):print"'%02d:%d0',"[:57-i]%(i/2,i%2*3)

Це мій перший виїзд на Pyth, тому, будь ласка, просвітите мене про те, що збережено 1 байт.


Чудово зроблено, і ласкаво просимо до Pyth.
isaacg

3

PHP, 109 байт

foreach(new DatePeriod("R47/2015-05-07T00:00:00Z/PT30M")as$d)$a[]=$d->format("'H:i'");echo implode(",\n",$a);

3

Ruby, 54 51 bytes

puts (0..23).map{|h|"'#{h}:00',
'#{h}:30'"}.join",
"

1
You can reduce 3 bytes by changing \n to actual newlines and removing the space between join and ". On the other hand, take note that the specified output has leading zeros for the hours.
rorlork

Also, some more bytes by changing puts to $><< (without space) and .join with *. You still have the leading zero problem for the hours, though.
rorlork

3

C, 116,115,101,100,95,74,73, 71

May be able to scrape a few more bytes off this...

main(a){for(;++a<50;)printf("'%02d:%d0'%s",a/2-1,a%2*3,a<49?",\n":"");}

Ви можете зберегти 3 байти, створивши функцію, а не повну програму. Просто замініть "головний" на "f", або будь-який ваш улюблений лист.
Біджан

О, це дуже приємна пропозиція ..... Я завжди забуваю!
Джошпбаррон

3

T-SQL, 319 307 305 байт

WITH t AS(SELECT t.f FROM(VALUES(0),(1),(2),(3),(4))t(f)),i AS(SELECT i=row_number()OVER(ORDER BY u.f,v.f)-1FROM t u CROSS APPLY t v),h AS(SELECT i,h=right('0'+cast(i AS VARCHAR(2)),2)FROM i WHERE i<24)SELECT''''+h+':'+m+CASE WHEN i=23AND m='30'THEN''ELSE','END FROM(VALUES('00'),('30'))m(m) CROSS APPLY h

Версія без гольфу:

WITH
t AS(
    SELECT
        t.f
    FROM(VALUES
         (0),(1),(2),(3),(4)
    )t(f)
),
i AS(
    SELECT
        i = row_number() OVER(ORDER BY u.f,v.f) - 1
    FROM t u 
    CROSS APPLY t v
),
h AS(
    SELECT
        i,
        h = right('0'+cast(i AS VARCHAR(2)),2)
    FROM i
    WHERE i<24
)
SELECT
    '''' + h + ':' + m + CASE WHEN i=23 AND m='30' 
                              THEN '' 
                              ELSE ',' 
                         END
FROM(
    VALUES('00'),('30')
)m(m)
CROSS APPLY h

2

Pyth, 34 байти

j+\,bmjk[\'?kgd20Z/d2\:*3%d2Z\')48

This can definitely be improved.

Спробуйте в Інтернеті: компілятор / виконавець Pyth

Пояснення:

     m                          48   map each d in [0, 1, ..., 47] to:
        [                      )       create a list with the elements:
         \'                              "'"
           ?kgd20Z                       "" if d >= 20 else 0
                  /d2                    d / 2
                     \:                  ":"
                       *3%d2             3 * (d%2)
                            Z            0
                             \'          "'"
      jk                               join by "", the list gets converted into a string
j+\,b                                join all times by "," + "\n"

Завжди вражаю ці мови для гри в гольф :) Я якось більше ціную це, коли це робиться мовою, що не займається гольфом. Хтось знає, чи є, наприклад, гольф-jar-lib для java?
Еспен Шульстад

Обов’язковий порт sentiao's дає 31: j+\,bm%"'%02d:%s0'",/d2*3%d2 48з форматуванням рядків
Sp3000

2

Python 2, 69 байт

print',\n'.join(["'%02d:%s0'"%(h,m)for h in range(24)for m in'03'])

Цілком очевидно, але ось пояснення:

  • використовуючи подвійний цикл
  • чергування між '0'і '3'в рядковому форматі коротше, ніж список
  • %02d робить прокладки для h
  • mне потребує прокладки, оскільки змінний символ знаходиться у фіксованому положенні
  • '\n'.join() solves the final-line requirements

I have no idea if it can be done shorter (in Python 2).

by Sp3000, 61 bytes : print',\n'.join("'%02d:%s0'"%(h/2,h%2*3)for h in range(48))


1
How about: print',\n'.join("'%02d:%s0'"%(h/2,h%2*3)for h in range(48))
Sp3000

Brilliant, Sp3000! (you should post it)
sentiao

1
Nah, not different enough to post in my book. All I did was drop the square brackets (which are unnecessary even in your one) and drop m. (Also it's 59 bytes, not 61)
Sp3000

2

Haskell, 85 bytes

putStr$init$init$unlines$take 48['\'':w:x:':':y:"0',"|w<-"012",x<-['0'..'9'],y<-"03"]

Unfortunately printf requires a 19 byte import, so I cannot use it.


2

Julia: 65 64 61 characters

[@printf("'%02d:%d0'%s
",i/2.01,i%2*3,i<47?",":"")for i=0:47]

Julia: 64 characters

(Kept here to show Julia's nice for syntax.)

print(join([@sprintf("'%02d:%d0'",h,m*3)for m=0:1,h=0:23],",
"))

2

Fortran 96

do i=0,46;print'(a1,i2.2,a,i2.2,a2)',"'",i/2,":",mod(i,2)*30,"',";enddo;print'(a)',"'23:30'";end

Standard abuse of types & requirement only for the final end for compiling. Sadly, due to implicit formatting, the '(a)' in the final print statement is required. Still, better than the C and C++ answers ;)


2

JavaScript (ES6), 77 86+1 bytes

Didn't realize there had to be quotes on each line (+1 is for -p flag with node):

"'"+Array.from(Array(48),(d,i)=>(i>19?"":"0")+~~(i/2)+":"+3*(i&1)+0).join("',\n'")+"'"

old solution:

Array.from(Array(48),(d,i)=>~~(i/2).toFixed(2)+":"+3*(i&1)+"0").join(",\n")

ungolfed version (using a for loop instead of Array.from):

var a = [];
// there are 48 different times (00:00 to 23:30)
for (var i = 0; i < 48; i++) {
    a[i] =
        (i > 19 ? "" : "0") +
            // just a ternary to decide whether to pad
            // with a zero (19/2 is 9.5, so it's the last padded number)
        ~~(i/2) +
            // we want 0 to 24, not 0 to 48
        ":" +  // they all then have a colon
        3*(i&1) +
            // if i is odd, it should print 30; otherwise, print 0
        "0" // followed by the last 0
}
console.log(a.join(",\n"));

72: Array.from(Array(48),(d,i)=>`'${i>19?"":0}${0|i/2}:${i%2*3}0'`).join`,\n`. Replace \n with an actual newline.
Mama Fun Roll

2

golflua 52 51 chars

~@n=0,47w(S.q("'%02d:%d0'%c",n/2,n%2*3,n<47&44|0))$

Using ascii 44 = , and 0 a space saves a character.

An ungolfed Lua version would be

for h=0,47 do
   print(string.format("'%02d:%d0'%c",h/2,h%2*3, if h<47 and 44 or 0))
end

The if statement is much like the ternary operator a > b ? 44 : 0.


2

C# - 120 bytes

class P{static void Main(){for(var i=0;i<24;i++)System.Console.Write("'{0:00}:00',\n'{0:00}:30'{1}\n",i,i==23?"":",");}}

2

Python, 60 58 64 bytes

for i in range(24):print("'%02d:00,\n%02d:30'"%(i,i)+', '[i>22])

Ungolfed:

for i in range(24):
    if i <23:
        print( ('0'+str(i))[-2:] + ':00,\n' + str(i) + ':30,')
    else:
        print( ('0'+str(i))[-2:] + ':00,\n' + str(i) + ':30')

Try it online here.


1
Why not put it on 1 line, and save another 2 bytes.
isaacg

I don't think this works - no leading zero on the hour.
isaacg

1
@isaacg fixed that!
Tim

The output is not the same as in the original question.
sentiao

@sentiao what is different?
Tim


2

PHP, 69 70 62 bytes

for($x=-1;++$x<47;)printf("'%02d:%d0',
",$x/2,$x%2*3)?>'23:30'

Try it online

Outputting '23:30' at the end is a bit lame, and so is closing the php context using ?> without opening or re-opening it. An cleaner alternative (but 65 bytes) would be:

for($x=-1;++$x<48;)printf("%s'%02d:%d0'",$x?",
":'',$x/2,$x%2*3);

Try it online

Thank you @Dennis for the tips. Alternative inspired by the contribution of @ismael-miguel.


1
Welcome to Programming Puzzles & Code Golf! Your code prints a null byte at the end. I'm not sure if that is allowed.
Dennis

@Dennis Thank you, you're right... I assumed PHP would see it as end-of-string. Posted a new version.
mk8374876

<?...?>'23:30' saves three bytes. Also, you can replace \n with an actual newline.
Dennis

2

Swift, 74 bytes

Updated for Swift 2/3...and with new string interpolation...

for x in 0...47{print("'\(x<20 ?"0":"")\(x/2):\(x%2*3)0'\(x<47 ?",":"")")}

The final line is specified to not have a comma & your code prints it.
Kyle Kanos

1

Javascript, 89 bytes

for(i=a=[];i<24;)a.push((x="'"+("0"+i++).slice(-2))+":00'",x+":30'");alert(a.join(",\n"))

1
Quick question: how many arguments Array.push() supports? ;)
manatwork

You're right. That is a polyad. Thanks, I'll make that change after I finish testing my entry for another challenge.
SuperJedi224

A few more characters can be removed with some elementary reorganizations: for(i=a=[];i<24;)a.push((x=("0"+i++).slice(-2))+":00",x+":30");alert(a.join(",\n"))
manatwork

There, I fixed it.
SuperJedi224

That reuse of variable x is quite ugly coding habit. If you change the loop control variable to something else (as in my suggestion at 2015-05-07 15:28:25Z), then you can add the opening single quotes to x's value to reduce the two "'"+ pieces to one: for(i=a=[];i<24;)a.push((x="'"+("0"+i++).slice(-2))+":00'",x+":30'");alert(a.join(",\n"))
manatwork

1

Python 2: 64 bytes

print ',\n'.join(['%02d:00,\n%02d:30'%(h,h) for h in range(24)])

The output is not the same as in the original question.
sentiao

I don't know what happened to the edit I made. here is the correct version also 64 chars: print',\n'.join("'%02d:00',\n'%02d:30'"%(h,h)for h in range(24))
Alan Hoover

1

Ruby - 52 bytes

puts (0..47).map{|i|"'%02d:%02d'"%[i/2,i%2*30]}*",
"

This seems like my solution with just the change of the .join for *... It's common courtesy to instead of just posting a new answer with a minor improvement, to suggest the improvement to the original poster. See meta.codegolf.stackexchange.com/questions/75/…
rorlork

@rcrmn I agree I made a mistake and I apologize for it - should've had looked for other ruby answers first. Great work though in your answer with $><<!
Tomáš Dundáček

Don't worry about it, you are new here: I was advising you so that you could avoid this in the future.
rorlork

1

Python 2, 74 65 bytes

We generate a 2 line string for each hour, using text formatting:

print',\n'.join("'%02u:00',\n'%02u:30'"%(h,h)for h in range(24))

This code is fairly clear, but the clever indexing and integer maths in the answer by Sp3000 gives a shorter solution.


1
no reason to use formatting for 00 and 30, save 9 bytes with "'%02u:00',\n'%02u:30'"%(h,h)
DenDenDo

you could save some bytes by having too loops : print',\n'.join("'%02u:%02u'"%(h,i)for h in range(24)for i in[0,30])
dieter

Thanks DenDenDo. I used this to save some bytes. Dieter, I can see where your idea may help, but I could save more bytes with that idea from DenDenDo.
Logic Knight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.