Elencare tutte le volte del giorno a una tariffa di mezz'ora


31

Vince la risposta più breve.

Deve essere ordinato e tra 24 ore. L'ultima riga non ha una virgola.

L'output dovrebbe essere il seguente:

'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
È l'ora di 24 ore? Potresti fornire l'intero risultato?
xnor

1
L'output deve essere ordinato?
orlp

44
Cosa succede se il mio programma impiega 23,5 ore per l'esecuzione?
Tfitzger,

9
Non riesco a capire perché sarebbe negativo.
Espen Schulstad,

6
Solo un piccolo suggerimento sui voti. Cerco di valutare ogni risposta valida a una sfida che creo come una piccola ricompensa per lo sforzo. Ho un sacco di rappresentante e non ho davvero bisogno di un voto qui, ma per favore considera altri risponditori che potrebbero smettere di rispondere se le loro risposte vengono ignorate dopo un sacco di duro pensiero e debugging.
Logic Knight,

Risposte:


17

Pyth, 26 byte

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

Dimostrazione.

Iniziamo con il prodotto cartesiano di range(24)( U24) con la stringa "03".

Quindi, associamo questi valori alla stringa appropriata che forma la sostituzione ( m%"'%02d:%s0',"d).

Quindi, le stringhe risultanti vengono unite sul carattere di nuova riga ( jb).

Infine, rimuoviamo la virgola finale ( P) e stampiamo.


1
Sembra che abbiamo un nuovo concorrente per il premio. Autore di Pyth, è quasi un imbroglio;)
Espen Schulstad,

15

Befunge-93, 63 byte

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

 

animation (animazione realizzata con BefunExec )


14

Bash: 58 47 46 caratteri

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

Mi piace questa soluzione :)
Espen Schulstad,

1
Utente anonimo suggerito echo \'{00..23}:{0,3}0\'|sed 's/ /,\n/g'di 40 caratteri. Bello. Grazie. Ma preferisco usare bashla propria forza.
Manatwork

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

@manatwork oh non ho letto bene la domanda, scusa ...
izabera

printf "'%s'\n" {00..23}:{0,3}0|sed $\!s/$/,/ è di 45 byte
izabera

10

CJam, 31 30 29 byte

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

Questo è piuttosto semplice usando la formattazione di 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

Provalo online qui


Sembra che questo prenderà l'oro. Lo daremo fino a domani;)
Espen Schulstad

@EspenSchulstad Mi piacerebbe davvero darmi dell'oro. sigh
Optimizer

3
Ricorda, non è solo oro virituale, ma anche onore. Quello che facciamo in vita riecheggia nell'eternità.
Espen Schulstad,

10

Python 2, 58 56 byte

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

Come la risposta di Sentiao ma usando un forciclo, con il taglio per rimuovere la virgola. Grazie a @grc per aver eliminato due byte.


Funzionerebbe questo:"'%02d:%s0',"[:57-i]
GRC

@grc Ahaha ovviamente, va molto meglio
Sp3000,

Meglio di quanto potessi fare!
Tim

6

Java - 119 byte

Ho iniziato con StringJoiner di Java 8, ma questo significa includere un'istruzione import, quindi ho deciso di farlo alla vecchia maniera:

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

Forse questo può essere migliorato eliminando il verificarsi multiplo Stringe le Systemparole chiave.


forse una versione in groovy :)
Espen Schulstad,

Puoi accorciarlo a 159: Rimuovi lo spazio prima a, sposta l' iincremento, perdi le forparentesi graffe e sposta la virgola / la nuova riga all'inizio (che ti consente di usare il più corto substringe di sbarazzartene length()). Dato che le funzioni sono consentite per impostazione predefinita, puoi renderlo ancora più breve eliminando la piastra di caldaia: 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));}anche un po 'di più se lo fai restituisci semplicemente la stringa invece di stamparla, ma sembra andare contro lo spirito, se non la lettera.
Geobits

Accidenti, è geniale! Devo tenere a mente quei trucchi, grazie!
Sander,

Oh, alcuni altri: cambia String.formatin s.format. Il tuo compilatore / IDE potrebbe lamentarsene, ma funziona;)
Geobits

1
Ben fatto! il formato è un metodo statico, quindi dovrebbe essere accessibile dalla sua classe, ma in effetti, usarlo in questo modo funziona anche!
Sander,

5

Ruby, 94 61 56 51

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

Grazie a @blutorange (di nuovo) per il suo aiuto nel golf!


Puoi ridurlo a 61 byte: puts (0..47).to_a.map{|h|"'%02d:%02d'"%[h/2,h%2*30]}.join","(c'è una nuova riga dopo l'ultima virgola)
blutorange

Grazie ancora! Non ci ho provato molto ...
rorlork,

Ruby ha bisogno di amore. 58 byte;)puts Array.new(48){|i|"'%02d:%02d'"%[i/2,i%2*30]}.join','
blutorange

@blutorange @rcrmn puoi ridurre altri 4 byte (e arrivare alla mia soluzione di seguito :))) sostituendoli .joincon *:)
Tomáš Dundáček

5

Perl, 52 50 48 45B

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

Con l'aiuto di ThisSuitIsBlackNot :)


4

JAVA 95 94 byte

Adoro il fatto che printf esista in 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);}

Ungolfed

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 Sostituito ','con44


24.times {printf ("'% 02d: 00', \ n '% 02d: 30'% c \ n", it, it, (it <24)? 44: 0)} in groovy :) stessa soluzione , solo che è fino a 65 chr
Espen Schulstad

@EspenSchulstad Sarebbe considerata una funzione autonoma o è necessario un altro boilerplate per farlo funzionare?
Tfitzger,

1
Se hai groovy, puoi eseguirlo in groovysh o semplicemente come uno script groovy in un file .groovy. allora non hai bisogno di nessuna funzione.
Espen Schulstad,


@EspenSchulstad Interessante. Ho fatto solo un lavoro minimo con Groovy.
Tfitzger,

4

Pyth, 32 31 byte

Ho giocato a golf in Python ma si è rivelato esattamente lo stesso della risposta di Sp3000. Quindi ho deciso di provare Pyth:

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

È una traduzione esatta della risposta Sp3000:

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

È la mia prima volta su Pyth, quindi per favore fammi illuminare sul salvataggio di 1 byte.


Ben fatto e benvenuto in Pyth.
isaacg,

3

PHP, 109 byte

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

3

Rubino, 54 51 byte

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

1
È possibile ridurre 3 byte passando \nai newline effettivi e rimuovendo lo spazio tra joine ". D'altra parte, tenere presente che l'output specificato ha zeri iniziali per le ore.
rorlork,

Inoltre, alcuni più byte cambiando puts in $><<(senza spazio) e .joincon *. Tuttavia, hai ancora il problema zero iniziale per le ore.
rorlork,

3

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

Potrebbe essere in grado di cancellare qualche byte in più da questo ...

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

È possibile salvare 3 byte creando una funzione anziché un programma completo. Sostituisci "main" con "f", o qualunque sia la tua lettera preferita.
Bijan,

Oh, questo è un suggerimento molto bello ..... uno che dimentico sempre!
Joshpbarron,

3

T-SQL, 319 307 305 byte

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

Versione senza golf:

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 byte

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

Questo può sicuramente essere migliorato.

Provalo online: Pyth Compiler / Executor

Spiegazione:

     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"

Sempre impressionante con questi linguaggi del golf :) In qualche modo lo apprezzo di più quando è fatto in un linguaggio non golfistico. Qualcuno sa se c'è un golf-jar-lib su java per esempio?
Espen Schulstad,

Il porto obbligatorio di sentiao dà 31: j+\,bm%"'%02d:%s0'",/d2*3%d2 48con formattazione di stringa
Sp3000

2

Python 2, 69 byte

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

Abbastanza ovvio, ma ecco una spiegazione:

  • usando il doppio-per-ciclo
  • alternare tra '0'e '3'in formato stringa è più breve di un elenco
  • %02d fa l'imbottitura per h
  • mnon è necessario il riempimento poiché il carattere alternato si trova su una posizione fissa
  • '\n'.join() risolve i requisiti della linea finale

Non ho idea se può essere fatto più breve (in Python 2).

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


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

Fantastico, Sp3000! (dovresti pubblicarlo)
sentiao

1
No, non abbastanza diverso da pubblicare nel mio libro. Tutto quello che ho fatto è stato rilasciare le parentesi quadre (che non sono necessarie nemmeno nella tua) e rilasciarle m. (Inoltre sono 59 byte, non 61)
Sp3000,

2

Haskell, 85 byte

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

Sfortunatamente printfrichiede un 19 byte import, quindi non posso usarlo.


2

Giulia: 65 64 61 caratteri

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

Julia: 64 caratteri

(Conservato qui per mostrare la bella forsintassi di Julia .)

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

Abuso standard di tipi e requisiti solo per la finale endper la compilazione. Purtroppo, a causa della formattazione implicita, è richiesta la dichiarazione '(a)'finale print. Tuttavia, meglio delle risposte C e C ++;)


2

JavaScript (ES6), 77 86 + 1 byte

Non ho capito che dovevano essere presenti virgolette su ogni riga (+1 è per -pflag con nodo):

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

vecchia soluzione:

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

versione ungolf (usando un ciclo for invece di 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`. Sostituisci \ n con una nuova riga effettiva.
Mama Fun Roll

2

golflua 52 51 caratteri

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

Usando ascii 44 = ,e 0 uno spazio salva un carattere.

Una versione di Lua non rigata sarebbe

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

L' ifaffermazione è molto simile all'operatore ternario a > b ? 44 : 0.


2

C # - 120 byte

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 byte

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')

Provalo online qui .


1
Perché non metterlo su 1 riga e salvare altri 2 byte.
isaacg

Non penso che funzioni: nessuno zero iniziale all'ora.
isaacg,

1
@isaacg l'ha risolto!
Tim

L'output non è lo stesso della domanda originale.
Sentiao

@sentiao cosa c'è di diverso?
Tim

2

𝔼𝕊𝕄𝕚𝕟, 39 caratteri / 67 byte (non concorrenti)

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

Try it here (Firefox only).

Non un singolo personaggio alfabetico in vista ...


2

PHP, 69 70 62 byte

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

Provalo online

L'output '23:30'alla fine è un po 'zoppo, così come chiudere il contesto php usando ?>senza aprirlo o riaprirlo. Un'alternativa più pulita (ma 65 byte) sarebbe:

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

Provalo online

Grazie @Dennis per i suggerimenti. Alternativa ispirata al contributo di @ ismael-miguel.


1
Benvenuto in Programmazione di puzzle e codice golf! Il tuo codice stampa un byte null alla fine. Non sono sicuro che sia permesso.
Dennis,

@Dennis Grazie, hai ragione ... Ho pensato che PHP l'avrebbe visto come fine della stringa. Ha pubblicato una nuova versione.
mk8374876,

<?...?>'23:30'salva tre byte. Inoltre, è possibile sostituire \ncon una nuova riga effettiva.
Dennis,

2

Rapido, 74 byte

Aggiornato per Swift 2/3 ... e con nuova interpolazione di stringhe ...

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

La riga finale è specificata per non avere una virgola e il tuo codice la stampa.
Kyle Kanos

1

Javascript, 89 byte

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

1
Domanda veloce: quanti argomenti Array.push()supporta? ;)
arte

Hai ragione. Questa è una polia. Grazie, apporterò tale modifica dopo aver finito di testare la mia iscrizione per un'altra sfida.
SuperJedi224,

Alcuni altri personaggi possono essere rimossi con alcune riorganizzazioni elementari:for(i=a=[];i<24;)a.push((x=("0"+i++).slice(-2))+":00",x+":30");alert(a.join(",\n"))
manatwork

Lì l'ho risolto.
SuperJedi224,

Quel riutilizzo della variabile x è un'abitudine di programmazione piuttosto brutta. Se si cambia la variabile di controllo del ciclo in qualcos'altro (come nel mio suggerimento al 15/05/2015 alle 15: 28: 25Z), è possibile aggiungere le virgolette singole di apertura al valore di x per ridurre i due "'"+pezzi a uno:for(i=a=[];i<24;)a.push((x="'"+("0"+i++).slice(-2))+":00'",x+":30'");alert(a.join(",\n"))
manatwork

1

Python 2: 64 byte

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

L'output non è lo stesso della domanda originale.
Sentiao

Non so cosa sia successo alla modifica che ho apportato. ecco la versione corretta anche 64 caratteri:print',\n'.join("'%02d:00',\n'%02d:30'"%(h,h)for h in range(24))
Alan Hoover

1

Rubino - 52 byte

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

Questa sembra la mia soluzione con il solo cambio del .joinfor *... È comune cortesia invece di pubblicare una nuova risposta con un miglioramento minore, per suggerire il miglioramento al poster originale. Vedi meta.codegolf.stackexchange.com/questions/75/…
rorlork

@rcrmn Sono d'accordo che ho fatto un errore e mi scuso per questo - avrei dovuto prima cercare altre risposte rubino. Ottimo lavoro nella tua risposta con $><<!
Tomáš Dundáček

Non preoccuparti, sei nuovo qui: ti stavo consigliando in modo da poterlo evitare in futuro.
rorlork,

1

Python 2, 74 65 byte

Generiamo una stringa di 2 righe per ogni ora, usando la formattazione del testo:

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

Questo codice è abbastanza chiaro, ma l'indicizzazione intelligente e la matematica integer nella risposta di Sp3000 offrono una soluzione più breve.


1
nessun motivo per utilizzare la formattazione per 00 e 30, salva 9 byte con"'%02u:00',\n'%02u:30'"%(h,h)
DenDenDo

potresti salvare alcuni byte con troppi loop: print',\n'.join("'%02u:%02u'"%(h,i)for h in range(24)for i in[0,30])
dieter,

Grazie DenDenDo. L'ho usato per salvare alcuni byte. Dieter, posso vedere dove la tua idea può aiutare, ma potrei salvare più byte con quell'idea da DenDenDo.
Logic Knight,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.