Filmin okunabilir bir biçimde okunabilir uzunluğu


24

Bir filmin IMDb'deki uzunluğunu aradığımda, birkaç dakika içinde görüntüleniyor. Hemen onu saat (ler) e ve dakikalara dönüştürmeye çalışırdım. Bunu otomatikleştirebilirsek daha iyi olur.

Giriş:

150 min

Çıktı:

2 hours 30 minutes

Giriş:

90 min

Çıktı:

1 hour 30 minutes

Giriş:

61 min

Çıktı:

1 hour 1 minute

Giriş:

60 min

Çıktı:

1 hour 0 minute or 1 hour 0 minutes

Aşağıdaki koşullar:

  1. Giriş ve Çıkış bu tam formatta olmalıdır.

  2. Giriş dakikaları 0 ile 240 arasında olacaktır.

  3. Cevabınız komut satırı argümanlarını kabul edebilir veya kullanıcıdan veya bir fonksiyondan girdi okuyabilir

  4. Çıktı tırnak işaretleri içine alınmamalıdır.

  5. Çıktı yazdırılmalı, iade edilmemelidir.

Liderler Sıralaması:

Sonuç:

CJam ve Pyth arasında bir bağ. CJam'ın cevabını Pyth’in 35 bayt kodundan önce verildiği gibi kabul etmek. Ancak, lütfen yeni gönderileri teşvik etmeye devam edin.


2
@quintopia Site kurallarına göre , hayır. İsterseniz bir işlevi kullanabilirsiniz.
Doorknob

1
Teknik olarak ben (ve diğer insanlara bahse girerim) "150 dakika" okuyabilirim.
PyRulez

1
Neden> 59 dakika ile kısıtlanıyor? Ayrıca, 61 dakikadan 1 saate kadar 1 dakikayı tercih ederim ve 1 saat 0 dakika
beklemekten

6
Giriş aralığını 0-240 olarak değiştirdiniz, ancak 60'tan küçük test durumlarını dahil etmediniz. 28 yanıtın zaten gönderildiğini dikkate alarak orijinal aralığa uymanızı tavsiye ederim.
Alex A.

2
Tüm saatler boyunca kabul edilebilir çıktıları değiştirdiğiniz anlaşılıyor. Eğer bir zorluk giderilmesi gereken meseleleri belirtmiyorsa , lütfen mevcut cevapları geçersiz kılan bir görevde değişiklik yapmayın.
Alex A.

Yanıtlar:


10

CJam, 39 35 bayt

ri60md]"hour minute"S/.{1$1>'s*+}S*

Çevrimiçi deneyin

En son sürüm @ MartinBüttner tarafından önerilen, özellikle iki listeyi transpoze etmek yerine element-wise vektör operatörünü kullanarak yapılan iyileştirmeleri içerir.

Açıklama:

ri    Get input and convert to integer.
60md  Split into hours and minutes by calculating moddiv of input.
]     Wrap hours and minutes in a list.
"hour minute"
      String with units.
S/    Split it at spaces, giving ["hour" "minute"]
.{    Apply block element-wise to pair of vectors.
  1$    Copy number to top.
  1>    Check for greater than 1.
  's    Push 's.
  *     Multiply with comparison result, giving 's if greater 1, nothing otherwise.
  +     Concatenate optional 's with rest of string.
}     End block applied to both parts.
S*    Join with spaces.

1
35: ri60md]r"utehour"+6/W%.{1$1>'s*+}S*(Görünüşe göre bu size bu meydan okumada oldukça sağlam bir ipucu veriyor :))
Martin Ender

@ MartinBüttner r"utehour"+6/W%aslında aynı uzunluktadır "hour minute"S/, bu yüzden bu kısım yardımcı olmaz. Sanırım daha .önce bir blokla kullanıldığını görmüştüm , ancak yine de desteklendiğini unutmuştum.
Reto Koradi

Ah, doğru, önce gerçekten yardımcı olduğu 36 baytlık bir sürüm yayınladım (ancak daha sonra önemli değil, yorumu sildim ve 35 baytlık sürümle değiştirdim).
Martin Ender

19

Python 3, 50 67 119 116 112 111 104 94 bayt

%Stilli dize formatına geri dönmekten hoşlanmıyorum, ancak 6 bayttan tasarruf ediyor .format.

Düzenleme: Girişi ayrıştırmayı unuttum.

Düzenleme: çoğulları işlemek için unuttum.

Düzenleme: Yay lambdas!

Düzenleme: ungolfing eklendi

Düzenleme: Kahretsin. Lambdas yardım etmedi.

Düzenle: Dakikalar maksimum üç hane içerdiğinden ve int()dizgideki boşluklara aldırış etmediğinden, kullanarak birkaç byte tasarruf edebilirim input()[:3].

i,j=divmod(int(input()[:3]),60);print(str(i),"hour"+("s"[:i!=1]),str(j),"minute"+("s"[:i!=1]))

Ungolfed:

string = input()[:3]
hours, minutes = divmod(int(string), 60)
a = string(div)
b = "hour" + ("s" if hours == 1 else "")
c = string(mod)
d = "minute" + ("s" if minutes == 1 else "")
print(a, b, c, d)

22
Ah! Bytecount arttırılıyor ! Vazgeçmediği için +1 ;-)
agtoever

9

JavaScript, 78 bayt

n=>(h=(n=parseInt(n))/60|0)+` hour${h-1?"s":""} ${m=n%60} minute`+(m-1?"s":"")
<!--                               Try the test suite below!                              --><strong id="bytecount" style="display:inline; font-size:32px; font-family:Helvetica"></strong><strong id="bytediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><br><pre style="margin:0">Code:</pre><textarea id="textbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><pre style="margin:0">Input:</pre><textarea id="inputbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><button id="testbtn">Test!</button><button id="resetbtn">Reset</button><br><p><strong id="origheader" style="font-family:Helvetica; display:none">Original Code Output:</strong><p><div id="origoutput" style="margin-left:15px"></div><p><strong id="newheader" style="font-family:Helvetica; display:none">New Code Output:</strong><p><div id="newoutput" style="margin-left:15px"></div><script type="text/javascript" id="golfsnippet">var bytecount=document.getElementById("bytecount");var bytediff=document.getElementById("bytediff");var textbox=document.getElementById("textbox");var inputbox=document.getElementById("inputbox");var testbtn=document.getElementById("testbtn");var resetbtn=document.getElementById("resetbtn");var origheader=document.getElementById("origheader");var newheader=document.getElementById("newheader");var origoutput=document.getElementById("origoutput");var newoutput=document.getElementById("newoutput");textbox.style.width=inputbox.style.width=window.innerWidth-50+"px";var _originalCode=null;function getOriginalCode(){if(_originalCode!=null)return _originalCode;var allScripts=document.getElementsByTagName("script");for(var i=0;i<allScripts.length;i++){var script=allScripts[i];if(script.id!="golfsnippet"){originalCode=script.textContent.trim();return originalCode}}}function getNewCode(){return textbox.value.trim()}function getInput(){try{var inputText=inputbox.value.trim();var input=eval("["+inputText+"]");return input}catch(e){return null}}function setTextbox(s){textbox.value=s;onTextboxChange()}function setOutput(output,s){output.innerHTML=s}function addOutput(output,data){output.innerHTML+='<pre style="background-color:'+(data.type=="err"?"lightcoral":"lightgray")+'">'+escape(data.content)+"</pre>"}function getByteCount(s){return(new Blob([s],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"})).size}function onTextboxChange(){var newLength=getByteCount(getNewCode());var oldLength=getByteCount(getOriginalCode());bytecount.innerHTML=newLength+" bytes";var diff=newLength-oldLength;if(diff>0){bytediff.innerHTML="(+"+diff+")";bytediff.style.color="lightcoral"}else if(diff<0){bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgreen"}else{bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgray"}}function onTestBtn(evt){origheader.style.display="inline";newheader.style.display="inline";setOutput(newoutput,"");setOutput(origoutput,"");var input=getInput();if(input===null){addOutput(origoutput,{type:"err",content:"Input is malformed. Using no input."});addOutput(newoutput,{type:"err",content:"Input is malformed. Using no input."});input=[]}doInterpret(getNewCode(),input,function(data){addOutput(newoutput,data)});doInterpret(getOriginalCode(),input,function(data){addOutput(origoutput,data)});evt.stopPropagation();return false}function onResetBtn(evt){setTextbox(getOriginalCode());origheader.style.display="none";newheader.style.display="none";setOutput(origoutput,"");setOutput(newoutput,"")}function escape(s){return s.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}window.alert=function(){};window.prompt=function(){};function doInterpret(code,input,cb){var workerCode=interpret.toString()+";function stdout(s){ self.postMessage( {'type': 'out', 'content': s} ); }"+" function stderr(s){ self.postMessage( {'type': 'err', 'content': s} ); }"+" function kill(){ self.close(); }"+" self.addEventListener('message', function(msg){ interpret(msg.data.code, msg.data.input); });";var interpreter=new Worker(URL.createObjectURL(new Blob([workerCode])));interpreter.addEventListener("message",function(msg){cb(msg.data)});interpreter.postMessage({"code":code,"input":input});setTimeout(function(){interpreter.terminate()},1E4)}setTimeout(function(){getOriginalCode();textbox.addEventListener("input",onTextboxChange);testbtn.addEventListener("click",onTestBtn);resetbtn.addEventListener("click",onResetBtn);setTextbox(getOriginalCode())},100);function interpret(code,input){window={};alert=function(s){stdout(s)};window.alert=alert;console.log=alert;prompt=function(s){if(input.length<1)stderr("not enough input");else{var nextInput=input[0];input=input.slice(1);return nextInput.toString()}};window.prompt=prompt;(function(){try{var evalResult=eval(code);if(typeof evalResult=="function"){var callResult=evalResult.apply(this,input);if(typeof callResult!="undefined")stdout(callResult)}}catch(e){stderr(e.message)}})()};</script>

Test takımı için, "61 min"giriş kutusuna benzer bir giriş yapın.


açıklama

n=>                 //Define anonymous function w/ parameter n
(h=                 //start building the string to return with h, the # of hours
(n=parseInt(n))     //parse input for n
/60|0)+             //set h to floor(n / 60)
` hour              //add ' hour' to the string to return
${h-1?"s":""}       //add 's' to the string to return if h != 1, else add ''
                    //<--(a single space) add ' ' to the string to return
${m=n%60}           //set m, the # of miuntes, to n % 60, and add it to the string to return
 minute`+           //add ' minute' to the string to return
(m-1?"s":"")        //add 's' to the string to return if m != 1, else add ''
                    //implicitly return

İyi bir. Öneri: azaltmak parseInt(n)için +n.
nicael

1
Giriş sadece bir tamsayı olmayacak. Giriş sağladığımda başarısız oluyor 150 min.
Vasu Adari 28:15

1
@VasuAdari Bu benim için çalışıyor, çıktılar 2 hours 30 minutes. Nasıl test ettiğinizi sorabilir miyim?
Jrich

3
@ ev3commander Test snippet'ini kullanırken, girdiyi bir dize olarak tanınacak şekilde tırnak içine alın. örneğin "61 min"veya'61 min'
jrich

1
JavaScript için +1. Şimdi sadece bir kitapçık yapmak zorundasınız ;)
MayorMonty

6

Pyth, 39 38 bayt

jd.iJ.Dv-zG60+Vc"hour minute")m*\s>d1J

5

Vitsy , 57 54 52 bayt

Oh, vay, benim dilimde tamsayılar bile yok. oo

VVa6*Dv/D1M-D1m'ruoh 'Z' 'OVvM1m'etunim 'Z
N1-(['s']
VV                                      Capture the input as a final global 
                                        variable, and push it again.
  a6*Dv/1M-                             Get floor(input/60), capturing 60 as a 
                                        temp variable in the process.
           DN                           Duplicate and output it as a number.
             1-(['s']                   If it is only one, push 's'.

            'ruoh '                     Push ' hour'
                   Z                    Output everything.
                    ' 'O                Output a space.
V                                       Push the input.
 v                                      Get the temp variable (60).
  M                                     Modulo.
            N                           Output as a number.
             1-(['s']                   If it is only one, push 's'.

             'ruoh '                    Push ' hour'
                    Z                   Output everything.

Çevrimiçi deneyin!


4

K5, 55 51 bayt

" "/(" hour";" minute"){y,x,("s";"")1=.y}'$25 60\.*" "\

Bu kesinlikle olması gerekenden daha genel; hala daha aşağı golf olabilir.

Eylemde:

  f: " "/(" hour";" minute"){y,x,("s";"")1=.y}'$25 60\.*" "\;

  f'("61 min";"120 min";"150 min")
("1 hour 1 minute"
 "2 hours 0 minutes"
 "2 hours 30 minutes")

Düzenle:

Bu program gelişim sürecinde çok farklı yinelemelerden geçti ve bazı ara adımları göstermenin daha aydınlatıcı olabileceğini düşündüm.

Çoğullama şartı getirilmeden önce, sorundaki ilk bıçağım. Burada net bir tekrar var:

{($_x%60)," hours ",($_60!x)," minutes"}@.*" "\

Yerlerin dökümünü ele almanın genel yolunun K5'in “kod çözme” biçimi olduğunu anladım. Dize değerleri yerine yerleştirmek için bir fonksiyona bir argüman listesi uygulayan ve listeyi ayrı ayrı parametrelere paketleyen "dot-application" primitifini kullandım:

{x," hours ",y," minutes"}.$25 60\.*" "\

Fazlalık kalmadı burada. Çoğulculuk eklendiğinde, öncü anonim işlevini her sayı için uygulayabileceğim bir dönüşüme dönüştürdüm, şöyle:

{x,y,("s";"")1=.x}

Üyelik x, yve ya sbağlı olarak ya da hiçbir şeyx is "1" e eşit. Sonuçta, argümanların sırasını bu işleve tersine çevirmek daha iyi çalıştı.

Düzenleme 2:

" "/(" hour";" minute"){y,x,("s";"")1=.y}'$25 60\.*" "\
" "/(" hour";" minute"){y,x,(~1=.y)#"s"}'$5 60\.-4_

Burada birkaç küçük iyileştirme var. Bir "s" veya boş bir dize seçmenin daha iyi bir yolu, sınırlı girdi aralığını yansıtan "kod çözme" için daha kısa bir sabit ve "dak" atmanın daha basit bir yolu.


4

Pyth, 46 bayt

jKdm++J.v+++hd:z03K60K+td*\s>J1c"/hour %minute

Girişi alır x min ve çıkışları alırx hours y minutes

Dene Burada

Açıklama:

   m~~~~~~~~~~~~~~~~~~~~~~~~~~~c"/hour %minute - map(func, "/hour %minute".split(" "))
            hd                                 - Get the first character of the string (/ or %)
              :z03                             - Get the first 3 characters of input
         +++      K60                          - Join them together and add a space and 60 to the end
      J.v                                      - Evaluate it and set result to J
                       td                      - Get all the characters of the string but the first (hour, minute)
                      +  *\s>J1                - If the result of the evaluated expression is less than 1, add an 's' character to the string
    ++               K                         - Join the results seperated with a space
jKd                                            - Join the 2 halves together with a space

3

Perl 6 , 80 73 bayt

80 baytlık orijinal

{my$h=$_ div 60;my$m=$_%60;"$h hour{'s'x?($h-1)}"~" $m minute{'s'x?($m-1)}"x?$m}

Kullanımı:

.say for (150,90,61,60).map:
  {my$h=$_ div 60;my$m=$_%60;"$h hour{'s'x?($h-1)}"~" $m minute{'s'x?($m-1)}"x?$m}
2 hours 30 minutes
1 hour 30 minutes
1 hour 1 minute
1 hour

Sorudaki bir değişiklik nedeniyle x?$m, fonksiyonun sonundan kaldırabilirim , bu da onu 3 bayt daha azaltmamı sağlıyor.

{my$h=$_ div 60;my$m=$_%60;"$h hour{'s'x?($h-1)} $m minute{'s'x?($m-1)}"}
2 hours 30 minutes
1 hour 30 minutes
1 hour 1 minute
1 hour 0 minutes

3

JavaScript (ES6), 100 94 89 81 bayt

t=>(h=0|(t=parseInt(t))/60)+' hour'+(h>1?'s ':' ')+t%60+' minute'+(t%60>1?'s':'')

De-golfed demo (henüz tüm tarayıcılar ES6'yı desteklemediğinden, ES5'e dönüştürülmüş)

function s(t) {
  return (h = 0 | (t = parseInt(t)) / 60) + ' hour' + (h > 1 ? 's ' : ' ') + t % 60 + ' minute' + (t % 60 > 1 ? 's' : '');
}

alert(s(prompt()))


Sen sarabilirdiniz t=parseInt(t)ve sonra parantez ve nereye kadar önce kullanmak koymak tböylece: (h=0|(t=parseInt(t))/60). Bu sayede, dönüşü ve{}
Downgoat

@Downgoat Zaten denedim ama nedense işe yaramadı. Tekrar deneyeceğim.
nicael

1
@Downgoat Görünüşe göre daha önce bir hata yaptım, şimdi düzgün çalışıyor. Thanks :)
nicael 28:15

TEMPLATE STRINGS KULLANIMI. $ {} !!!
Mama Fun Roll

3

C #, 127 bayt

var i=int.Parse(Console.ReadLine().Split(' ')[0]);Console.Write(i/60+" hour"+(i/60>1?"s ":" ")+i%60+" minute"+(i%60>1?"s":""));

Bu, bir dosyaya konulabilir ve varsayılan konfigürasyonu kullanarak, Mono ile birlikte gelen C # etkileşimli kabuğu üzerinden çalıştırılabilir .

[Bu kod golf için ilk girişimdi. Umarım katkım herhangi bir kuralı ihlal etmiyordur.]


3

C, 89 bayt

main(n){scanf("%d",&n);printf("%d hour%s %d minute%s",n/60,"s"+119/n,n%60,"s"+(n%60<2));}

3

Ruby, 75 bayt

a,b=gets.to_i.divmod 60;$><<"#{a} hour#{a>1??s:''} #{b} minute#{b>1??s:''}"

Bazen boş bir dize bile çok uzun. ''p.
Manatwork

2

MATLAB, 111 108 106 bayt

i=sscanf(input(''),'%d');h=fix(i/60);m=i-h*60;fprintf('%d hour%c %d minute%c\n',h,'s'*(h~=1),m,'s'*(m~=1))

Bu Octave ile de çalışır ve burada denenebilir . Bağlantı, adı verilen bir dosyada zaten kodu içeren bir çalışma alanına yöneliktir runningLength.m. Bu yüzden test etmek için sadece runningLengthkomut satırına girin, ardından girdi dizisini girin, örneğin '123 mins've çıktı görüntüleyecektir.

Girdiyi bir dize olarak alır, örneğin '123 mins', bir sayıya dönüştürür (bu, minsbiti yok sayar ).

i=sscanf(input(''),'%d');

Dakikalar ve saatler hesaplanır

h=fix(i/60);m=i-h*60;

Sonra çıkış dizesini görüntüler

fprintf('%d hour%c %d minute%c',h,'s'*(h~=1),m,'s'*(m~=1));

Çıktının 's' biti doğru hesaplanır ve işlenir - sayı 1 olmadığında bir 's' eklenir.


2

Python 2, 96 bayt

i=int(raw_input().split()[0])
print"%d hour%s %d minute%s"%(i/60,"s"*(i>120),i%60,"s"*(i%60!=1))

7
Bu çoğulları doğru bir şekilde ele alıyor gibi görünmüyor.
Doorknob

@Doorknob Cevaplar gönderildikten sonra kurallar değiştiğinde bu olur :)
quintopia

2

Haskell, 117 109 bayt

f x|(d,m)<-divMod(read$take 3 x)60=putStr$u[d#"hour",m#"minute"];u=unwords;1#q=u["1",q];p#q=u[show p,q++"s"]

Daha az golf oyunu:

f :: String -> IO ()
f x = putStr (unwords [(n`div`60)#"hour",(n`mod`60)#"minute"])
  where
  n :: Int
  n = take 3 (read x)

  (#) :: Int -> String -> String
  1#q = unwords ["1",q]
  p#q = unwords [show p,q++"s"]

fgirişinin ilk 3 karakterini alan ve onları bir tam sayıya dönüştüren bir fonksiyondur. p#qçoğulları yapan bir fonksiyondurqeğer p1'e eşit değilse , sonucu çevreleyen alıntılar olmadan geri döndürmek için sonucu putStrSTDOUT'a yazdırırdım.

Yardım için nimi için teşekkürler!


2

Python 2, 79 77 bayt

m=int(raw_input()[:3])
print m/60,"hours"[:4+m/120],m%60,"minutes"[:6+m/2%30]

Girişin ilk 3 karakteri basitçe bir tamsayı olarak ayrıştırılır. Bu yalnızca işe yarar, çünkü 2 basamaklı bir girişteki üçüncü karakter, intdönüştürme sırasında yoksayılacak bir boşluktur .


Sanırım "hour"+m/120*"s"dakikalarca aynı şeyi yapabilirsin .
Xnor

m=240Maalesef başarısız olacak .
xsot

2

LabVIEW, 50 Bayt

Bu Meta hakkındaki önerime göre sayılır .

Kod oldukça basittir, Modulo girişinden 60 ile sayı alın ve dakikalar için bir s ekleyin!

enter image description here


2

Scala, 135 bayt

var a=(i:String)=>{var (v,b)=(i.split(" ")(0).toInt,(i:Int)=>if(i<2)""else"s");printf(v/60+" hour"+b(v/60)+" "+v%60+" minute"+b(v%60))}

Kullanımı:

a("120 min")
2 hours 0 minute

2

Haskell, 107 101 bayt

g=putStr.f.read.take 3;s!1='1':s;s!n=show n++s++"s";f x|(a,b)<-divMod x 60=" hour"!a++' ':" minute"!b

Ungolfed:

g :: String -> String
g = putStr . f . read . take 3 
  where
    (!) :: String -> Int -> String
    s!1 = '1':s
    s!n = show n++s++"s"

    f :: Int -> String;
    f x
      | (a,b) <- divMod x 60 = " hour"!a ++ ' ':(" minute"!b)

s!nprepends niçin s, bir ekleme 's'ise sonuna kadar n /= 1.

f xbiçimlendirmeyi kullandıktan sonra yapar divMod.

En fazla girdi kabul edebileceğimizden 240, take 3sadece sayıyı almak yeterlidir.

(@Craig Roy'un skorunu yenmek için gerçekten çok uğraştım ...)


2

R, 112 bayt

Düzenleme : Kapsam belirleme hatası düzeltildi ve ardından tırnak çıkışı sorununu giderdi.

g=function(x){h=floor(x/60);m=x%%60;cat(paste(h,ifelse(h==1,"hour","hours"),m,ifelse(m==1,"minute","minutes")))}

Test durumları

> g(150)
2 hours 30 minutes
> g(90)
1 hour 30 minutes
> g(61)
1 hour 1 minute
> g(60)
1 hour 0 minutes

Sadece gerektiği gibi "s" eklemek veya çıkarmak için bir yol bulmaya çalışarak yer kazanmak için çalıştı ama ben uğraşmak zorunda sep =içinde argümanpaste() işlevdeki ve bu gerçekten beni çok fazla yer kazandıracak gibi görünmüyordu. Baska öneri?

Ungolfed

g=function(x){
    h=floor(x/60);
    m=x%%60;
    cat(paste(h,
              ifelse(h==1,"hour","hours"),
              m,
              ifelse(m==1,"minute","minutes")))
}

Giriş / 60 veya giriş %% 60 (mod) ile aşağı yuvarlama sırasıyla saat ve dakika değerini verir. Onları ifelse(), birimlerin saat mi, dakika mı olduğunu belirten bir ifade ile birlikte zincirleyin .


Çıktı tırnak işaretleri içine alınmamalıdır.
Vasu Adari

@ Vasu Adari Bu cat()işlevi kullanarak düzeltildi .
syntonicC

1
Sadece çoğullarla başlayarak s ve koşullarınızı değiştirerek bayt tasarrufu yapabilirsiniz .
Vasu Adari

1

Ruby, 97 100 99 88 bayt

Düzenleme: Çıktıyı sabitleme.

Düzenleme: Parantezleri çıkarma divmod.

Düzenleme: Yay dize enterpolasyonu! Vasu Adari'ye teşekkürler . Ayrıca, daha iyi ungolfing.

i,j=gets.split[0].to_i.divmod 60;puts"#{i} hour#{i==1?"":"s"} #{j} minute#{j==1?"":"s"}"

Ungolfed:

input = gets                            Input
number = input.split[0].to_i            Get number, convert to int
hours, minutes = number.divmod 60       hours == s / 60, minutes == s % 60
result = hours.to_s+" hour"             Start with the hours
result += {hours == 1 ? "" : "s"}       Put in the first "s" if plural
result += minutes.to_s+" minute"        Add the minutes
result += {minutes == 1 ? "" : "s"}     Put in the second "s" if plural
puts result                             Output

o / p tırnak işaretleri içine alınmamalıdır.
Vasu Adari

@VasuAdari Sabit
Sherlock9

divmodYöntem için diş tellerini kaybedebilirsiniz . Ayrıca string enterpolasyonu kullanarak birkaç byte tasarruf edebilirsiniz.
Vasu Adari

@VasuAdari Bu dizilimin ipopolasyonunun bir şey olduğunun farkındayım, ama ne olduğundan veya nasıl çalıştığından emin değilim. Yardımın için teşekkürler
Sherlock9

@ VasuAdari Oop, bekleyin. Google bana bilmem gerekenleri öğretti. Düzenleyeyim.
Sherlock9

1

Go, 177 Bayt

(Yalnızca işlevi ve içe aktarma ifadelerini içerir)

import("fmt";c"strconv";t"strings")
func f(s string){p,_:=c.Atoi(t.Split(s," ")[0]);t:=fmt.Printf;h:=p/60;m:=p%60;t("%d Hour",h);if h>1{t("s")};t(" %d Minute",m);if m>1{t("s")}}

Güzel çözüm -

func f(s string) {
    p, _ := c.Atoi(t.Split(s, " ")[0])
    t := fmt.Printf
    h := p / 60;m := p % 60
    t("%d Hour", h)
    if h > 1 {
        t("s")
    }
    t(" %d Minute", m)
    if m > 1 {
        t("s")
    }
}

Test etmek -

func main() {
    ip_list := []string{
        "120 min",
        "150 min",
        "60 min",
    }

    for _, ip_val := range ip_list {
        f(ip_val)
        fmt.Println("")
    }
}

/* OUTPUT
2 Hours 0 Minute
2 Hours 30 Minutes
1 Hour 0 Minute
*/


1

AutoHotkey , 174 170 160 bayt

x::Send,% !i?"x" i:=SubStr(clipboard,1,(Clipboard~="\s")):"{Backspace "StrLen(i)"}" i//60 " Hour"(i//60!=1?"s ":" ")Mod(i,60)" Minute"(Mod(i,60)!=1?"s":"")i:=""

Notlar:

  1. Panodan Giriş
  2. Çıktı, düğmesine basarak herhangi bir forma yazdırır x
  3. Çoğulları doğru şekilde işler
  4. Daha küçük olabilir ama bir One Liner sağlamak istedim.

1

PHP, 77 76 bayt

$m=($i=$argv[1])%60;echo$h=$i/60|0," hour","s"[$h<2]," $m minute","s"[$m<2];

horible, horible, horible!
PHP sadece birkaç Notices yayınlar ."s"[$h<2]

Çalıştırmak için: php -r 'CODE' '150 minutes'
ve elbette hata bildirimini stdout'tan uzakta / uzakta!

Düzenleme: -1bayt atamak atama (kredi: insertusernamehere)

O kadar çirkin ki linux kullanıcıları için çalışma yardımcısı vermeliyim:

php -c /usr/share/php5/php.ini-production.cli -r 'CODE' '61 min'

1 bayt az: $m=($i=$argv[1])%60;echo$h=$i/60|0," hour","s"[$h<2]," $m minute","s"[$m<2];.
insertusernamehere

@insertusernamehere güzel, teşekkürler! crazy
CSᵠ

Rica ederim. Hatta 4 byte daha az (dün haber için çok yorgundu): $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
insertusernamehere

@insertusernamehere gerçekten kötü bir eski, ama 5.6-7 php için çalıştığına ve 5.3-5.5 için işe yaramadığına inanamıyorum
CSᵠ

PHP 5.6.10 (OS X) ile test ettim ve burada çalışıyor. :)
insertusernamehere 29:15

1

Arcyóu (rekabetçi olmayan), 93 bayt

Bu gönderim, bu mücadeleden sonra oluşturulan dilin bir versiyonunu kullanır.

(: x(#((v(l))0)))(: h(#/ x 60))(: m(% x 60))(% "%d hour%s %d minute%s"(' h(* s([ h))m(* s([ m

Yeesh! Bu dil daha iyi dize manipülasyonu gerektirir.

Açıklama:

(: x              ; Set x
  (#              ; Cast to int
    ((v (l)) 0))) ; First element of input split on spaces
(: h (#/ x 60))   ; Set h to the hours
(: m (% x 60))    ; Set m to the minutes
(%                ; String format
  "%d hour%s %d minute%s"
  ('              ; List
    h             ; Hours
    (* s([ h))    ; Evaluates to 's' if h is not 1
    m             ; Minutes 
    (* s([ m      ; Evaluates to 's' is m is not 1

1

Ruby, 74 73 71 bayt

->i{puts"#{i=i.to_i;h=i/60} hour#{h>1??s:''} #{m=i%60} minute#{m>1??s:''}"}

73 bayt

->i{puts"#{h,m=i.to_i.divmod 60;h} hour#{h>1??s:''} #{m} minute#{m>1??s:''}"}

74 bayt:

->i{h,m=i.to_i.divmod 60;puts "#{h} hour#{h>1??s:''} #{m} minute#{m>1??s:''}"}

Kullanımı:

->i{puts"#{i=i.to_i;h=i/60} hour#{h>1??s:''} #{m=i%60} minute#{m>1??s:''}"}[61]

1 hour 1 minute

1

Kotlin, 132 bayt

val m={s:String->val j=s.split(" ")[0].toInt();print("${j/60} hour${if(j/60==1)"" else "s"} ${j%60} minute"+if(j%60==1)"" else "s")}

Ungolfed Sürümü:

val m = { s: String -> 
    val j = s.split(" ")[0].toInt();
    print("${j / 60} hour${if(j / 60 == 1) "" else "s"} ${j % 60} minute" + if(j % 60 == 1) "" else "s")
}

Şununla test et:

fun main(args: Array<String>) {
    for(i in arrayOf(150, 90, 61, 60)) {
        m("$i min")
        println()
    }
}

Örnek çıktılar:

2 hours 30 minutes
1 hour 30 minutes
1 hour 1 minute
1 hour 0 minutes

1
PPCG.SE'ye Hoşgeldiniz! Yazınızı daha estetik olarak daha hoş görünmesi için düzenledim. İyi eğlenceler!
GamrCorps 29:15

1

Cidden , 77 bayt

ε" min",Æ≈;:60:@\@:60:@%'sε(;)1≥I"%d hour"+(#@%'sε(;)1≥I"%d minute"+(#@%@k' j

Ciddi bir ciddi dize manipülasyon iyi değil. Tam açıklama ile çevrimiçi deneyin ( "210 mins"permalink'ler tırnaklardan hoşlanmadığı için girişleri manuel olarak girmeniz gerekir ).

Hızlı ve kirli açıklama:

ε" min",Æ≈            get input, replace " min" with the empty string, convert to int
;:60:@\@:60:@%        calculate divmod
'sε(;)1≥I"%d hour"+   push "%d hour" or "%d hours", depending on whether pluralization is needed
(#@%                  format "%d hour(s)" with the # of hours calculated earlier
'sε(;)1≥I"%d minute"+ same as above, but with minutes
(#@%                  same as above, but with minutes
@k' j                 swap the order and join with a space to get "X hour(s) X minute(s)"

Bağlantınız çalışmıyor
TanMath

1

Java 8, 148 Bayt

interface S{static void main(String[]b){int a=new Integer(b[0]),h=a/60,m=a%60;System.out.printf(h+" hour%s "+m+" minute%s",h>1?"s":"",m>1?"s":"");}}

@ TheAustralianBirdEatingLouse ürününe bir alternatif göndermeyi seçtim, çünkü bu yalnızca iyi bir anlaşma (~% 10) ile daha kısa değil, aynı zamanda baskı saatleri ve dakikaları yerine baskı saatlerinde ve dakikalarında daha doğru. Arayüzlerdeki metod uygulamaları Java 8 için yeni - yani derlemek / çalıştırmak için bu gerekli olacaktı

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.