24 saatlik zamanın toplamı


21

0 ile 141 (dahil) arasında bir tam sayı verilirse, saat, dakika ve ikinci birimler o tamsayıya eklenen 24 saatlik süreleri listeler.

Ekleme kuralları

Sayılar, tek bir basamaktan değil, zaman birimlerinden eklenir.

Örneğin, 17:43:59

17 + 43 + 59 = 119

Unutmayın, bu eklenen rakamların bir örneğidir . Gerçekte, 119 girecekti ve 17:43:59 sonuçlardan biri olacaktı. Çıktı HH: MM: SS veya H: MM: SS olarak verilmelidir.

Ayrıca mümkün olan en yüksek sayı 141, 23:59:59 olduğunu unutmayın. Bu kod golf, yani en düşük miktar kazanır. Deneme ve hataya izin verilir, ancak bunun için daha iyi bir yol olabilir.

Düzenleme: Lütfen kodunuzda giriş değerinin nerede olduğunu belirtin.


3
Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz! Tarafından Eğer takılı size genellikle izin verilmeyen oluyor kaynak kodu, bir parçası haline demek. Genel olarak, bu varsayılanlara sadık kalmak iyi bir fikirdir. Sonuçları dizge olarak göstermek zorunda mıyız? Öyleyse, hangi biçimlere izin verilir?
Dennis,

Giriş numarasının pozitif olduğu garanti edilir mi? En az bir çözüm olacak mı?
xnor

Bazı şeyleri netleştirmek / cevaplamak için soruyu biraz düzenledim. Niyetim değişikliklerimden farklıysa, onu eşleştirmek için düzenlemekten çekinmeyin.
Geobits

1
Bunu yaptım çünkü verilen zamanları görmenin olağan yolu (gerçek dünyada). Kimse 13: 4: 7 olduğunu söylemiyor ama 5:10:30 neredeyse her zaman kabul edilebilir. Değişen bir sorunum yok.
Geobits

3
"Lütfen kodunuzda giriş değerinin nerede olduğunu belirtin." - PPCG'ye girdi almak için yapılan sözleşme, argümanların yanı sıra birkaç diğer seçeneği kullanmaktır. Bkz . Code Golf için Varsayılan: Meta'daki Giriş / Çıkış yöntemleri .
user2428118

Yanıtlar:


8

Jöle , 16 30 29 20 bayt

Şimdi doğru çıktı formatı ile! Dennis, bu cevabı hata ayıklamak için yaptığı yardım için teşekkür ederim. Golf önerileri kabul edilir. Çevrimiçi deneyin!

Düzenleme: +14 bayt doğru çıktı biçimini kullanarak. Fazladan bir boşluk kaldırarak -1 bayt. -3 doğru değişim 24,60,60için “ð<<‘. -6 değiştirmesini bayt +100DḊ€€için d⁵.

“ð<<‘Œp’S=¥Ðfd⁵j€”:Y

açıklama

“ð<<‘Œp’S=¥Ðfd⁵j€”:Y  Main link. Argument: n

“ð<<‘                 Jelly ord() the string `ð<<` to get [24, 60, 60]. Call this list z.
     Œp               Cartesian product of z's items. 
                        Since each item of z is a literal,
                        Jelly takes the range [1 ... item] for each item.
       ’              Decrements every number in the Cartesian product 
                        to get lowered ranges [0 ... item-1].
        S=¥           Create a dyadic link of `sum is equal to (implicit n)`.
           Ðf         Filter the Cartesian product for items with sum equal to n.
             d⁵       By taking divmod 10 of every number in each item,
                        we get zero padding for single-digit numbers
                        and every double-digit number just turns into a list of its digits.
               j€”:   Join every number with a ':'.
                   Y  Join all of the times with linefeeds for easier reading.

8

Bash, 71

  • @Hvd sayesinde 8 bayt kaydedildi
for t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}

Çevrimiçi deneyin .


1
printfburada pahalı. Elde ederek tdaha yakın sağ biçimine ve makyaj için o kadar sabitleme ((t-$1)): işin, sen 71 için aşağı alabilirsinizfor t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}
KKH

@ Hvd İyi golf - teşekkürler!
Dijital Travma

6

Perl 6 , 62 56 bayt

{map *.fmt('%02d',':'),grep $_==*.sum,(^24 X ^60 X ^60)}

Çapraz üründeki tüm muhtemel kombinasyonları tüm saat, dakika ve saniye kontrol eder


4

Python 3 , 91 bayt

def f(n):
 for k in range(86400):t=k//3600,k//60%60,k%60;sum(t)==n!=print('%d:%02d:%02d'%t)

exec(Python 2) veya özyinelemeyi (Python 3) kullanan daha kısa çözümler vardır , ancak her ikisi de makul olmayan miktarda bellek gerektirir.

Çevrimiçi deneyin!


4

PowerShell , 87 77 bayt

John L. Bevan sayesinde 10 bayt kaydedildi

$d=date;0..86399|%{$d+=1e7l;"$d".Split()[1]}|?{("{0:H+m+s}"-f$d|iex)-in$args}

Çevrimiçi deneyin!(Bu zaman aşımına uğrayacak, çok yavaş)

açıklama

Oldukça basittir, akımdan başlayarak [datetime], 1 saniye 86,399 kez ekler, bir dize olarak biçimlendirir, sonra yalnızca toplamın toplandığını tutar.


Bilginize: Sen yerini alabilir 10000000ile 1e7lkaydet 4 bayt ... hatta 1e7ekstra byte için (Sanırım, ben dahil etmek zorunda Lparametrenin yararına; yaklaşımınız önüne geçilmesini sağlar ancak şüpheli ihtiyacı olduğunu.
JohnLBevan

1
@JohnLBevan teşekkürler! 1e7En az 30 dakika boyunca mücadele Lettim ve kaçırdığım postfix oldu ; Bunu unuttum ve sabit olandan daha kısa olan int'yi elde etmenin bir yolunu bulamadım. Kim karar verdiğini bir o [timespan]bir yorumladığını [int]keneler hem de bir [double]şekilde gün zaten ?? Her iexşey haksız yere yavaştır, ama biraz zekicedir.
briantist

1
Telaşa gerek yok; Bu konuda da biraz yardım aldım;): stackoverflow.com/q/41408902/361842
JohnLBevan

1
@JohnLBevan Tam anlamıyla sadece bunu bağlantılı nerede comment önce bu soruyu gördü! Güzel.
briantist

1
Ayrıca iexhile burada bir ipucundan uyarlandı: codegolf.stackexchange.com/a/746/6776
JohnLBevan

3

Haskell, 77 bayt

f x=[tail$(':':).tail.show.(+100)=<<t|t<-mapM(\x->[0..x])[23,59,59],sum t==x]

2

Haskell, 90 bayt

p x=['0'|x<10]++show x
i=[0..59]
f x=[p h++':':p m++':':p s|h<-[0..23],m<-i,s<-i,h+m+s==x]

YG: MM: SS dizgelerinin bir listesini döndürür, örneğin f 140-> ["22:59:59","23:58:59","23:59:58"].

Saat, dakika ve saniye boyunca üç basit döngü. Toplamın giriş numarası olduğu tüm değerleri saklayın ve biçimlendirin x.




2

Toplu iş, 168 bayt

@for /l %%t in (0,1,86399)do @call:c %1 %%t
@exit/b
:c
@set/ah=%2/3600,m=%2/60%%60,s=%2%%60,n=%1-h-m-s
@set m=0%m%
@set s=0%s%
@if %n%==0 echo %h%:%m:~-2%:%s:~-2%

Tek basamaklı saatleri çıkarır.


2

Mathematica, 79 bayt

Cases[Tuples@{(r=Range)@24-1,x=r@60-1,x},t_/;Tr@t==#:>DateString@TimeObject@t]&


1

QBIC , 82 72 bayt

:[0,23|[0,59|[0,59|~b+c+d=a|?!b$+@:`+right$(@0`+!c$,2)+A+right$(B+!d$,2)

Bu, QBasic’de talihsiz bir noktaya değindi, numaraya döküm, kesme ve hazırlama 0 gerektiğinde hazırlamak gerçekten maliyetli.

Örnek çıktı:

Command line: 119
1:59:59
2:58:59
2:59:58
3:57:59
[... SNIP 270 lines ...]
23:58:38
23:59:37

Açıklama Bu konuda bir roman yazdım:

:           Get N, call it 'a'
[0,23|      Loop through the hours; this FOR loop is initialised with 2 parameters
            using a comma to separate FROM and TO, and a '|' to delimit the argument list
[0,59|      Same for the minutes
[0,59|      And the seconds
            QBIC automatically creates variables to use as loop-counters: 
            b, c, d (a was already taken by ':')
~b+c+d=a    IF a == b+c+d
|           THEN
 ?          PRINT
  !         CAST
   b        'b'
    $       To String; casting num to str in QBasic adds a space, this is trimmed in QBIC
+@:`        Create string A$, containing ":"
+right$      This is a QBasic function, but since it's all lowercase (and '$' is 
            not a function in QBIC) it remains unaltered in the resulting QBasic.
(@0`+!c$,2) Pad the minutes by prepending a 0, then taking the rightmost 2 characters.
+A          Remember that semicolon in A$? Add it again
+right$     Same for the seconds
(B+!d$,2)   Reusing the 0-string saves 2 bytes :-)

QBIC ilginç görünüyor. Sadece # kod golf için yarattın mı? :)
wasatchwizard

@wasatchwizard Yup :-)
steenbergh

1

PowerShell , 67 79 Bayt (kötü sürüm)

Kurallar, belirli bir zamanda (veya hiç) tamamlama hakkında hiçbir şey söylemediğinden ve yinelenmeyenler hakkında hiçbir şey söylemediğinden, korkunç bir çözüm:

for(){if(("{0:H+m+s}"-f($d=date)|iex)-in$args){"{0:H:mm:ss}"-f$d}}

1
İlgili meta gönderisini bulamıyorum, ancak zorla belirtmedikçe bir gönderimin geçerli olması için durması gerektiğinden eminim
Sefa

Thanks @Sefa ... eğer öyleyse, bu kötü versiyonumun Briantist'in temiz versiyonundan daha az karakterle çalışması için hoş bir yol bulamıyorsam ... Bu cevabı silmek için cazip oldum, ama bununla gurur duyuyorum kötü;)
JohnLBevan

0

Raket 39 bayt

(for*/sum((h 24)(m 60)(s 60))(+ h m s))

Ungolfed:

(for*/sum      ; loop for all combinations; return sum of values for each loop
   ((h 24)     ; h from 0 to 23
    (m 60)     ; m from 0 to 59
    (s 60))    ; s from 0 to 59
  (+ h m s))   ; sum of all 3 variables

0

MATL , 29 bayt

24:q60:qt&Z*t!si=Y)'%i:'8:)&V

Çevrimiçi deneyin!

açıklama

24:q     % Push [0 1 ... 23]
60:q     % Push [0 1 ... 59]
t        % Duplicate
&Z*      % Cartesian product of the three arrays. This gives a matrix with each
         % on a different row Cartesian tuple
t!       % Push a transposed copy
s        % Sum of each column
i=       % Logical mask of values that equal the input
Y)       % Select rows based on that mask
'%i:'    % Push this string
8:)      % Index (modularly) with [1 2 ... 8]: gives string '%i:%i:%i'
&V       % Convert to string with that format specification. Implicitly display

0

JavaScript, 122 120 bayt

Giriş olarak bir ek boş dize daha alır, Tahmin ettiğim büyüklük sayılmaz. Dizenin ilklendirilmesi için iki bayt eklemek için bytecount (tarihsel dahil) güncellendi.

console.log((
//Submission starts at the next line
i=>o=>{for(h=24;h--;)for(m=60;m--;)for(s=60;s--;)if(h+m+s==i)o+=`${h}:0${m}:0${s} `;return o.replace(/0\d{2}/g,d=>+d)}
//End submission
)(prompt("Number:",""))(""))


Boş bir dize başlatmanız gerekiyorsa, başlatma sayılmalıdır
edc65 10

@ edc65 Tamamlandı. ···
user2428118

0

JavaScript (ES6), 110

v=>eval("o=[];z=x=>':'+`0${x}`.slice(-2);for(m=60;m--;)for(s=60;s--;h>=0&h<24&&o.push(h+z(m)+z(s)))h=v-m-s;o")

Daha az golf oynadı

v=>{
  o=[];
  z=x=>':' + `0${x}`.slice(-2);
  for(m = 60; m--;)
    for(s = 60; s--; )
      h = v - m - s,
      h >= 0 & h < 24 && o.push(h + z(m) + z(s))
  return o
}

Ölçek

F=
v=>eval("o=[];z=x=>':'+`0${x}`.slice(-2);for(m=60;m--;)for(s=60;s--;h>=0&h<24&&o.push(h+z(m)+z(s)))h=v-m-s;o")

function update() {
  O.textContent=F(+I.value).join`\n`
}

update()
<input id='I' value=119 type=number min=0 max=141 oninput='update()'><pre id=O></pre>


0

JavaScript, 96 bayt

v=>{for (i=86399;i;[a,b,c]=[i/3600|0,i%3600/60|0,i--%60]){v-a-b-c?0:console.log(a+":"+b+":"+c)}}

Genişletilmiş görünüm:

v => {
    for (i = 86399; i;
        [a, b, c] = [i / 3600 | 0, i % 3600 / 60 | 0, i-- % 60]) {
        v - a - b - c ? 0 : console.log(a + ":" + b + ":" + c)
    }
}

86399 - 1 arasında döngü kurarak mümkün olan tüm zamanlar arasında geçiş yapın,

  • tamsayıyı zamana çevirerek ilk haneyi almak için 3600 bölü
  • mod 3600 tamsayısını alarak ve ardından 60'a bölerek 2. hane
  • ve son hane tam sayı mod 60'tır.

Üç sayı giriş değerine eklenirse, bir falsey değeri döndürmek için giriş değerinden 3 sayının tümünü çıkarın. Değer falsey ise, değeri verin.


0

bash, 78 bayt (bir BSD yardımcı programı kullanarak) veya 79 bayt (ayrıca BSD olmayan)

Bu @DigitalTrauma ve @ hvd'nin güzel 71 baytlık bash çözümünden biraz daha uzun, ama ben burada 60 bazda sayıları kullanma fikrini sevdim; Biri bunu biraz daha golf edebilir mi merak ediyorum.

BSD standardı jot yardımcı programı ile:

jot '-wx=`dc<<<60do3^%d+n`;((`dc<<<$x++'$1'-n`))||tr \  :<<<${x:3}' 86400 0|sh

Daha evrensel olarak bulunan seq aracıyla:

seq '-fx=`dc<<<60do3^%.f+n`;((`dc<<<$x++'$1'-n`))||tr \  :<<<${x:3}' 0 86399|sh

Fikir, 0 ila 83699 arasındaki sayıları oluşturmak ve bunları taban 60'a dönüştürmek için dc kullanmaktır. DC'nin taban 60 çıkışındaki "basamaklar", "basamakları" ayıran boşluklarla, 00 - 59 arasında 2 basamaklı sayılardır. Bu, istenen formatta 00 00 00 - 23 59 59 arasındaki tüm istenen süreleri neredeyse gereken biçimde listeler.

Kelimenin tam anlamıyla bunu yaparsanız, 60 ^ 2'nin altındaki sayılar, 60 tabanındaki 3 basamaklı sayılar değildir, bu nedenle ilk 00 veya 00 00 eksiktir. Bu nedenle aslında 60 ^ 3 ile 60 ^ 3 + 83699 arasındaki rakamları üretiyorum; bu, üretilen tüm sayıların 60. üssünde 4 basamak uzunluğunda olmasını sağlar. Sonunda, gerekli olmayan ekstra ilk basamağı (01) attığım sürece, bu tamamdır.

Böylece, istenen zamanlar oluşturulduktan sonra, her dörtlüsü sadece 01 00 00 00 - 01 23 59 59 arasında alırım, son üç sayıyı ekler ve $ 1 argümanını çıkarırım. Eğer 0 ise, daha sonra her şeyi dört karakterden 3. karakterden itibaren ("01" atma) alıyorum, boşlukları iki noktaya dönüştürmek ve sonucu yazdırmak için tr 'i kullanıyorum.


0

PowerShell , 91 97 bayt (giriş dahil)

param($x)1..864e3|%{($d=date($_*1e7l))}|?{("{0:H+m+s}"-f$_|iex)-eq$x}|%{"{0:H:mm:ss}"-f$_}

param($x)0..23|%{$h=$_;0..59|%{$m=$_;0..59|?{$h+$m+$_-eq$x}|%{"{0:0}:{1:00}:{2:00}"-f$h,$m,$_}}}

veya

param($x)0..23|%{$h=$_;0..59|?{($s=$x-$h-$_)-le59-and$s-ge0}|%{"{0:0}:{1:00}:{2:00}"-f$h,$_,$s}} <\ S>

Genişletilmiş ve yorum yapıldı

param($x)
#loop through the hours
0..23 | %{
    $h=$_
    #loop through the minutes
    0..59 | %{
        $m=$_
        #loop through the seconds
        0..59 | ?{ #filter for those where the sum matches the target
            $h + $m + $_ -eq $x
        } | %{
            #format the result
            "{0:#0}:{1:00}:{2:00}" -f $h, $m, $_
        }
    }
}

NB: @ Briantist’in sürümü tarafından geçildi: /codegolf//a/105163/6776

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.