Durata del film in un formato leggibile dall'uomo


24

Ogni volta che cerco la lunghezza di un film in IMDb, viene visualizzato in pochi minuti. Proverei immediatamente a convertirlo in ore e minuti. Sarebbe meglio se potessimo automatizzare questo.

Ingresso:

150 min

Produzione:

2 hours 30 minutes

Ingresso:

90 min

Produzione:

1 hour 30 minutes

Ingresso:

61 min

Produzione:

1 hour 1 minute

Ingresso:

60 min

Produzione:

1 hour 0 minute or 1 hour 0 minutes

Di seguito sono le condizioni:

  1. Input e Output dovrebbero essere in questo formato esatto.

  2. I minuti di input saranno compresi tra 0 e 240.

  3. La tua risposta può accettare argomenti da riga di comando o leggere input dell'utente o di una funzione.

  4. L'output non deve essere racchiuso tra virgolette.

  5. L'output deve essere stampato, non restituito.

Classifica:

Risultato:

È un pareggio tra CJam e Pyth. Accettare la risposta di CJam come era stata inviata prima del codice di 35 byte di Pyth. Tuttavia, continua a incoraggiare nuovi invii.


2
@quintopia Secondo le regole del sito , n. Puoi usare una funzione se vuoi.
Maniglia della porta

1
Tecnicamente, io (e scommetto che altri umani) posso leggere "150 minuti".
PyRulez,

1
Perché limitare a> 59 minuti? Inoltre, preferisco 61 minuti a 1 ora e 1 minuto e odio davvero vedere 1 ora 0 minuti
Markhancock,

6
Hai modificato l'intervallo di input in 0-240 ma non hai incluso casi di test inferiori a 60. Consiglio di attenermi all'intervallo originale dato che sono già state inviate 28 risposte.
Alex A.

2
Sembra che tu abbia anche modificato l'output accettabile per intere ore. A meno che una sfida non abbia problemi evidenti che devono essere risolti, non apportare modifiche a una sfida che invalida le risposte esistenti.
Alex A.

Risposte:


10

CJam, 39 35 byte

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

Provalo online

L'ultima versione include miglioramenti suggeriti da @ MartinBüttner, in particolare utilizzando l'operatore vettoriale in termini di elementi anziché trasporre le due liste.

Spiegazione:

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.

1
35: ri60md]r"utehour"+6/W%.{1$1>'s*+}S*(Sembra che questo ti dia un vantaggio piuttosto solido su questa sfida :))
Martin Ender,

@ MartinBüttner r"utehour"+6/W%è in realtà la stessa lunghezza di "hour minute"S/, quindi quella parte finisce per non aiutare. Penso di aver visto .usato con un blocco prima, ma avevo dimenticato di nuovo che era supportato.
Reto Koradi,

Ah, giusto, avevo inizialmente pubblicato una versione a 36 byte in cui era effettivamente di aiuto (ma poi ho eliminato il commento e sostituito con la versione a 35 byte in cui non ha più importanza).
Martin Ender,

19

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

Non mi piace tornare alla %formattazione di stringhe in stile, ma salva 6 byte su .format.

Modifica: dimenticato di analizzare l'input.

Modifica: dimenticato di gestire i plurali.

Modifica: Yay lambdas!

Modifica: aggiunto ungolfing

Modifica: dannazione. Lambdas non ha aiutato.

Modifica: poiché i minuti hanno un massimo di tre cifre e int()non si occupano degli spazi nella stringa, posso salvare alcuni byte 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! Aumento del numero di addetti! +1 per non arrendersi ;-)
agtoever il

9

JavaScript, 78 byte

n=>(h=(n=parseInt(n))/60|0)+` hour${h-1?"s":""} ${m=n%60} minute`+(m-1?"s":"")
<!--                               Try the test suite below!                              --><strong id="bytecount" style="display:inline; font-size:32px; font-family:Helvetica"></strong><strong id="bytediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><br><pre style="margin:0">Code:</pre><textarea id="textbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><pre style="margin:0">Input:</pre><textarea id="inputbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><button id="testbtn">Test!</button><button id="resetbtn">Reset</button><br><p><strong id="origheader" style="font-family:Helvetica; display:none">Original Code Output:</strong><p><div id="origoutput" style="margin-left:15px"></div><p><strong id="newheader" style="font-family:Helvetica; display:none">New Code Output:</strong><p><div id="newoutput" style="margin-left:15px"></div><script type="text/javascript" id="golfsnippet">var bytecount=document.getElementById("bytecount");var bytediff=document.getElementById("bytediff");var textbox=document.getElementById("textbox");var inputbox=document.getElementById("inputbox");var testbtn=document.getElementById("testbtn");var resetbtn=document.getElementById("resetbtn");var origheader=document.getElementById("origheader");var newheader=document.getElementById("newheader");var origoutput=document.getElementById("origoutput");var newoutput=document.getElementById("newoutput");textbox.style.width=inputbox.style.width=window.innerWidth-50+"px";var _originalCode=null;function getOriginalCode(){if(_originalCode!=null)return _originalCode;var allScripts=document.getElementsByTagName("script");for(var i=0;i<allScripts.length;i++){var script=allScripts[i];if(script.id!="golfsnippet"){originalCode=script.textContent.trim();return originalCode}}}function getNewCode(){return textbox.value.trim()}function getInput(){try{var inputText=inputbox.value.trim();var input=eval("["+inputText+"]");return input}catch(e){return null}}function setTextbox(s){textbox.value=s;onTextboxChange()}function setOutput(output,s){output.innerHTML=s}function addOutput(output,data){output.innerHTML+='<pre style="background-color:'+(data.type=="err"?"lightcoral":"lightgray")+'">'+escape(data.content)+"</pre>"}function getByteCount(s){return(new Blob([s],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"})).size}function onTextboxChange(){var newLength=getByteCount(getNewCode());var oldLength=getByteCount(getOriginalCode());bytecount.innerHTML=newLength+" bytes";var diff=newLength-oldLength;if(diff>0){bytediff.innerHTML="(+"+diff+")";bytediff.style.color="lightcoral"}else if(diff<0){bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgreen"}else{bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgray"}}function onTestBtn(evt){origheader.style.display="inline";newheader.style.display="inline";setOutput(newoutput,"");setOutput(origoutput,"");var input=getInput();if(input===null){addOutput(origoutput,{type:"err",content:"Input is malformed. Using no input."});addOutput(newoutput,{type:"err",content:"Input is malformed. Using no input."});input=[]}doInterpret(getNewCode(),input,function(data){addOutput(newoutput,data)});doInterpret(getOriginalCode(),input,function(data){addOutput(origoutput,data)});evt.stopPropagation();return false}function onResetBtn(evt){setTextbox(getOriginalCode());origheader.style.display="none";newheader.style.display="none";setOutput(origoutput,"");setOutput(newoutput,"")}function escape(s){return s.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}window.alert=function(){};window.prompt=function(){};function doInterpret(code,input,cb){var workerCode=interpret.toString()+";function stdout(s){ self.postMessage( {'type': 'out', 'content': s} ); }"+" function stderr(s){ self.postMessage( {'type': 'err', 'content': s} ); }"+" function kill(){ self.close(); }"+" self.addEventListener('message', function(msg){ interpret(msg.data.code, msg.data.input); });";var interpreter=new Worker(URL.createObjectURL(new Blob([workerCode])));interpreter.addEventListener("message",function(msg){cb(msg.data)});interpreter.postMessage({"code":code,"input":input});setTimeout(function(){interpreter.terminate()},1E4)}setTimeout(function(){getOriginalCode();textbox.addEventListener("input",onTextboxChange);testbtn.addEventListener("click",onTestBtn);resetbtn.addEventListener("click",onResetBtn);setTextbox(getOriginalCode())},100);function interpret(code,input){window={};alert=function(s){stdout(s)};window.alert=alert;console.log=alert;prompt=function(s){if(input.length<1)stderr("not enough input");else{var nextInput=input[0];input=input.slice(1);return nextInput.toString()}};window.prompt=prompt;(function(){try{var evalResult=eval(code);if(typeof evalResult=="function"){var callResult=evalResult.apply(this,input);if(typeof callResult!="undefined")stdout(callResult)}}catch(e){stderr(e.message)}})()};</script>

Per la suite di test, immettere input come "61 min"nella casella di input.


Spiegazione

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

Buona Suggerimento: ridurre parseInt(n)a +n.
nicael,

1
L'input non sarà solo un numero intero. Non riesce quando fornisco input come 150 min.
Vasu Adari,

1
@VasuAdari Funziona per me, uscite 2 hours 30 minutes. Posso chiederti come l'hai testato?
jrich

3
@ ev3commander Quando si utilizza lo snippet di test, racchiudere l'input tra virgolette in modo che venga riconosciuto come stringa. ad es. "61 min"oppure'61 min'
jrich

1
+1 per JavaScript. Ora non ti resta che renderlo un bookmarlet ;)
MayorMonty

6

Pyth, 39 38 byte

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

5

Vitsy , 57 54 52 byte

Oh, wow, non ho nemmeno numeri interi nella mia lingua. 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.

Provalo online!


4

K5, 55 51 byte

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

Questo è più generale di quanto non debba essere rigorosamente; potrebbe ancora continuare a giocare a golf.

In azione:

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

Modificare:

Questo programma ha attraversato diverse iterazioni molto diverse nel corso dello sviluppo e ho pensato che potrebbe essere più illuminante mostrare alcuni dei passaggi intermedi.

Ecco il mio primo colpo al problema, prima che venisse introdotto il requisito della pluralizzazione. C'è una chiara ripetizione qui:

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

Mi sono reso conto che il modo generale per gestire il lancio fuori posto era la forma di "decodifica" di K5. Per inserire i valori nella stringa ho usato la primitiva "dot-apply", che applica un elenco di argomenti a una funzione e decomprime l'elenco in singoli parametri:

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

Non è rimasta molta ridondanza qui. Quando è stata aggiunta la pluralizzazione, ho scomposto quella principale funzione anonima in una trasformazione che avrei potuto applicare a ciascun numero, in questo modo:

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

Unisci x, ye uno so entrambi , a seconda che xsia uguale a "1". Alla fine ha funzionato meglio per invertire l'ordine degli argomenti con questa funzione.

Modifica 2:

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

Diversi piccoli miglioramenti qui. Un modo migliore di selezionare una "s" o una stringa vuota, una costante più breve per "decodificare" che riflette l'intervallo limitato di input e un modo più semplice di scartare "min".


4

Pyth, 46 byte

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

Accetta input x mine outputx hours y minutes

Provalo qui

Spiegazione:

   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 byte

80 byte originale

{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

A causa di un cambiamento nella domanda, posso rimuoverlo x?$mdalla fine della funzione, che mi permette di ridurlo di altri 3 byte.

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

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

Demo de-golfed (convertito in ES5, poiché non tutti i browser supportano ancora 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()))


Si potrebbe avvolgere t=parseInt(t)e tra parentesi, e poi mettere che dove mai primo utilizzo tcosì: (h=0|(t=parseInt(t))/60). In questo modo, puoi rimuovere il {}
reso

@Downgoat Ho già provato ma non ha funzionato per qualche motivo. Ci riproverò.
nicael,

1
@Downgoat Apparentemente ho fatto un errore in precedenza, ora funziona correttamente. Grazie :)
nicael,

USA LE STRINGHE DEL MODELLO. $ {} !!!
Mama Fun Roll

3

C #, 127 byte

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

Questo può essere inserito in un file ed eseguito tramite la shell interattiva C # fornita con Mono, utilizzando la configurazione predefinita.

[Questo è il mio primo tentativo di code golf. Spero che il mio contributo non stia violando alcuna regola.]


3

C, 89 byte

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

3

Rubino, 75 byte

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

A volte anche una stringa vuota è troppo lunga. ''p.
arte

2

MATLAB, 111 108 106 byte

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

Funziona anche con Octave e può essere provato qui . Il collegamento è a un'area di lavoro che contiene già il codice in un file denominato runningLength.m. Quindi per provarlo basta inserire runningLengthal prompt, quindi inserire la stringa di input, ad es. '123 mins'E visualizzerà l'output.

Prende l'input come una stringa, ad esempio '123 mins', lo converte in un numero (che ignora implicitamente il minsbit).

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

Vengono quindi calcolati i minuti e le ore

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

Quindi visualizza la stringa di output

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

Il bit 's' dell'output viene calcolato e gestito correttamente - una 's' viene aggiunta ogni volta che il numero non è 1.


2

Python 2, 96 byte

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
Questo non sembra gestire correttamente i plurali.
Maniglia della porta

@Doorknob Questo è ciò che accade quando le regole vengono modificate dopo che le risposte sono state pubblicate :)
quintopia

2

Haskell, 117 109 byte

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

Versione meno giocata a golf:

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è una funzione che accetta i primi 3 caratteri del suo input e li converte in un numero intero. p#qè una funzione che si pluralizza qse pnon è uguale a 1. Per restituire il risultato senza virgolette circostanti, ho usato putStrper stampare il risultato su STDOUT.

Grazie a nimi per l'aiuto!


2

Python 2, 79 77 byte

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

I primi 3 caratteri dell'input vengono semplicemente analizzati come un numero intero. Questo funziona solo perché il terzo carattere in un input di 2 cifre è uno spazio, che intverrà ignorato durante la conversione.


Penso che puoi solo fare "hour"+m/120*"s"e allo stesso modo per minuti.
xnor

m=240Purtroppo fallirà .
xsot,

2

LabVIEW, 50 byte

Questo è conteggiato secondo mio suggerimento su Meta .

Il codice è piuttosto semplice, prendi il numero dall'input Modulo di 60 e aggiungi una s per minuti! = 1. L'altro lato del caso inserisce semplicemente la stringa.

inserisci qui la descrizione dell'immagine


2

Scala, 135 byte

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 byte

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!nantepone na s, aggiungendo 's'a alla fine se n /= 1.

f xesegue la formattazione dopo l'uso divMod.

Dal momento che possiamo assumere un input massimo di 240, take 3è sufficiente prendere solo il numero.

(Ho dovuto sforzarci davvero di battere il punteggio di @Craig Roy ...)


2

R, 112 byte

Modifica : risolto un errore di scoping e quindi risolto il problema di output dell'offerta.

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

Casi 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

Ho cercato di risparmiare spazio cercando di trovare un modo per aggiungere o sottrarre semplicemente "s", ma ho dovuto fare confusione con l' sep =argomento nella paste()funzione e non sembrava davvero che mi avrebbe fatto risparmiare molto spazio. Eventuali suggerimenti?

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

L'arrotondamento per difetto con input / 60 o input %% 60 (mod) fornisce rispettivamente le ore e i minuti. Incatenali insieme a ifelse()un'istruzione che specifichi se le unità sono o meno ore o minuti.


L'output non deve essere racchiuso tra virgolette.
Vasu Adari il

@Vasu Adari Risolto il problema utilizzando la cat()funzione.
syntonicC

1
Puoi salvare byte gestendo il plurale con just s e cambiando le tue condizioni.
Vasu Adari,

1

Rubino, 97 100 99 88 byte

Modifica: correzione dell'output.

Modifica: rimozione di parentesi graffe da divmod.

Modifica: interpolazione di stringhe Yay! Grazie a Vasu Adari . Inoltre, ungolfing migliore.

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 non deve essere racchiuso tra virgolette.
Vasu Adari,

@VasuAdari Risolto
Sherlock9,

Puoi perdere le parentesi graffe per il divmodmetodo. Inoltre, utilizzando l'interpolazione di stringhe è possibile salvare pochi byte.
Vasu Adari,

@VasuAdari Sono consapevole che l'iterpolazione delle stringhe è una cosa, ma non sono sicuro di cosa sia o come funzioni. Grazie per l'aiuto
Sherlock9,

@VasuAdari Oop, aspetta. Google mi ha insegnato ciò che devo sapere. Fammi modificare.
Sherlock9,

1

Vai, 177 byte

(Include solo la funzione e le dichiarazioni di importazione)

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

Bella soluzione -

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

Testarlo -

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 byte

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

1

Tasto di scelta automatica , 174 170 160 byte

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

Gli appunti:

  1. Input dagli Appunti
  2. Stampa l'output in qualsiasi forma premendo x
  3. Gestisce correttamente i plurali
  4. Potrebbe essere più piccolo, ma volevo un One Liner.

1

PHP, 77 76 byte

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

orribile, orribile, orribile!
PHP pubblica solo un paio di messaggi Noticeper"s"[$h<2]

Per eseguire: php -r 'CODE' '150 minutes'
e, naturalmente, disattivare / annullare la segnalazione degli errori da stdout!

Modifica: -1byte assegnare in assegnare (credito: inserireusernamehere)

È così brutto che devo dare un aiuto per gli utenti di Linux:

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

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

@inserireusernamehere bello, grazie! pazzo
CSᵠ

Prego. Anche i 4 byte minore (era troppo stanco per preavviso ieri): $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
insertusernamehere

@inserireusernamequi che è davvero vecchio, ma non riesco a credere che funzioni per php 5.6-7 e non per 5.3-5.5
CSᵠ

L'ho provato con PHP 5.6.10 (OS X) e funziona qui. :)
inserireusernamehere il

1

Arcyóu (non competitivo), 93 byte

Questo invio utilizza una versione della lingua creata dopo questa sfida.

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

Yeesh! Questo linguaggio richiede una migliore manipolazione delle stringhe.

Spiegazione:

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

Rubino, 74 73 71 byte

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

73 byte

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

74 byte:

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

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

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

Provalo con:

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

Esempi di output:

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

1
Benvenuto in PPCG.SE! Ho modificato il tuo post per renderlo più esteticamente piacevole. Divertiti!
GamrCorps,

1

Scherzi a parte , 77 byte

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

Seriamente non è seriamente bravo a manipolare le stringhe. Provalo online con una spiegazione completa (dovrai inserire manualmente l'input come"210 mins" perché i permalink non amano le virgolette).

Spiegazione rapida e sporca:

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

Il tuo link non funziona
TanMath,

1

Java 8, 148 byte

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

Ho scelto di pubblicare un'alternativa a @TheAustralianBirdEatingLouse poiché questo non è solo più breve di un buon affare (~ 10%) ma anche più corretto nelle ore e nei minuti di stampa anziché in ore e minuti abbreviati. Le implementazioni dei metodi in Interfaces sono nuove in Java 8, quindi sarebbero necessarie per compilare / eseguire

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.