Wymień wszystkie godziny w ciągu dnia według stawki półgodzinnej

31

Najkrótsza odpowiedź wygrywa.

Trzeba to posortować i za 24 godziny. Ostatnia linia nie ma przecinka.

Dane wyjściowe powinny być następujące:

'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'
Espen Schulstad
źródło
6
Czy to 24 godziny? Czy możesz podać całą produkcję?
xnor
1
Czy dane wyjściowe muszą być posortowane?
lub
44
Co się stanie, jeśli uruchomienie mojego programu zajmie 23,5 godziny?
tfitzger
9
Nie rozumiem, dlaczego miałoby to być negatywne.
Espen Schulstad
6
Tylko mała sugestia na temat głosów pozytywnych. Staram się głosować za każdą poprawną odpowiedzią na wyzwanie, które tworzę, jako małą nagrodę za podjęcie wysiłku. Mam wielu przedstawicieli i tak naprawdę nie potrzebuję tutaj aprobaty, ale proszę rozważyć innych odpowiedzi, którzy mogą zrezygnować z odpowiedzi, jeśli ich odpowiedzi zostaną zignorowane po wielu trudnych myślach i debugowaniu.
Logic Knight

Odpowiedzi:

17

Pyth, 26 bajtów

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

Demonstracja.

Zaczynamy od iloczynu kartezjańskiego produktu range(24)( U24) "03".

Następnie odwzorowujemy te wartości na odpowiedni ciąg formujący substytucję ( m%"'%02d:%s0',"d).

Następnie powstałe łańcuchy są łączone na znaku nowej linii ( jb).

Na koniec usuwamy przecinek końcowy ( P) i drukujemy.

isaacg
źródło
1
Wygląda na to, że mamy nowego pretendenta do nagrody. Autor pyth, to prawie oszustwo;)
Espen Schulstad
15

Befunge-93, 63 bajty

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

 

animation (animacja wykonana przy pomocy BefunExec )

Mikescher
źródło
14

Bash: 58 47 46 znaków

h=`echo \'{00..23}:{0,3}0\'`
echo "${h// /,
}"
człowiek w pracy
źródło
Podoba mi się to rozwiązanie :)
Espen Schulstad
1
Sugerowany anonimowy użytkownik echo \'{00..23}:{0,3}0\'|sed 's/ /,\n/g'składający się z 40 znaków. Miły. Dzięki. Ale wolę korzystać z bashwłasnej siły.
manatwork
1
printf "'%s',\n" {00..23}:{0,3}0
izabera
@manatwork oh, nie przeczytałem dobrze pytania, przepraszam ...
izabera
printf "'%s'\n" {00..23}:{0,3}0|sed $\!s/$/,/ ma 45 bajtów
izabera
10

CJam, 31 30 29 bajtów

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

Jest to dość proste przy użyciu formatowania 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

Wypróbuj online tutaj

Optymalizator
źródło
Wygląda na to, że zabierze złoto. Damy go do jutra;)
Espen Schulstad
@EspenSchulstad Chciałbym, żeby dał mi trochę złota. westchnienie
Optymalizator
3
Pamiętaj, że to nie tylko wirtualne złoto, ale także honor. To, co robimy w życiu, odbija się echem w wieczności.
Espen Schulstad,
10

Python 2, 58 56 bajtów

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

Podobnie jak odpowiedź sentiao, ale za pomocą forpętli z wycinaniem w celu usunięcia przecinka. Dzięki @grc za odrzucenie dwóch bajtów.

Sp3000
źródło
Czy to zadziała:"'%02d:%s0',"[:57-i]
grc
@grc Ahaha, oczywiście, o wiele lepiej
Sp3000
Lepiej niż mogłem!
Tim
6

Java - 119 bajtów

Zacząłem od StringJoiner w Javie 8, ale oznacza to dołączenie instrukcji importu, więc postanowiłem to zrobić w stary sposób:

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

Być może można to poprawić, pozbywając się wielu występujących słów kluczowych Stringi Systemsłów kluczowych.

Szlifierka
źródło
może wersja w groovy :)
Espen Schulstad
Możesz skrócić to do 159: Usuń spację wcześniej a, przesuń iprzyrost, zgub fornawiasy klamrowe i przenieś przecinek / nowy wiersz na początek (co pozwala ci użyć skrótu substringi pozbyć się length()). Ponieważ funkcje są domyślnie dozwolone, możesz je jeszcze bardziej skrócić, eliminując 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));}płytę kotłową: Jeszcze bardziej, jeśli sprawisz, że po prostu zwróci ciąg zamiast go wydrukować, ale wydaje się to sprzeczne z duchem, jeśli nie literą.
Geobity
Cholera, to wspaniale! Muszę pamiętać o tych sztuczkach, dzięki!
Sander
Och, jeszcze kilka: zmień String.formatna s.format. Twój kompilator / IDE może na to narzekać, ale działa;)
Geobits
1
Niezłe! format jest metodą statyczną, więc powinna być dostępna dla jego klasy, ale rzeczywiście użycie go w ten sposób również działa!
Sander
5

Ruby, 94 61 56 51

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

Dzięki @blutorange (ponownie) za pomoc w grze w golfa!

rorlork
źródło
Możesz zmniejszyć to do 61 bajtów: puts (0..47).to_a.map{|h|"'%02d:%02d'"%[h/2,h%2*30]}.join","(po ostatnim przecinku jest nowy wiersz)
blutorange
Jeszcze raz dziękuję! Naprawdę nie próbowałem zbyt wiele ...
rorlork
Ruby potrzebuje trochę miłości. 58 bajtów;)puts Array.new(48){|i|"'%02d:%02d'"%[i/2,i%2*30]}.join','
blutorange
@blutorange @rcrmn możesz zmniejszyć jeszcze 4 bajty (i przejdź do mojego rozwiązania poniżej :))), zastępując .joinje *:)
Tomáš Dundáček
5

Perl, 52 50 48 45 B.

$,=",
";say map<\\'$_:{0,3}0\\'>,"00".."23"

Z pomocą ThisSuitIsBlackNot :)

Alexander-Brett
źródło
4

JAVA 95 94 bajty

Podoba mi się fakt, że printf istnieje w Javie:

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

Bez golfa

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 otrzymuje ','z44

tfitzger
źródło
24. razy {printf ("'% 02d: 00', \ n '% 02d: 30'% c \ n", it, it, (it <24)? 44: 0)} in groovy :) to samo rozwiązanie , po prostu do 65 chr
Espen Schulstad
@EspenSchulstad Czy byłoby to uważane za samodzielną funkcję, czy może jest inna płyta kotłowa, która byłaby potrzebna do uruchomienia?
tfitzger
1
Jeśli masz groovy, możesz uruchomić go w groovysh lub po prostu jako groovy skrypt w pliku .groovy. wtedy nie potrzebujesz żadnej funkcji.
Espen Schulstad,
@EspenSchulstad Ciekawe. Z Groovy wykonałem tylko minimalną pracę.
tfitzger
4

Pyth 32 31 bajtów

I golfed something in python but it turned out to be exactly the same as Sp3000's answer. So I decided to give Pyth a try:

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

It's a exact translation of Sp3000 answer:

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

To moja pierwsza wizyta w Pyth, więc proszę, powiedz mi o oszczędzaniu 1 bajtu.

Def
źródło
Ładnie wykonane i witamy w Pyth.
isaacg
3

PHP, 109 bajtów

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

Rubin, 54 51 bajtów

puts (0..23).map{|h|"'#{h}:00',
'#{h}:30'"}.join",
"
golgappa
źródło
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":"");}
Joshpbarron
źródło
You can save 3 bytes by creating a function rather than a complete program. Just replace "main" with "f", or whatever your favourite letter is.
Bijan
Oh thats a very nice suggestion.....one I always forget!
Joshpbarron
3

T-SQL, 319 307 305 bytes

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

Un-golfed version:

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
Pieter Geerkens
źródło
2

Pyth, 34 bytes

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

This can definitely be improved.

Try it online: Pyth Compiler/Executor

Explanation:

     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"
Jakube
źródło
Always impressive with these golfing languages :) I do somehow appreciate it more when it's done in a non-golfing language. Does anyone know if there is a golf-jar-lib to java for instance?
Espen Schulstad
Obligatory port of sentiao's gives 31: j+\,bm%"'%02d:%s0'",/d2*3%d2 48 with string formatting
Sp3000
2

Python 2, 69 bytes

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

Quite obvious, but here's an explanation:

  • using double-for-loop
  • alternating between '0' and '3' in string format is shorter than a list
  • %02d does the padding for h
  • mdoesn't need padding as the alternating character is on a fixed position
  • '\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))

sentiao
źródło
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.

nimi
źródło
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],",
"))
manatwork
źródło
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 ;)

Kyle Kanos
źródło
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"));
royhowie
źródło
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.

Kyle Kanos
źródło
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?"":",");}}
Berend
źródło
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.

Tim
źródło
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

𝔼𝕊𝕄𝕚𝕟, 39 chars / 67 bytes (non-competing)

↺;Ḁ⧺<Ḱ;)ᵖ`'⦃Ḁ<Ḕ?0:⬯}⦃0|Ḁ/2}:⦃Ḁ%2*3}0',”

Try it here (Firefox only).

Not a single alphabetical character in sight...

Mama Fun Roll
źródło
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.

mk8374876
źródło
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 ?",":"")")}
GoatInTheMachine
źródło
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"))
SuperJedi224
źródło
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)])
Alan Hoover
źródło
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]}*",
"
Tomáš Dundáček
źródło
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.

Logic Knight
źródło
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