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.