Duración de la película en un formato legible para humanos

24

Cada vez que busco la duración de una película en IMDb, se muestra en minutos. Inmediatamente intentaría convertirlo en hora (s) y minuto (s). Sería mejor si pudiéramos automatizar esto.

Entrada:

150 min

Salida:

2 hours 30 minutes

Entrada:

90 min

Salida:

1 hour 30 minutes

Entrada:

61 min

Salida:

1 hour 1 minute

Entrada:

60 min

Salida:

1 hour 0 minute or 1 hour 0 minutes

Las siguientes son las condiciones:

  1. La entrada y la salida deben estar en este formato exacto.

  2. Los minutos de entrada serán entre 0 y 240.

  3. Su respuesta puede aceptar argumentos de la línea de comandos o leer la entrada del usuario o una función.

  4. La salida no debe estar entre comillas.

  5. La salida debe ser impresa, no devuelta.

Tabla de clasificación:

Resultado:

Es un empate entre CJam y Pyth. Aceptar la respuesta de CJam tal como se envió antes del código de 35 bytes de Pyth. Sin embargo, continúe fomentando nuevas presentaciones.

Vasu Adari
fuente
2
@quintopia De acuerdo con las reglas del sitio , no. Puede usar una función si lo desea.
Pomo de la puerta
1
Técnicamente, yo (y apuesto a que otros humanos) puedo leer "150 minutos".
PyRulez
1
¿Por qué restringir a> 59 minutos? Además, prefiero 61 minutos a 1 hora 1 minuto y realmente odiaría ver 1 hora 0 minutos
markshancock
66
Cambió el rango de entrada para que sea 0-240 pero no ha incluido ningún caso de prueba inferior a 60. Recomiendo seguir con el rango original dado que ya se han publicado 28 respuestas.
Alex A.
2
Parece que también cambiaste la salida aceptable para horas enteras. A menos que un desafío tenga problemas importantes que deben corregirse, no realice cambios en un desafío que invalide las respuestas existentes.
Alex A.

Respuestas:

10

CJam, 39 35 bytes

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

Pruébalo en línea

La última versión incluye mejoras sugeridas por @ MartinBüttner, particularmente usando el operador de vector de elementos en lugar de transponer las dos listas.

Explicación:

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
fuente
1
35: ri60md]r"utehour"+6/W%.{1$1>'s*+}S*(Parece que esto te da una ventaja bastante sólida en este desafío :))
Martin Ender
@ MartinBüttner r"utehour"+6/W%es en realidad la misma longitud que "hour minute"S/, por lo que esa parte termina no ayudando. Creo que lo había visto .antes con un bloque, pero había olvidado nuevamente que era compatible.
Reto Koradi
Ah, claro, primero publiqué una versión de 36 bytes donde realmente ayudó (pero luego eliminé el comentario y lo reemplacé por la versión de 35 bytes donde ya no importa).
Martin Ender
19

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

No me gusta volver al %formato de cadena de estilo, pero ahorra 6 bytes .format.

Editar: Olvidé analizar la entrada.

Editar: Olvidé manejar plurales.

Editar: Yay lambdas!

Editar: Se agregó ungolfing

Editar: Maldita sea. Lambdas no ayudó.

Editar: como los minutos tienen un máximo de tres dígitos y int()no le importan los espacios en la cadena, puedo guardar algunos bytes al usarlos input()[:3].

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

Sin 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
fuente
22
Ah! ¡Aumento del recuento! +1 por no rendirse ;-)
hasta el
9

JavaScript, 78 bytes

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>

Para el conjunto de pruebas, ingrese la entrada como "61 min"en el cuadro de entrada.


Explicación

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
fuente
Bueno Sugerencia: reducir parseInt(n)a +n.
nicael
1
La entrada no será solo un número entero. Falla cuando proporciono entrada como 150 min.
Vasu Adari
1
@VasuAdari Está funcionando para mí, salidas 2 hours 30 minutes. ¿Puedo preguntar cómo lo probó?
2015
3
@ ev3commander Cuando utilice el fragmento de prueba, ajuste la entrada entre comillas para que se reconozca como una cadena. por ejemplo, "61 min"o'61 min'
jrich
1
+1 para JavaScript. Ahora solo tiene que convertirlo en un bookmarlet ;)
MayorMonty
6

Pyth, 39 38 bytes

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

Vitsy , 57 54 52 bytes

Oh, wow, ni siquiera tengo enteros en mi idioma. 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.

Pruébalo en línea!

Addison Crump
fuente
4

K5, 55 51 bytes

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

Esto es más general de lo estrictamente necesario; todavía podría jugar más golf.

En acción:

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

Editar:

Este programa pasó por varias iteraciones muy diferentes en el curso del desarrollo, y pensé que podría ser más esclarecedor mostrar algunos de los pasos intermedios.

Aquí fue mi primera puñalada al problema, antes de que se introdujera el requisito de pluralización. Aquí hay una clara repetición:

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

Me di cuenta de que la forma general de manejar la expulsión de lugares era la forma de "decodificación" de K5. Para colocar los valores en su lugar en la cadena, utilicé la primitiva "aplicar punto", que aplica una lista de argumentos a una función y desempaqueta la lista en parámetros individuales:

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

No queda mucha redundancia aquí. Cuando se agregó la pluralización, descompuse esa función principal anónima en una transformación que podría aplicar a cada número, así:

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

Unir x, yy cualquiera so nada, dependiendo de si xes igual a "1". Finalmente funcionó mejor para revertir el orden de los argumentos de esta función.

Edición 2:

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

Varias pequeñas mejoras aquí. Una mejor manera de seleccionar una "s" o una cadena vacía, una constante más corta para "decodificar" que refleja el rango limitado de entrada y una forma más simple de descartar "min".

JohnE
fuente
4

Pyth, 46 bytes

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

Toma entradas como x miny salidasx hours y minutes

Pruébalo aquí

Explicación:

   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
Azul
fuente
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}

Uso:

.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

Debido a un cambio en la pregunta que puedo eliminar x?$mdel final de la función, lo que me permite reducirlo en 3 bytes más.

{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
fuente
3

JavaScript (ES6), 100 94 89 81 bytes

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

Demo sin golf (convertida a ES5, ya que no todos los navegadores admiten ES6 todavía)

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
fuente
Usted puede envolver t=parseInt(t)y el paréntesis, y luego poner donde quiera que se utiliza en primer lugar tpor lo que: (h=0|(t=parseInt(t))/60). De esta manera, puede eliminar el retorno y el{}
Downgoat
@Downgoat Ya lo intenté pero no funcionó por alguna razón. Lo intentare de nuevo.
nicael
1
@Downgoat Aparentemente cometí un error anteriormente, ahora funciona correctamente. Gracias :)
nicael
UTILICE CUERDAS DE PLANTILLA. PS
Mama Fun Roll
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":""));

Esto se puede poner en un archivo y ejecutar a través del shell interactivo C # que viene con Mono, usando la configuración predeterminada.

[Este es mi primer intento de golf de código. Espero que mi contribución no viole ninguna regla.]

Hilbert
fuente
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
fuente
3

Ruby, 75 bytes

a,b=gets.to_i.divmod 60;$><<"#{a} hour#{a>1??s:''} #{b} minute#{b>1??s:''}"
Peter Lenkefi
fuente
A veces, incluso una cadena vacía es demasiado larga. ''p.
manatwork
2

MATLAB, 111108106 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))

Esto también funciona con Octave , y puede probarse aquí . El enlace es a un espacio de trabajo que ya contiene el código en un archivo llamado runningLength.m. Entonces, para probarlo, simplemente ingrese runningLengthen el indicador, luego ingrese la cadena de entrada, por ejemplo, '123 mins'y mostrará la salida.

Toma la entrada como una cadena, por ejemplo '123 mins', la convierte en un número (que ignora implícitamente el minsbit).

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

Se calculan minutos y horas.

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

Luego muestra la cadena de salida

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

El bit 's' de la salida se calcula y maneja correctamente: se agrega una 's' cuando el número no es 1.

Tom Carpenter
fuente
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))
quintapia
fuente
77
Esto no parece manejar correctamente los plurales.
Pomo de la puerta
@Doorknob Esto es lo que sucede cuando las reglas cambian después de que se publican las respuestas :)
quintopia
2

Haskell, 117109 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"]

Versión menos golfizada:

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

fes una función que toma los primeros 3 caracteres de su entrada y los convierte en un entero. p#qes una función que pluraliza qsi pno es igual a 1. Para devolver el resultado sin las comillas, solía putStrimprimir el resultado en STDOUT.

Gracias a nimi por la ayuda!

Craig Roy
fuente
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]

Los primeros 3 caracteres de la entrada simplemente se analizan como un entero. Esto solo funciona porque el tercer carácter en una entrada de 2 dígitos es un espacio, que intse ignorará durante la conversión.

xsot
fuente
Creo que puedes hacer lo "hour"+m/120*"s"mismo y por minutos.
xnor
Fracasará por m=240desgracia.
xsot
2

LabVIEW, 50 Bytes

Esto se cuenta según mi sugerencia sobre Meta .

¡El código es bastante sencillo, tome el número de la entrada Módulo por 60 y agregue una s por minutos! = 1. El otro lado de la caja simplemente pasa la cadena.

ingrese la descripción de la imagen aquí

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

Uso:

a("120 min")
2 hours 0 minute
Vasu Adari
fuente
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

Sin 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!nantepone na s, la adición de una 's'al final si n /= 1.

f xrealiza el formateo después de usar divMod.

Como podemos suponer una entrada máxima de 240, take 3es suficiente para tomar solo el número.

(Tuve que esforzarme mucho para superar la puntuación de @Craig Roy ...)

Actorclavilis
fuente
2

R, 112 bytes

Editar : se corrigió un error de alcance y luego se solucionó el problema de salida de la cita.

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

Casos de prueba

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

Traté de ahorrar espacio tratando de encontrar una manera de sumar o restar "s" según fuera necesario, pero tuve que meterme con el sep =argumento en la paste()función y realmente no parecía que me iba a ahorrar mucho espacio. ¿Alguna sugerencia?

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

Redondeando con input / 60 o input %% 60 (mod) da las horas y minutos respectivamente. Encadénelos con una ifelse()declaración que especifique si las unidades son o no hora (s) o minuto (s).

SyntonicC
fuente
La salida no debe estar entre comillas.
Vasu Adari
@Vasu Adari Lo arregló usando la cat()función.
SyntonicC
1
Puede guardar bytes manejando plural con just s y cambiando sus condiciones.
Vasu Adari
1

Ruby, 97 100 99 88 bytes

Editar: Fijación de salida.

Editar: Eliminar llaves de divmod.

Editar: Yay cadena de interpolación! Gracias a Vasu Adari . Además, mejor no golfista.

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

Sin 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
fuente
o / p no debe incluirse entre comillas.
Vasu Adari
@VasuAdari Corregido
Sherlock9
Puede perder las llaves por divmodmétodo. Además, al usar la interpolación de cadenas puede ahorrar algunos bytes.
Vasu Adari
@VasuAdari Soy consciente de que la cadena de comunicación es una cosa, pero no estoy seguro de qué es o cómo funciona. Gracias por la ayuda
Sherlock9
@VasuAdari Oop, espera. Google me ha enseñado lo que necesito saber. Déjame empezar a editar.
Sherlock9
1

Ir, 177 bytes

(Incluye solo la función y las declaraciones de importación)

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

Bonita solución

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

Probándolo

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
fuente
1

Mathematica, 61 bytes

Print@ToString[Quantity@#~UnitConvert~MixedRadix["h","min"]]&
LegionMammal978
fuente
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:=""

Notas:

  1. Entrada desde el portapapeles
  2. Imprima impresiones en cualquier forma presionando x
  3. Maneja correctamente los plurales
  4. Podría ser más pequeño pero quería proporcionar un One Liner.
error incluso
fuente
1

PHP, 77 76 bytes

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

horrible, horrible, horrible!
PHP solo emite un par de Notices para"s"[$h<2]

Para ejecutar: php -r 'CODE' '150 minutes'
y, por supuesto, apague / aleje el informe de errores de stdout.

Editar: -1byte asignar en asignar (crédito: insertusernamehere)

Es tan feo que debo dar un asistente de ejecución para usuarios de Linux:

php -c /usr/share/php5/php.ini-production.cli -r 'CODE' '61 min'
CSᵠ
fuente
1 byte menos: $m=($i=$argv[1])%60;echo$h=$i/60|0," hour","s"[$h<2]," $m minute","s"[$m<2];.
insertusernamehere
@insertusernamehere agradable, gracias! loco
CSᵠ
De nada. Incluso los 4 bytes menor (estaba demasiado cansado para notificación ayer): $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
insertusernamehere
@insertusernamehere que es una muy desagradable, pero no puedo creer que funcione para php 5.6-7 y no para 5.3-5.5
CSᵠ
Lo probé con PHP 5.6.10 (OS X) y funciona aquí. :)
insertusernamehere
1

Arcyóu (no competitivo), 93 bytes

Este envío utiliza una versión del idioma que se creó después de este desafío.

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

Yeesh! Este lenguaje necesita una mejor manipulación de cadenas.

Explicación:

(: 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
fuente
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:''}"}

Uso:

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

Versión sin golf:

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

Pruébalo con:

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

Salidas de ejemplo:

2 hours 30 minutes
1 hour 30 minutes
1 hour 1 minute
1 hour 0 minutes
succcubbus
fuente
1
Bienvenido a PPCG.SE! He editado tu publicación para que parezca más estéticamente agradable. ¡Que te diviertas!
GamrCorps
1

En serio , 77 bytes

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

En serio es serio no es bueno en la manipulación de cadenas. Pruébelo en línea con una explicación completa (deberá ingresar manualmente la entrada como "210 mins"porque los enlaces permanentes no les gustan las comillas).

Explicación rápida y sucia:

ε" 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
fuente
Su enlace no funciona
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":"");}}

Elegí publicar una alternativa a @TheAustralianBirdEatingLouse ya que esto no solo es más corto por un buen precio (~ 10%) sino que también es más correcto en la impresión de hora (s) y minutos (s) en lugar de horas y minutos abreviados. Las implementaciones de métodos en Interfaces son nuevas en Java 8, por lo que esto sería necesario para compilar / ejecutar

janschweizer
fuente