Lauflänge des Films in einem für Menschen lesbaren Format

24

Immer wenn ich in IMDb nach der Lauflänge eines Films suche, wird diese in Minuten angezeigt. Ich würde sofort versuchen, es in Stunde (n) und Minute (n) umzurechnen. Es wäre besser, wenn wir dies automatisieren könnten.

Eingang:

150 min

Ausgabe:

2 hours 30 minutes

Eingang:

90 min

Ausgabe:

1 hour 30 minutes

Eingang:

61 min

Ausgabe:

1 hour 1 minute

Eingang:

60 min

Ausgabe:

1 hour 0 minute or 1 hour 0 minutes

Es folgen die Bedingungen:

  1. Eingabe und Ausgabe sollten in genau diesem Format erfolgen.

  2. Die Minuten werden zwischen 0 und 240 eingegeben.

  3. Ihre Antwort kann Befehlszeilenargumente akzeptieren oder Eingaben des Benutzers oder einer Funktion lesen.

  4. Die Ausgabe sollte nicht in Anführungszeichen eingeschlossen werden.

  5. Die Ausgabe muss gedruckt und nicht zurückgesandt werden.

Bestenliste:

Ergebnis:

Es ist eine Verbindung zwischen CJam und Pyth. Akzeptiert die Antwort von CJam, die vor Pyths 35-Byte-Code übermittelt wurde. Bitte ermutigen Sie jedoch weiterhin zu neuen Einsendungen.

Vasu Adari
quelle
2
@quintopia Gemäß den Site-Regeln , nein. Sie können eine Funktion verwenden, wenn Sie möchten.
Türklinke
1
Technisch kann ich (und ich wette, andere Menschen) "150 Minuten" lesen.
PyRulez
1
Warum auf> 59 Minuten beschränken? Außerdem bevorzuge ich 61 Minuten vor 1 Stunde 1 Minute und würde es wirklich hassen, 1 Stunde 0 Minuten zu sehen
markshancock
6
Sie haben den Eingabebereich auf 0-240 geändert, aber keine Testfälle mit weniger als 60 eingeschlossen. Ich empfehle, den ursprünglichen Bereich beizubehalten, da bereits 28 Antworten veröffentlicht wurden.
Alex A.
2
Anscheinend haben Sie auch die akzeptable Ausgabe für ganze Stunden geändert. Es sei denn , eine Herausforderung Probleme hat schmettern , dass Bedarf festgelegt werden, stellen Sie keine Änderungen an einer Herausforderung , die invalidate bestehenden Antworten.
Alex A.

Antworten:

10

CJam, 39 35 Bytes

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

Probieren Sie es online aus

Die neueste Version enthält Verbesserungen, die von @ MartinBüttner vorgeschlagen wurden, insbesondere die Verwendung des elementweisen Vektoroperators anstelle der Transponierung der beiden Listen.

Erläuterung:

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.
Reto Koradi
quelle
1
35: ri60md]r"utehour"+6/W%.{1$1>'s*+}S*(Sieht so aus, als ob Sie bei dieser Herausforderung einen recht soliden Vorsprung haben :))
Martin Ender
@ MartinBüttner r"utehour"+6/W%ist eigentlich genauso lang wie "hour minute"S/, damit das Teil nicht hilft. Ich glaube ich hatte schon mal .mit einem Block benutzt, aber ich hatte wieder vergessen, dass er unterstützt wurde.
Reto Koradi
Ah, richtig, ich hatte zuerst eine 36-Byte-Version gepostet, in der es tatsächlich geholfen hat (aber dann den Kommentar gelöscht und durch die 35-Byte-Version ersetzt, in der es keine Rolle mehr spielt).
Martin Ender
19

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

Ich mag es nicht, zur %Formatierung von Strings im -Stil zurückzukehren, aber es spart 6 Bytes .format.

Bearbeiten: Eingabe vergessen.

Bearbeiten: Vergessen, mit Pluralformen umzugehen.

Bearbeiten: Yay Lambdas!

Edit: Ungolfing hinzugefügt

Edit: Verdammt noch mal. Lambdas hat nicht geholfen.

Bearbeiten: Da die Minuten maximal drei Stellen haben und int()Leerzeichen in der Zeichenfolge keine Rolle spielen, kann ich mit ein paar Bytes sparen 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)
Sherlock9
quelle
22
Ah! Zunehmende bytecount! +1, weil
du
9

JavaScript, 78 Byte

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>

Geben Sie für die Testsuite die Eingabe wie "61 min"in das Eingabefeld ein.


Erläuterung

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
jrich
quelle
Gut Vorschlag: reduzieren parseInt(n)auf +n.
Nicoleel
1
Die Eingabe ist nicht nur eine Ganzzahl. Es schlägt fehl, wenn ich Eingaben als 150 min.
Vasu Adari
1
@ VasuAdari Es funktioniert für mich, Ausgänge 2 hours 30 minutes. Darf ich fragen, wie Sie es getestet haben?
jrich
3
@ ev3commander Wenn Sie das Test-Snippet verwenden, setzen Sie die Eingabe in Anführungszeichen, damit sie als Zeichenfolge erkannt wird. eg "61 min"or'61 min'
jrich
1
+1 Für JavaScript. Jetzt musst du nur noch ein Bookmarlet daraus machen ;)
MayorMonty
6

Pyth, 39 38 Bytes

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

Vitsy , 57 54 52 Bytes

Oh, wow, ich habe nicht einmal ganze Zahlen in meiner Sprache. 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.

Probieren Sie es online!

Addison Crump
quelle
4

K5, 55 51 Bytes

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

Dies ist allgemeiner, als es unbedingt sein muss; könnte es noch weiter nach unten golfen.

In Aktion:

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

Bearbeiten:

Dieses Programm hat im Laufe der Entwicklung mehrere sehr unterschiedliche Iterationen durchlaufen, und ich dachte, dass es aufschlussreicher sein könnte, einige der Zwischenschritte zu zeigen.

Hier war mein erster Versuch, das Problem zu lösen, bevor die Pluralisierungsanforderung eingeführt wurde. Hier gibt es deutliche Wiederholungen:

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

Mir wurde klar, dass die allgemeine Art, mit dem Auswerfen von Orten umzugehen, die "Dekodierungsform" von K5 war. Um Werte in die Zeichenfolge einzufügen, habe ich das Grundelement "dot-apply" verwendet, mit dem eine Argumentliste auf eine Funktion angewendet und die Liste in einzelne Parameter entpackt wird:

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

Hier ist nicht mehr viel Redundanz übrig. Als die Pluralisierung hinzugefügt wurde, zerlegte ich diese führende anonyme Funktion in eine Transformation, die ich auf jede Zahl anwenden konnte:

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

Mitglied wird x, yund entweder soder nichts, je nachdem , ob xgleich „1“. Letztlich war es besser , die Reihenfolge der Argumente für diese Funktion rückgängig zu machen.

Bearbeiten 2:

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

Einige kleine Verbesserungen hier. Eine bessere Möglichkeit, eine „S“ oder eine leere Zeichenfolge auszuwählen, eine kürzere Konstante für „decode“, die den begrenzten Bereich des Eingangs reflektieren, und eine einfachere Art und Weise der Entsorgung „min“.

JohnE
quelle
4

Pyth, 46 Bytes

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

Übernimmt Ein- x minund Ausgängex hours y minutes

Probieren Sie es hier

Erläuterung:

   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
Blau
quelle
3

Perl 6 , 80 73 Bytes

80 Byte original

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

Verwendung:

.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

Aufgrund einer Änderung in der Frage kann ich x?$mdas Ende der Funktion entfernen , wodurch ich es um 3 weitere Bytes reduzieren kann.

{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
Brad Gilbert b2gills
quelle
3

JavaScript (ES6), 100 94 89 81 Byte

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

De-golfed Demo (bis ES5 umgewandelt, da nicht alle Browser ES6 noch unterstützen)

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

alert(s(prompt()))

nicael
quelle
Sie könnten wickeln t=parseInt(t)und Klammern, und dann setzen , dass , wo immer zuerst verwenden Sie tso: (h=0|(t=parseInt(t))/60). Auf diese Weise können Sie die Rückkehr entfernen und den{}
Downgoat
@Downgoat Ich habe es bereits versucht, aber es hat aus irgendeinem Grund nicht funktioniert. Werde es nochmal versuchen.
nicael
1
@Downgoat Anscheinend habe ich vorher einen Fehler gemacht, jetzt funktioniert es einwandfrei. Thanks :)
nicael
VERWENDEN SIE TEMPLATE STRINGS. $ {} !!!
Mama Fun Rolle
3

C #, 127 Bytes

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

Dies kann in eine Datei eingefügt und über die mit Mono gelieferte interaktive C # -Shell mit der Standardkonfiguration ausgeführt werden.

[Dies ist mein erster Versuch, Code Golf zu spielen. Ich hoffe, dass mein Beitrag ist keine Regeln zu verletzen.]

Hilbert
quelle
3

C 89 Bytes

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

Ruby, 75 Bytes

a,b=gets.to_i.divmod 60;$><<"#{a} hour#{a>1??s:''} #{b} minute#{b>1??s:''}"
Peter Lenkefi
quelle
Manchmal ist sogar eine leere Zeichenfolge zu lang. ''p.
Handarbeit
2

MATLAB, 111 108 106 Bytes

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

Dies funktioniert auch mit Octave und kann hier ausprobiert werden . Der Link führt zu einem Arbeitsbereich, der den Code bereits in einer Datei mit dem Namen enthält runningLength.m. Um es zu testen, geben Sie einfach runningLengthan der Eingabeaufforderung ein und geben Sie dann die Eingabezeichenfolge ein, z. B. '123 mins'und es wird die Ausgabe angezeigt.

Nimmt die Eingabe als Zeichenfolge, '123 mins'konvertiert sie z. B. in eine Zahl (die das minsBit implizit ignoriert ).

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

Minuten und Stunden werden dann berechnet

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

Dann zeigt die Ausgabezeichenfolge

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

Das 's'-Bit der Ausgabe wird korrekt berechnet und verarbeitet - ein' s 'wird hinzugefügt, wenn die Zahl nicht 1 ist.

Tom Carpenter
quelle
2

Python 2, 96 Bytes

i=int(raw_input().split()[0])
print"%d hour%s %d minute%s"%(i/60,"s"*(i>120),i%60,"s"*(i%60!=1))
Quintopie
quelle
7
Dies scheint nicht richtig mit Pluralformen umzugehen.
Türklinke
@Doorknob Dies ist , was passiert , wenn die Regeln geändert erhalten nach Antworten :) geschrieben
quintopia
2

Haskell, 117 109 Bytes

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"]

Weniger Golf Version:

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"]

fist eine Funktion, die die ersten 3 Zeichen ihrer Eingabe in eine Ganzzahl umwandelt. p#qist eine Funktion, die pluralisiert, qwenn pnicht gleich 1 ist. Um das Ergebnis ohne umgebende Anführungszeichen zurückzugeben, habe ich putStrdas Ergebnis an STDOUT ausgegeben.

Danke an nimi für die Hilfe!

Craig Roy
quelle
2

Python 2, 79 77 Bytes

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

Die ersten 3 Zeichen der Eingabe werden einfach als Ganzzahl analysiert. Dies funktioniert nur, weil das dritte Zeichen in einer zweistelligen Eingabe ein Leerzeichen ist, das intbei der Konvertierung ignoriert wird.

xsot
quelle
Ich denke, Sie können es einfach "hour"+m/120*"s"und ebenfalls für Minuten tun .
29.
Es wird m=240leider scheitern.
29.
2

Scala, 135 Bytes

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

Verwendung:

a("120 min")
2 hours 0 minute
Vasu Adari
quelle
2

Haskell, 107 101 Bytes

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!nwerden vorangestellt nzu sund fügt hinzu , eine 's'bis zum Ende , wenn n /= 1.

f xführt die Formatierung nach der Verwendung durch divMod.

Da wir eine maximale Eingabe von annehmen können 240, take 3reicht es aus, nur die Zahl zu nehmen.

(Musste wirklich hart versuchen, um @Craig Roys Punktzahl zu schlagen ...)

Schauspielerclavilis
quelle
2

R 112 Bytes

Bearbeiten : Ein Scoping-Fehler wurde behoben und das Problem mit der Angebotsausgabe behoben.

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

Testfälle

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

Ich habe versucht, Platz zu sparen, indem ich versucht habe, einen Weg zu finden, um "s" nach Bedarf zu addieren oder zu subtrahieren, aber ich musste mich mit dem sep =Argument in der paste()Funktion herumschlagen, und es schien nicht wirklich so, als würde es mir sehr viel Platz sparen. Irgendwelche Vorschläge?

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

Durch Abrunden mit Eingabe / 60 oder Eingabe %% 60 (mod) werden die Stunden bzw. Minuten angegeben. Verketten Sie sie mit einer ifelse()Anweisung, die angibt, ob die Einheiten Stunde (n) oder Minute (n) sind.

syntonicC
quelle
Die Ausgabe sollte nicht in Anführungszeichen eingeschlossen werden.
Vasu Adari
@ Vasu Adari Problem mit der cat()Funktion behoben .
syntonicC
1
Sie können Bytes sparen, indem Sie den Plural mit nur behandeln s und Ihre Bedingungen ändern.
Vasu Adari
1

Ruby, 97 100 99 88 Bytes

Bearbeiten: Ausgabe fixieren.

Bearbeiten: Entfernen von geschweiften Klammern aus divmod.

Edit: Yay String Interpolation! Vielen Dank an Vasu Adari . Auch besseres 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
Sherlock9
quelle
o / p sollte nicht in Anführungszeichen gesetzt werden.
Vasu Adari
@ VasuAdari Behoben
Sherlock9
Sie können die Klammern für die divmodMethode verlieren . Durch die Verwendung der String-Interpolation können Sie auch einige Bytes sparen.
Vasu Adari
@ VasuAdari Mir ist bewusst, dass die String-Iterpolation eine Sache ist, aber ich bin nicht sicher, was es ist oder wie es funktioniert. Vielen Dank für die Hilfe
Sherlock9
@ VasuAdari Oop, warte. Google hat mir beigebracht, was ich wissen muss. Lass mich bearbeiten.
Sherlock9
1

Los, 177 Bytes

(Es enthält nur die Funktion und die Importanweisungen)

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

Hübsche Lösung -

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

Testen Sie es -

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
*/
Kamehameha
quelle
1

Mathematica, 61 Bytes

Print@ToString[Quantity@#~UnitConvert~MixedRadix["h","min"]]&
LegionMammal978
quelle
1

AutoHotkey , 174 170 160 Bytes

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:=""

Anmerkungen:

  1. Eingabe aus der Zwischenablage
  2. Die Ausgabe erfolgt in ein beliebiges Formular durch Drücken von x
  3. Behandelt Pluralformen richtig
  4. Könnte kleiner sein, aber ich wollte einen One Liner zur Verfügung stellen.
errorseven
quelle
1

PHP, 77 76 Bytes

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

schrecklich, schrecklich, schrecklich!
PHP gibt nur ein paar Notices für aus"s"[$h<2]

Zum Ausführen: php -r 'CODE' '150 minutes'
und natürlich die Fehlerberichterstattung aus / von stdout entfernen!

Edit: -1Byte zuweisen in zuordnen (credit: insertusernamehere)

Es ist so hässlich, dass ich Linux-Benutzern einen Run-Helfer geben muss:

php -c /usr/share/php5/php.ini-production.cli -r 'CODE' '61 min'
CSᵠ
quelle
1 Byte weniger: $m=($i=$argv[1])%60;echo$h=$i/60|0," hour","s"[$h<2]," $m minute","s"[$m<2];.
Insertusernamehere
@insertusernamehere nett, danke! verrückt
CSᵠ
Bitte. Auch 4 Bytes weniger (war zu müde , um Ankündigung gestern): $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
insertusernamehere
@insertusernamehere das ist eine wirklich böse alte, aber ich kann nicht glauben, dass es für PHP 5.6-7 und nicht für 5.3-5.5 funktioniert
CSᵠ
Ich habe es mit PHP 5.6.10 (OS X) getestet und es funktioniert hier. :)
insertusernamehere
1

Arcyóu (nicht konkurrierend), 93 Bytes

Diese Einreichung verwendet eine Version der Sprache, die nach dieser Herausforderung erstellt wurde.

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

Yeesh! Diese Sprache benötigt eine bessere String-Manipulation.

Erläuterung:

(: 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
bkul
quelle
1

Ruby, 74 73 71 Bytes

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

73 Bytes

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

74 Bytes:

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

Verwendung:

->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
Vasu Adari
quelle
1

Kotlin, 132 Bytes

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 Version:

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

Teste es mit:

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

Beispielausgaben:

2 hours 30 minutes
1 hour 30 minutes
1 hour 1 minute
1 hour 0 minutes
Succubbus
quelle
1
Willkommen bei PPCG.SE! Ich habe Ihren Beitrag bearbeitet, damit er ästhetisch ansprechender aussieht. Habe Spaß!
GamrCorps
1

Im Ernst , 77 Bytes

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

Ernst ist ernsthaft nicht gut bei der Manipulation von Saiten. Probieren Sie es online mit vollständiger Erklärung aus (Sie müssen die Eingabe wie folgt manuell eingeben, "210 mins"da Permalinks keine Anführungszeichen mögen).

Schnelle und schmutzige Erklärung:

ε" 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)"
Mego
quelle
Dein Link funktioniert nicht
TanMath
1

Java 8, 148 Bytes

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

Ich habe mich für eine Alternative zu @TheAustralianBirdEatingLouse entschieden, da diese nicht nur um ein Vielfaches (~ 10%) kürzer ist, sondern auch korrekter in Stunden und Minuten statt abgekürzter Stunden und Minuten gedruckt wird. Methodenimplementierungen in Interfaces sind neu in Java 8 - daher wird dies zum Kompilieren / Ausführen benötigt

janschweizer
quelle