Durée du film dans un format lisible par l'homme

24

Chaque fois que je recherche la durée d'un film dans IMDb, elle s'affiche en minutes. Immédiatement, j'essaierais de le convertir en heure (s) et minute (s). Ce serait mieux si nous pouvions automatiser cela.

Contribution:

150 min

Sortie:

2 hours 30 minutes

Contribution:

90 min

Sortie:

1 hour 30 minutes

Contribution:

61 min

Sortie:

1 hour 1 minute

Contribution:

60 min

Sortie:

1 hour 0 minute or 1 hour 0 minutes

Voici les conditions:

  1. L'entrée et la sortie doivent être dans ce format exact.

  2. Les minutes d'entrée seront comprises entre 0 et 240.

  3. Votre réponse peut accepter des arguments de ligne de commande ou lire les entrées de l'utilisateur ou d'une fonction.

  4. La sortie ne doit pas être placée entre guillemets.

  5. La sortie doit être imprimée et non retournée.

Classement:

Résultat:

C'est un lien entre CJam et Pyth. Accepter la réponse de CJam telle qu'elle a été soumise avant le code de 35 octets de Pyth. Cependant, veuillez continuer d'encourager de nouvelles soumissions.

Vasu Adari
la source
2
@quintopia Selon les règles du site , non. Vous pouvez utiliser une fonction si vous le souhaitez.
Poignée de porte
1
Techniquement, je (et je parie que d'autres humains) peuvent lire "150 minutes".
PyRulez
1
Pourquoi limiter à> 59 minutes? De plus, je préfère 61 minutes à 1 heure 1 minute et je détesterais vraiment voir 1 heure 0 minutes
markshancock
6
Vous avez modifié la plage d'entrée pour qu'elle soit de 0 à 240, mais vous n'avez inclus aucun scénario de test inférieur à 60. Je recommande de respecter la plage d'origine, étant donné que 28 réponses ont déjà été publiées.
Alex A.
2
Il semble que vous ayez également modifié la sortie acceptable pour des heures entières. À moins qu'un défi n'ait des problèmes évidents qui doivent être corrigés, veuillez ne pas apporter de modifications à un défi qui invalide les réponses existantes.
Alex A.

Réponses:

10

CJam, 39 35 octets

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

Essayez-le en ligne

La dernière version inclut des améliorations suggérées par @ MartinBüttner, en particulier en utilisant l'opérateur vectoriel par élément au lieu de transposer les deux listes.

Explication:

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
la source
1
35: ri60md]r"utehour"+6/W%.{1$1>'s*+}S*(On dirait que cela vous donne une avance assez solide sur ce défi :))
Martin Ender
@ MartinBüttner r"utehour"+6/W%est en fait de la même longueur que "hour minute"S/, de sorte qu'une partie finit par ne pas aider. Je pense que je l'avais déjà vu .utilisé avec un bloc, mais j'avais encore oublié qu'il était supporté.
Reto Koradi
Ah, à droite, j'avais d'abord publié une version de 36 octets où cela a réellement aidé (mais ensuite supprimé le commentaire et remplacé par la version de 35 octets où cela n'a plus d'importance).
Martin Ender
19

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

Je n'aime pas revenir au %formatage de chaînes de style, mais cela économise 6 octets .format.

Modifier: J'ai oublié d'analyser la saisie.

Edit: oublié de gérer les pluriels.

Edit: Yay lambdas!

Edit: Ajout d'ungolfing

Edit: Darn it. Lambdas n'a pas aidé.

Edit: Étant donné que les minutes ont un maximum de trois chiffres et int()ne dérange pas les espaces dans la chaîne, je peux enregistrer quelques octets en utilisant input()[:3].

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

Non golfé:

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
la source
22
Ah! Augmentation du bytecount! +1 pour ne pas abandonner ;-)
agtoever
9

JavaScript, 78 octets

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>

Pour la suite de tests, saisissez input comme "61 min"dans la zone de saisie.


Explication

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
la source
Bon. Suggestion: réduire parseInt(n)à +n.
nicael
1
L'entrée ne sera pas seulement un entier. Il échoue lorsque je fournis une entrée en tant que 150 min.
Vasu Adari
1
@VasuAdari Cela fonctionne pour moi, les sorties 2 hours 30 minutes. Puis-je vous demander comment vous l'avez testé?
jrich
3
@ ev3commander Lorsque vous utilisez l'extrait de test, encapsulez l'entrée entre guillemets afin qu'elle soit reconnue comme une chaîne. par exemple "61 min"ou'61 min'
jrich
1
+1 Pour JavaScript. Il ne vous reste plus qu'à en faire un bookmarlet ;)
MayorMonty
6

Pyth, 39 38 octets

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

Vitsy , 57 54 52 octets

Oh, wow, je n'ai même pas d'entiers dans ma langue. 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.

Essayez-le en ligne!

Addison Crump
la source
4

K5, 55 51 octets

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

C'est plus général qu'il ne doit être strictement; pourrait encore jouer au golf.

En action:

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

Modifier:

Ce programme a traversé plusieurs itérations très différentes au cours du développement, et j'ai pensé qu'il pourrait être plus éclairant de montrer certaines des étapes intermédiaires.

Voici ma première tentative de résoudre le problème, avant l'introduction de l'exigence de pluralisation. Il y a ici une répétition claire:

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

J'ai réalisé que la manière générale de gérer la sortie des lieux était la forme de «décodage» de K5. Pour insérer des valeurs dans la chaîne, j'ai utilisé la primitive "dot-apply", qui applique une liste d'arguments à une fonction et décompresse la liste en paramètres individuels:

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

Pas beaucoup de redondance ici. Lorsque la pluralisation a été ajoutée, j'ai décomposé cette fonction anonyme principale en une transformation que je pouvais appliquer à chaque nombre, comme ceci:

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

Inscrivez - vous x, yet non sou rien, selon quex est égal à « 1 ». En fin de compte, cela a mieux fonctionné pour inverser l'ordre des arguments de cette fonction.

Modifier 2:

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

Plusieurs petites améliorations ici. Une meilleure façon de sélectionner un "s" ou une chaîne vide, une constante plus courte pour "décoder" qui reflète la plage d'entrée limitée, et une manière plus simple de supprimer "min".

JohnE
la source
4

Pyth, 46 octets

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

Prend l'entrée comme x min et les sortiesx hours y minutes

Essayez-le ici

Explication:

   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
Bleu
la source
3

Perl 6 , 80 73 octets

80 octets d'origine

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

Usage:

.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

En raison d'un changement dans la question, je peux supprimer x?$mla fin de la fonction, ce qui me permet de la réduire de 3 octets supplémentaires.

{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
la source
3

JavaScript (ES6), 100 94 89 81 octets

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

Démo dé-golfée (convertie en ES5, car tous les navigateurs ne prennent pas encore en charge ES6)

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
la source
Vous pouvez envelopper t=parseInt(t)et entre parenthèses, puis mettre que là où jamais vous utilisez d' abord tsi: (h=0|(t=parseInt(t))/60). De cette façon, vous pouvez supprimer le retour et le{}
Downgoat
@Downgoat J'ai déjà essayé mais cela n'a pas fonctionné pour une raison quelconque. Je vais réessayer.
nicael
1
@Downgoat Apparemment, j'ai fait une erreur auparavant, maintenant cela fonctionne correctement. Merci :)
nicael
UTILISEZ DES CORDES DE MODÈLE. $ {} !!!
Mama Fun Roll
3

C #, 127 octets

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

Cela peut être placé dans un fichier et exécuté via le shell interactif C # fourni avec Mono, en utilisant la configuration par défaut.

[C'est ma première tentative de golf de code. J'espère que ma contribution ne viole aucune règle.]

Hilbert
la source
3

C, 89 octets

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

Rubis, 75 octets

a,b=gets.to_i.divmod 60;$><<"#{a} hour#{a>1??s:''} #{b} minute#{b>1??s:''}"
Peter Lenkefi
la source
Parfois, même une chaîne vide est trop longue. ''p.
manatwork
2

MATLAB, 111 108 106 octets

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

Cela fonctionne également avec Octave et peut être essayé ici . Le lien est vers un espace de travail contenant déjà le code dans un fichier nommé runningLength.m. Donc, pour le tester, entrez simplement runningLengthà l'invite, puis entrez la chaîne d'entrée, par exemple, '123 mins'et il affichera la sortie.

Prend l'entrée comme une chaîne, par exemple '123 mins', la convertit en un nombre (qui ignore implicitement le minsbit).

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

Les minutes et les heures sont ensuite calculées

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

Affiche ensuite la chaîne de sortie

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

Le bit 's' de la sortie est calculé et géré correctement - un 's' est ajouté chaque fois que le nombre n'est pas 1.

Tom Carpenter
la source
2

Python 2, 96 octets

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
la source
7
Cela ne semble pas gérer correctement les pluriels.
Poignée de porte
@ Doorknob C'est ce qui se passe lorsque les règles sont modifiées après la publication des réponses :)
quintopie
2

Haskell, 117 109 octets

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

Version moins golfée:

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

fest une fonction qui prend les 3 premiers caractères de son entrée et les convertit en entier. p#qest une fonction qui pluralise qsi pn'est pas égal à 1. Afin de retourner le résultat sans guillemets, j'ai utilisé putStrpour imprimer le résultat dans STDOUT.

Merci à nimi pour l'aide!

Craig Roy
la source
2

Python 2, 79 77 octets

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

Les 3 premiers caractères de l'entrée sont simplement analysés comme un entier. Cela ne fonctionne que parce que le troisième caractère d'une entrée à 2 chiffres est un espace, qui intsera ignoré lors de la conversion.

xsot
la source
Je pense que vous pouvez le faire "hour"+m/120*"s"et de même pendant quelques minutes.
xnor
Cela échouera pour m=240, malheureusement.
2015 à 6h59
2

LabVIEW, 50 octets

Ceci est compté selon ma suggestion sur Meta .

Le code est assez simple, prenez le nombre de Modulo d'entrée par 60 et ajoutez un s pour les minutes! = 1. L'autre côté du boîtier met simplement la chaîne à travers.

enter image description here

Eumel
la source
2

Scala, 135 octets

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

Usage:

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

Haskell, 107 101 octets

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

Non golfé:

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!najoute nà s, en ajoutant un 's'à la fin si n /= 1.

f xfait le formatage après utilisation divMod.

Puisque nous pouvons supposer qu'une entrée max de 240, take 3est suffisante pour ne prendre que le nombre.

(J'ai dû vraiment essayer de battre le score de @Craig Roy ...)

Actorclavilis
la source
2

R, 112 octets

Modifier : correction d'une erreur de portée, puis résolution du problème de sortie du devis.

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

Cas de test

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

J'ai essayé d'économiser de l'espace en essayant de trouver un moyen d'ajouter ou de soustraire "s" si nécessaire, mais j'ai dû jouer avec l' sep =argument dans la paste()fonction et il ne semblait pas vraiment que cela allait me faire économiser beaucoup d'espace. Aucune suggestion?

Non golfé

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

L'arrondi vers le bas avec input / 60 ou input %% 60 (mod) donne respectivement les heures et les minutes. Enchaînez-les ensemble avec une ifelse()déclaration qui spécifie si les unités sont ou non des heures ou des minutes.

syntonicC
la source
La sortie ne doit pas être placée entre guillemets.
Vasu Adari
@Vasu Adari Corrigé en utilisant la cat()fonction.
syntonicC
1
Vous pouvez économiser des octets en gérant le pluriel avec juste s et en changeant vos conditions.
Vasu Adari
1

Ruby, 97 100 99 88 octets

Edit: Correction de la sortie.

Modifier: supprimer les accolades de divmod.

Edit: interpolation de chaîne Yay! Merci à Vasu Adari . Aussi, il vaut mieux ne pas jouer au golf.

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

Non golfé:

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
la source
o / p ne doit pas être placé entre guillemets.
Vasu Adari
@VasuAdari Fixed
Sherlock9
Vous pouvez perdre les accolades pour la divmodméthode. De plus, en utilisant l'interpolation de chaînes, vous pouvez économiser quelques octets.
Vasu Adari
@VasuAdari Je suis conscient que l'itération de la chaîne est une chose, mais je ne sais pas ce que c'est ni comment cela fonctionne. Merci pour l'aide
Sherlock9
@VasuAdari Oop, attendez. Google m'a appris ce que je dois savoir. Permettez-moi de retoucher.
Sherlock9
1

Aller, 177 octets

(Il comprend uniquement la fonction et les instructions d'importation)

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

Jolie solution -

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

Le tester -

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
la source
1

Mathematica, 61 octets

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

AutoHotkey , 174 170 160 octets

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

Remarques:

  1. Entrée depuis le presse-papiers
  2. Imprimez des impressions vers n'importe quel formulaire en appuyant sur x
  3. Gère correctement les pluriels
  4. Pourrait être plus petit mais je voulais un fournir un One Liner.
errorseven
la source
1

PHP, 77 76 octets

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

horible, horible, horible!
PHP émet seulement quelques Notices pour"s"[$h<2]

Pour exécuter: php -r 'CODE' '150 minutes'
et bien sûr, désactivez / désactivez le rapport d'erreurs de stdout!

Edit: -1 octet assign in assign (crédit: insertusernamehere here)

C'est tellement moche que je dois donner une aide à l'exécution pour les utilisateurs de Linux:

php -c /usr/share/php5/php.ini-production.cli -r 'CODE' '61 min'
CSᵠ
la source
1 octet moins: $m=($i=$argv[1])%60;echo$h=$i/60|0," hour","s"[$h<2]," $m minute","s"[$m<2];.
insertusernamehere
@insertusernamehere nice, merci! fou
CSᵠ
De rien. Même 4 octets moins (était trop fatigué pour avis hier): $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
insertusernamehere
@insertusernamehere c'est un ancien vraiment méchant, mais je ne peux pas croire qu'il fonctionne pour php 5.6-7 et pas pour 5.3-5.5
CSᵠ
Je l'ai testé avec PHP 5.6.10 (OS X) et cela fonctionne ici. :)
insertusernamehere
1

Arcyóu (non compétitif), 93 octets

Cette soumission utilise une version du langage qui a été créée après ce défi.

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

Yeesh! Ce langage nécessite une meilleure manipulation des chaînes.

Explication:

(: 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
la source
1

Rubis, 74 73 71 octets

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

73 octets

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

74 octets:

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

Usage:

->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
la source
1

Kotlin, 132 octets

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

Version non golfée:

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

Testez-le avec:

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

Exemples de sorties:

2 hours 30 minutes
1 hour 30 minutes
1 hour 1 minute
1 hour 0 minutes
succcubbus
la source
1
Bienvenue sur PPCG.SE! J'ai édité votre article pour qu'il soit plus esthétique. S'amuser!
GamrCorps
1

Sérieusement , 77 octets

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

Sérieusement n'est vraiment pas bon à la manipulation de cordes. Essayez-le en ligne avec une explication complète (vous devrez saisir manuellement l'entrée comme"210 mins" parce que les permaliens n'aiment pas les guillemets).

Explication rapide et sale:

ε" 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
la source
Votre lien ne fonctionne pas
TanMath
1

Java 8, 148 octets

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

J'ai choisi de publier une alternative à @TheAustralianBirdEatingLouse car elle est non seulement plus courte de beaucoup (~ 10%), mais aussi plus correcte pour l'impression des heures et des minutes au lieu des heures et des minutes abrégées. Les implémentations de méthodes dans les interfaces sont nouvelles pour Java 8 - donc cela serait nécessaire pour compiler / exécuter

janschweizer
la source