Duração do filme em um formato legível por humanos


24

Sempre que procuro a duração de um filme no IMDb, ele é exibido em minutos. Imediatamente eu tentaria convertê-lo em hora (s) e minuto (s). Seria melhor se pudéssemos automatizar isso.

Entrada:

150 min

Saída:

2 hours 30 minutes

Entrada:

90 min

Saída:

1 hour 30 minutes

Entrada:

61 min

Saída:

1 hour 1 minute

Entrada:

60 min

Saída:

1 hour 0 minute or 1 hour 0 minutes

A seguir estão as condições:

  1. A entrada e a saída devem estar neste formato exato.

  2. Os minutos de entrada ficarão entre 0 e 240.

  3. Sua resposta pode aceitar argumentos de linha de comando ou ler entradas do usuário ou de uma função.

  4. A saída não deve ser colocada entre aspas.

  5. A saída deve ser impressa, não retornada.

Entre os melhores:

Resultado:

É um empate entre CJam e Pyth. Aceitando a resposta de CJam como ela foi enviada antes do código de 35 bytes de Pyth. No entanto, continue incentivando novos envios.


2
@quintopia De acordo com as regras do site , não. Você pode usar uma função se quiser.
— Maçaneta

11
Tecnicamente, eu (e aposto que outros humanos) podem ler "150 minutos".
— PyRulez

11
Por que restringir a> 59 minutos? Além disso, eu prefiro 61 minutos a 1 hora 1 minuto e realmente odiaria ver 1 hora 0 minutos
— markshancock

6
Você alterou o intervalo de entrada para 0-240, mas não incluiu nenhum caso de teste menor que 60. Recomendo manter o intervalo original, pois 28 respostas já foram postadas.
— Alex A.

2
Parece que você também alterou a saída aceitável por horas inteiras. A menos que um desafio tenha problemas flagrantes que precisam ser corrigidos, não faça alterações em um desafio que invalide as respostas existentes.
— Alex A.

Respostas:


10

CJam, 39 35 bytes

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

Experimente online

A versão mais recente inclui melhorias sugeridas por @ MartinBüttner, particularmente usando o operador de vetor por elementos em vez de transpor as duas listas.

Explicação:

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.

11
35: ri60md]r"utehour"+6/W%.{1$1>'s*+}S*(parece que isso lhe dá uma vantagem sólida bonita neste desafio :))
— Martin Ender

@ MartinBüttner r"utehour"+6/W%é na verdade o mesmo comprimento que "hour minute"S/, então essa parte acaba não ajudando. Acho que já tinha .usado com um bloco antes, mas tinha esquecido novamente que ele era suportado.
— Reto Koradi

Ah, certo, eu publiquei uma versão de 36 bytes na qual ela realmente ajudou (mas excluí o comentário e o substitui pela versão de 35 bytes, onde não importa mais).
— Martin Ender

19

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

Não gosto de voltar para a %formatação de string no estilo, mas economiza 6 bytes .format.

Editar: Esqueceu de analisar a entrada.

Edit: Esqueceu-se de lidar com plurais.

Edit: Yay lambdas!

Edit: Adicionado ungolfing

Edit: Maldito seja. Lambdas não ajudou.

Editar: Como os minutos têm no máximo três dígitos e int()não se importam com os espaços na sequência, posso salvar alguns bytes usando 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! Aumentando o número de contas! +1 por não desistir ;-) #
— agtoever 28/11

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 o conjunto de testes, insira entrada como "61 min"na caixa de entrada.


Explicação

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

Um bom. Sugestão: reduza parseInt(n)para +n.
— Nicael 28/11

11
A entrada não será apenas um número inteiro. Falha quando eu forneço entrada como 150 min.
— Vasu Adari 28/11

11
@VasuAdari Está funcionando para mim, saídas 2 hours 30 minutes. Posso perguntar como você o testou?
— jrich

3
@ ev3commander Ao usar o snippet de teste, coloque a entrada entre aspas para que seja reconhecida como uma string. por exemplo, "61 min"ou'61 min'
— jrich 28/11/2015

11
+1 para JavaScript. Agora você só precisa torná-lo um bookmarlet ;) #
— MayorMonty

6

Pitão, 39 38 bytes

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

5

Vitsy , 57 54 52 bytes

Oh, uau, eu nem tenho números inteiros no meu 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.

Experimente online!


4

K5, 55 51 bytes

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

Isso é mais geral do que estritamente tem que ser; ainda pode melhorar ainda mais.

Em ação:

  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:

Esse programa passou por várias iterações muito diferentes no decorrer do desenvolvimento, e eu pensei que poderia ser mais esclarecedor mostrar algumas das etapas intermediárias.

Aqui foi minha primeira facada no problema, antes que o requisito de pluralização fosse introduzido. Há clara repetição aqui:

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

Percebi que a maneira geral de lidar com a exclusão de lugares era a forma de "decodificação" do K5. Para colocar os valores no lugar da string, usei a primitiva "dot-apply", que aplica uma lista de argumentos a uma função e descompacta a lista em parâmetros individuais:

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

Não resta muita redundância aqui. Quando a pluralização foi adicionada, decomponho essa função anônima principal em uma transformação que eu poderia aplicar a cada número, assim:

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

Junte x, ye quer sou nada, dependendo sex é igual a "1". Por fim, funcionou melhor para reverter a ordem dos argumentos para essa função.

Edição 2:

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

Várias pequenas melhorias aqui. Uma maneira melhor de selecionar um "s" ou uma sequência vazia, uma constante mais curta para "decodificar", que reflete a faixa limitada de entrada, e uma maneira mais simples de descartar "min".


4

Pitão, 46 ​​bytes

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

Recebe entradas x mine saídasx hours y minutes

Experimente aqui

Explicação:

   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 bytes

Original de 80 bytes

{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

Devido a uma alteração na pergunta, posso remover x?$mdo final da função, o que me permite reduzi-la em mais 3 bytes.

{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 bytes

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

Demonstração descodificada (convertida para ES5, pois nem todos os navegadores ainda suportam 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()))


Você poderia envolver t=parseInt(t)e parênteses, e depois colocar que onde quer que você use primeiro tmodo: (h=0|(t=parseInt(t))/60). Dessa forma, você pode remover o retorno e o{}
— Downgoat 28/11

@ Downgoat Eu já tentei, mas não funcionou por algum motivo. Tentará novamente.
— Nicael 28/11

11
@Downgoat Aparentemente, eu cometi um erro anteriormente, agora funciona corretamente. Obrigado :)
— nicael

USE CORDAS DE MODELO. $ {} !!!
— 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":""));

Isso pode ser colocado em um arquivo e executado através do shell interativo C # que acompanha o Mono, usando a configuração padrão.

[Esta é minha primeira tentativa de código de golfe. Espero que minha contribuição não esteja violando nenhuma regra.]


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

3

Ruby, 75 bytes

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

Às vezes, até uma string vazia é muito longa. ''→ p.
— Manatwork

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

Isso também funciona com o Octave e pode ser tentado aqui . O link é para um espaço de trabalho que já contém o código em um arquivo chamado runningLength.m. Portanto, para testá-lo, basta digitar runningLengthno prompt e digite a sequência de entrada, por exemplo'123 mins' e ela exibirá a saída.

Pega a entrada como uma string, por exemplo '123 mins', converte-a em um número (que ignora implicitamente o minsbit).

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

Minutos e horas são calculados

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

Em seguida, exibe a sequência de saída

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

O bit 's' da saída é calculado e manipulado corretamente - um 's' é adicionado sempre que o número não for 1.


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

7
Isso não parece manipular corretamente os plurais.
— Maçaneta

@Doorknob Isto é o que acontece quando as regras são alteradas após as respostas são postados :)
— 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"]

Versão menos golfe:

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

fé uma função que pega os 3 primeiros caracteres de sua entrada e os converte em um número inteiro. p#qé uma função que pluraliza qsep não é igual a 1. Para retornar o resultado sem aspas, useiputStr para imprimir o resultado em STDOUT.

Obrigado a nimi pela ajuda!


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]

Os três primeiros caracteres da entrada são simplesmente analisados ​​como um número inteiro. Isso funciona apenas porque o terceiro caractere em uma entrada de 2 dígitos é um espaço que intserá ignorado durante a conversão.


Eu acho que você pode fazer o "hour"+m/120*"s"mesmo por alguns minutos.
— Xnor

m=240Infelizmente, falhará .
— Xsot

2

LabVIEW, 50 bytes

Isso é contado de acordo com minha sugestão no Meta .

O código é bem direto, pegue o número da entrada Modulo em 60 e adicione um s por minutos! = 1. O outro lado do caso apenas passa a string.

insira a descrição da imagem aqui


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

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!nprecede na s, adicionando 's'a ao final se n /= 1.

f xfaz a formatação após o uso divMod.

Como podemos assumir uma entrada máxima de 240, take 3é suficiente para pegar apenas o número.

(Tive que me esforçar muito para vencer a pontuação de @Craig Roy ...)


2

R, 112 bytes

Editar : corrigido um erro de escopo e solucionado o problema de saída da cotação.

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 teste

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

Tentei economizar espaço, tentando encontrar uma maneira de adicionar ou subtrair "s" conforme necessário, mas tive que mexer com o sep =argumento nopaste() função e não parecia realmente que isso me pouparia muito espaço. Alguma sugestão?

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

O arredondamento para baixo com entrada / 60 ou entrada %% 60 (mod) fornece as horas e minutos, respectivamente. Encadeie-os com uma ifelse()declaração que especifique se as unidades são ou não hora (s) ou minuto (s).


A saída não deve ser colocada entre aspas.
— Vasu Adari

@ Vasu Adari Corrigido usando a cat()função
— precisa

11
Você pode salvar bytes manipulando o plural com just s e alterando suas condições.
— Vasu Adari

1

Ruby, 97 100 99 88 bytes

Edit: Fixando a saída.

Editar: removendo chaves de divmod.

Edit: Yay interpolação de cordas! Agradecimentos a Vasu Adari . Além disso, melhor não-golfe.

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 não deve ser colocado entre aspas.
— Vasu Adari 28/11

@VasuAdari Fixed
— Sherlock (

Você pode perder as chaves para o divmodmétodo. Além disso, usando a interpolação de cadeias, você pode salvar alguns bytes.
— Vasu Adari 28/11

@ VasuAdari Estou ciente de que a iterpolação de string é uma coisa, mas não tenho certeza do que é ou como funciona. Obrigado pela ajuda
— Sherlock9

@VasuAdari Oop, espere. O Google me ensinou o que eu preciso saber. Deixe-me começar a editar.
— Sherlock9

1

Go, 177 bytes

(Inclui apenas a função e as instruções de importação)

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

Solução bonita -

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

Testando -

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

Mathematica, 61 bytes

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

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 da área de transferência
  2. A saída imprime em qualquer formato pressionando x
  3. Manipula corretamente plurais
  4. Poderia ser menor, mas eu queria fornecer um One Liner.

1

PHP, 77 76 bytes

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

Horible, Horible, Horible!
PHP emite apenas alguns Notices para"s"[$h<2]

Para executar: php -r 'CODE' '150 minutes'
e, é claro, desative / desative o relatório de erros do stdout!

Edit: -1byte atribuir em atribuir (crédito: insertusernamehere)

É tão feio que devo dar uma ajuda para os usuários do Linux:

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

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

@insertusernamehere nice, obrigado! louco
— CSᵠ

De nada. Até 4 bytes menor (estava muito cansado para aviso ontem): $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
— insertusernamehere

@insertusernamehere que é um realmente desagradável um velho, mas não posso acreditar que ele funciona para php 5,6-7 e não para 5,3-5,5
— CSᵠ

Eu testei com o PHP 5.6.10 (OS X) e funciona aqui. :)
— insertusernamehere

1

Arcyóu (não competitivo), 93 bytes

Este envio usa uma versão do idioma que foi criado após esse desafio.

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

Yeesh! Essa linguagem precisa de melhor manipulação de strings.

Explicação:

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

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

Versão Ungolfed:

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

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

Exemplo de saídas:

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

11
Bem-vindo ao PPCG.SE! Editei sua postagem para parecer mais esteticamente agradável. Diverta-se!
— GamrCorps

1

Sério , 77 bytes

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

Sério, sério, não é bom em manipulação de cordas. Experimente online com explicações completas (você precisará inserir manualmente a entrada como "210 mins"porque os links permanentes não gostam de aspas).

Explicação rápida e suja:

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

Seu link não 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":"");}}

Optei por postar uma alternativa ao @TheAustralianBirdEatingLouse, pois isso não só é mais curto em boa parte (~ 10%), mas também é mais correto nas horas e minutos de impressão, em vez de horas e minutos abreviados. As implementações de métodos nas interfaces são novas no Java 8 - portanto, isso seria necessário para compilar / executar

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.