Długość filmu w formacie czytelnym dla człowieka


24

Ilekroć szukam długości filmu w IMDb, jest on wyświetlany w minutach. Natychmiast spróbuję przekonwertować go na godziny i minuty. Byłoby lepiej, gdybyśmy mogli to zautomatyzować.

Wkład:

150 min

Wydajność:

2 hours 30 minutes

Wkład:

90 min

Wydajność:

1 hour 30 minutes

Wkład:

61 min

Wydajność:

1 hour 1 minute

Wkład:

60 min

Wydajność:

1 hour 0 minute or 1 hour 0 minutes

Oto warunki:

  1. Dane wejściowe i wyjściowe powinny mieć dokładnie ten format.

  2. Minuty wejściowe będą wynosić od 0 do 240.

  3. Twoja odpowiedź może zaakceptować argumenty wiersza poleceń lub odczytać dane wejściowe od użytkownika lub funkcji.

  4. Dane wyjściowe nie powinny być ujęte w cudzysłowy.

  5. Wyjście musi zostać wydrukowane, a nie zwrócone.

Tabela liderów:

Wynik:

Jest to remis między CJam i Pyth. Akceptacja odpowiedzi CJam, która została przesłana przed 35 bajtowym kodem Pytha. Proszę jednak nadal zachęcać do nowych zgłoszeń.


2
@quintopia Zgodnie z regulaminem strony , nie. Możesz użyć funkcji, jeśli chcesz.
Klamka

1
Technicznie ja (i założę się, że inni ludzie) potrafię przeczytać „150 minut”.
PyRulez

1
Dlaczego warto ograniczyć do> 59 minut? Ponadto wolę 61 minut do 1 godziny 1 minuty i naprawdę nie chciałbym oglądać 1 godziny 0 minut
markshancock

6
Zmieniłeś zakres wejściowy na 0-240, ale nie uwzględniłeś żadnych przypadków testowych mniejszych niż 60. Zalecam pozostanie przy oryginalnym zakresie, ponieważ opublikowano już 28 odpowiedzi.
Alex A.,

2
Wygląda na to, że zmieniłeś również dopuszczalną moc wyjściową na całe godziny. O ile w wyzwaniu występują rażące problemy, które wymagają naprawy, nie wprowadzaj zmian w wyzwaniu, które unieważniają istniejące odpowiedzi.
Alex A.,

Odpowiedzi:


10

CJam, 39 35 bajtów

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

Wypróbuj online

Najnowsza wersja zawiera ulepszenia sugerowane przez @ MartinBüttner, w szczególności wykorzystujące elementarny operator wektorowy zamiast transponowania dwóch list.

Wyjaśnienie:

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*(Wygląda na to, że daje to całkiem solidną przewagę w tym wyzwaniu :))
Martin Ender

@ MartinBüttner r"utehour"+6/W%ma faktycznie taką samą długość "hour minute"S/, więc część nie pomaga. Wydaje mi się, że widziałem już wcześniej .używany blok, ale znowu zapomniałem, że jest obsługiwany.
Reto Koradi

Ach, tak, najpierw napisałem 36-bajtową wersję, w której rzeczywiście pomogło (ale potem usunąłem komentarz i zastąpiłem go 35-bajtową wersją, w której to już nie ma znaczenia).
Martin Ender

19

Python 3, 50 67 119 116 112 111 104 94 bajtów

Nie lubię wracać do %formatowania ciągów w stylu, ale oszczędza to 6 bajtów .format.

Edycja: Zapomniałem przeanalizować dane wejściowe.

Edycja: Zapomniałem obsługi liczby mnogiej.

Edycja: Yay lambdas!

Edycja: Dodano niestosowanie golfa

Edycja: Cholera. Lambdas nie pomógł.

Edycja: Ponieważ minuty mają maksymalnie trzy cyfry i int()nie mają nic przeciwko spacjom w ciągu, mogę zapisać kilka bajtów, używając input()[:3].

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

Nie golfowany:

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
Ach! Zwiększenie liczby bajtów! +1 za nie
poddawanie

9

JavaScript, 78 bajtów

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>

W przypadku zestawu testów wprowadź dane wejściowe jak "61 min"w polu wprowadzania.


Wyjaśnienie

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

Dobry. Sugestia: zredukuj parseInt(n)do +n.
nicael

1
Dane wejściowe nie będą tylko liczbami całkowitymi. Nie udaje się, gdy podam dane wejściowe jako 150 min.
Vasu Adari,

1
@VasuAdari To działa dla mnie, wyniki 2 hours 30 minutes. Czy mogę zapytać, jak to przetestowałeś?
jrich

3
@ ev3commander Korzystając z fragmentu testowego, zawiń dane wejściowe w cudzysłowy, aby zostały rozpoznane jako ciąg. np. "61 min"lub'61 min'
jrich

1
+1 dla JavaScript. Teraz wystarczy zrobić z niego broszkę ;)
MayorMonty

6

Pyth, 39 38 bajtów

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

5

Vitsy , 57 54 52 bajtów

Och, wow, nawet nie mam liczb całkowitych w moim języku. 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.

Wypróbuj online!


4

K5, 55 51 bajtów

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

Jest to bardziej ogólne niż musi być; może nadal grać w golfa dalej.

W akcji:

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

Edytować:

Program ten przechodził kilka bardzo różnych iteracji w trakcie rozwoju i pomyślałem, że bardziej pouczające może być pokazanie niektórych pośrednich kroków.

Oto mój pierwszy problem dotyczący problemu, zanim wprowadzono wymóg pluralizacji. Tutaj jest wyraźne powtórzenie:

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

Zdałem sobie sprawę, że ogólnym sposobem radzenia sobie z rzucaniem miejsc jest forma „dekodowania” K5. Aby umieścić wartości w łańcuchu, użyłem prymitywu „zastosuj kropkę”, który stosuje listę argumentów do funkcji i rozpakowuje listę do poszczególnych parametrów:

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

Nie pozostało tu zbyt wiele redundancji. Po dodaniu liczby mnogiej rozłożyłem tę wiodącą funkcję anonimową na transformację, którą mogłem zastosować do każdej liczby, jak poniżej:

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

Dołącz x, yi albo salbo nic, w zależności od tego, czy xjest równe „1”. Ostatecznie lepiej było odwrócić kolejność argumentów do tej funkcji.

Edycja 2:

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

Kilka drobnych ulepszeń tutaj. Lepszy sposób wyboru „s” lub pustego ciągu, krótsza stała dla „dekodowania”, która odzwierciedla ograniczony zakres danych wejściowych, i prostszy sposób odrzucania „min”.


4

Pyth, 46 bajtów

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

Pobiera dane wejściowe x mini wyjściowex hours y minutes

Wypróbuj tutaj

Wyjaśnienie:

   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 bajtów

80 bajtów oryginału

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

Stosowanie:

.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

Ze względu na zmianę pytania mogę usunąć x?$mz końca funkcji, co pozwala mi zmniejszyć ją o 3 kolejne bajty.

{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 bajtów

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

Wersja bez golfa (przekonwertowana na ES5, ponieważ nie wszystkie przeglądarki obsługują jeszcze 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()))


Można owinąć t=parseInt(t)i nawias, a następnie umieścić, że jeżeli kiedykolwiek najpierw użyć ttak: (h=0|(t=parseInt(t))/60). W ten sposób można usunąć zwrot i{}
Downgoat

@Downgoat Próbowałem już, ale z jakiegoś powodu to nie działało. Spróbuję ponownie.
nicael

1
@Downgoat Najwyraźniej wcześniej popełniłem błąd, teraz działa poprawnie. Dzięki :)
nicael

UŻYWAJ STRINGÓW SZABLONU. $ {} !!!
Mama Fun Roll

3

C #, 127 bajtów

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

Można to umieścić w pliku i uruchomić za pomocą interaktywnej powłoki C # dostarczanej z Mono, używając domyślnej konfiguracji.

[To moja pierwsza próba gry w golfa kodowego. Mam nadzieję, że mój wkład nie narusza żadnych zasad.]


3

C, 89 bajtów

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

3

Rubinowy, 75 bajtów

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

Czasami nawet pusty ciąg jest za długi. ''p.
manatwork,

2

MATLAB, 111 108 106 bajtów

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

Działa to również z Octave i można spróbować tutaj . Łącze prowadzi do obszaru roboczego zawierającego kod w pliku o nazwie runningLength.m. Aby go przetestować, wystarczy wpisać runningLengthznak zachęty, a następnie wprowadzić ciąg wejściowy, np '123 mins'. Wyświetli wynik.

Pobiera dane wejściowe jako ciąg znaków, np. '123 mins'Konwertuje je na liczbę (która domyślnie ignoruje minsbit).

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

Następnie obliczane są minuty i godziny

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

Następnie wyświetla ciąg wyjściowy

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

Bit „s” danych wyjściowych jest obliczany i obsługiwany poprawnie - dodaje się „s”, gdy liczba nie jest równa 1.


2

Python 2, 96 bajtów

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
Nie wydaje się to poprawnie obsługiwać liczby mnogiej.
Klamka

@Doorknob Tak dzieje się, gdy zasady są zmieniane po opublikowaniu odpowiedzi :)
quintopia

2

Haskell, 117 109 bajtów

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

Wersja mniej golfowa:

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

fto funkcja, która pobiera pierwsze 3 znaki z wejścia i konwertuje je na liczbę całkowitą. p#qjest funkcją, która pluralizuje, qjeśli pnie jest równa 1. Aby zwrócić wynik bez otaczających go cudzysłowów, zwykłem putStrdrukować wynik do STDOUT.

Dzięki im za pomoc!


2

Python 2, 79 77 bajtów

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

Pierwsze 3 znaki wejścia są po prostu analizowane jako liczba całkowita. Działa to tylko dlatego, że trzeci znak na dwucyfrowym wejściu to spacja, która intzostanie zignorowana podczas konwersji.


Myślę, że możesz to zrobić "hour"+m/120*"s"przez kilka minut.
xnor

m=240Niestety zawiedzie .
xsot

2

LabVIEW, 50 bajtów

Jest to liczone zgodnie z moją sugestią dotyczącą Meta .

Kod jest dość prosty, weź liczbę od wejścia Modulo o 60 i dodaj s przez kilka minut! = 1. Druga strona sprawy po prostu przechodzi przez ciąg.

wprowadź opis zdjęcia tutaj


2

Scala, 135 bajtów

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

Stosowanie:

a("120 min")
2 hours 0 minute

2

Haskell, 107 101 bajtów

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

Nie golfowany:

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!nprzygotowuje ndo s, dodając 's'do końca if n /= 1.

f xwykonuje formatowanie po użyciu divMod.

Ponieważ możemy założyć, że maksymalna wartość wejściowa wynosi 240, take 3wystarczy wziąć tylko liczbę.

(Musiałem bardzo się starać, aby pokonać wynik @Craiga Roya ...)


2

R, 112 bajtów

Edycja : Naprawiono błąd określania zakresu, a następnie rozwiązano problem z wyjściem oferty.

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

Przypadki testowe

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

Próbowałem zaoszczędzić miejsce, próbując znaleźć sposób na dodanie lub odjęcie „s” w razie potrzeby, ale musiałem zadzierać z sep = argumentem wpaste() funkcji i nie wyglądało to tak, jakby oszczędzało mi to dużo miejsca. Jakieś sugestie?

Bez golfa

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

Zaokrąglenie w dół za pomocą input / 60 lub input %% 60 (mod) daje odpowiednio godziny i minuty. Połącz je razem z ifelse()instrukcją, która określa, czy jednostki są godzinami lub minutami.


Dane wyjściowe nie powinny być ujęte w cudzysłowy.
Vasu Adari,

@Vasu Adari Naprawiono go za pomocą cat()funkcji.
syntonicC

1
Możesz zaoszczędzić bajty, obsługując liczbę mnogą za pomocą just s i zmieniając swoje warunki.
Vasu Adari,

1

Ruby, 97 100 99 88 bajtów

Edycja: Naprawianie wyjścia.

Edycja: Usuwanie nawiasów klamrowych z divmod.

Edycja: interpolacja ciągów Yay! Dzięki Vasu Adari . Również lepsze nieugolfowanie.

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

Nie golfowany:

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 nie powinny być ujęte w cudzysłów.
Vasu Adari

@VasuAdari Naprawiono
Sherlock9

Możesz stracić nawiasy klamrowe dla divmodmetody. Również za pomocą interpolacji łańcuchów możesz zapisać kilka bajtów.
Vasu Adari

@VasuAdari Zdaję sobie sprawę z tego, że iterpolacja ciągów jest sprawą, ale nie jestem pewien, co to jest ani jak działa. Dzięki za pomoc
Sherlock9,

@VasuAdari Oop, czekaj. Google nauczyło mnie tego, co muszę wiedzieć. Pozwól mi edytować.
Sherlock9,

1

Idź, 177 bajtów

(Zawiera tylko funkcję i instrukcje importu)

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

Ładne rozwiązanie -

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

Testowanie -

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

AutoHotkey , 174 170 160 bajtów

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

Uwagi:

  1. Wejście ze schowka
  2. Drukuj wydruki do dowolnej postaci, naciskając x
  3. Prawidłowo obsługuje liczbę mnogą
  4. Może być mniejszy, ale chciałem zapewnić One Liner.

1

PHP, 77 76 bajtów

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

okropny, okropny, okropny!
PHP wydaje tylko kilka Notices"s"[$h<2]

Uruchamianie: php -r 'CODE' '150 minutes'
i oczywiście wyłączanie raportowania błędów / wyłączanie ze standardowego wyjścia!

Edycja: -1-bajt przypisać w przypisaniu (kredyt: nazwa insertusertutaj)

Jest tak brzydki, że muszę zapewnić pomocnika dla użytkowników Linuksa:

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

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

@insertusernamehere nice, dzięki! szalony
CSᵠ

Nie ma za co. Nawet 4 bajty mniejsze (był zbyt zmęczony, żeby powiadomienia wczoraj) $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
inserttusernamehere

@insertusernamehere jest to naprawdę paskudny stary, ale nie mogę uwierzyć, że działa dla php 5.6-7, a nie dla 5.3-5.5
CSᵠ

Przetestowałem to z PHP 5.6.10 (OS X) i działa tutaj. :)
inserttusernamehere

1

Arcyóu (niekonkurencyjny), 93 bajty

W tym zgłoszeniu wykorzystano wersję języka utworzoną po tym wyzwaniu.

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

Tak! Ten język wymaga lepszej manipulacji ciągami.

Wyjaśnienie:

(: 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 bajtów

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

73 bajty

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

74 bajty:

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

Stosowanie:

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

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

Wersja bez golfa:

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

Przetestuj za pomocą:

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

Przykładowe wyniki:

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

1
Witamy w PPCG.SE! Zredagowałem twój post, aby wyglądał bardziej estetycznie. Baw się dobrze!
GamrCorps

1

Poważnie , 77 bajtów

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

Poważnie jest poważnie nie dobry ciąg manipulacji. Wypróbuj online z pełnym objaśnieniem (konieczne będzie ręczne wprowadzenie danych, np. "210 mins"Ponieważ permalinki nie lubią cudzysłowów).

Szybkie i nieprzyzwoite wyjaśnienie:

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

Twój link nie działa
TanMath,

1

Java 8, 148 bajtów

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

Postanowiłem opublikować alternatywę dla @TheAustralianBirdEatingLouse, ponieważ jest to nie tylko o wiele krótsze (~ 10%), ale także bardziej poprawne w godzinach i minutach drukowania zamiast skróconych godzin i minut. Implementacje metod w interfejsach są nowością w Javie 8 - więc byłoby to potrzebne do kompilacji / uruchomienia

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.