Продолжительность фильма в удобочитаемом формате

24

Всякий раз, когда я ищу длительность фильма в IMDb, он отображается в минутах. Сразу же я бы попытался преобразовать его в час (ы) и минуты (ы). Было бы лучше, если бы мы могли автоматизировать это.

Входные данные:

150 min

Выход:

2 hours 30 minutes

Входные данные:

90 min

Выход:

1 hour 30 minutes

Входные данные:

61 min

Выход:

1 hour 1 minute

Входные данные:

60 min

Выход:

1 hour 0 minute or 1 hour 0 minutes

Ниже приведены условия:

  1. Вход и выход должны быть в этом точном формате.

  2. Входные минуты будут между 0 и 240.

  3. Ваш ответ может принимать аргументы командной строки или читать ввод от пользователя или функции.

  4. Вывод не должен быть заключен в кавычки.

  5. Вывод должен быть распечатан, а не возвращен.

Leaderboard:

Результат:

Это связь между CJam и Pyth. Принятие ответа CJam в том виде, как он был представлен до 35-байтового кода Пайта. Тем не менее, пожалуйста, продолжайте поощрять новые представления.

Васу Адари
источник
2
@quintopia Согласно правилам сайта , нет. Вы можете использовать функцию, если хотите.
дверная ручка
1
Технически, я (и я держу пари, что другие люди) может читать "150 минут".
PyRulez
1
Зачем ограничивать> 59 минут? Кроме того, я предпочитаю от 61 минуты до 1 часа 1 минуты и очень не хотел бы видеть 1 час 0 минут
markshancock
6
Вы изменили диапазон ввода на 0-240, но не включили ни одного теста менее 60. Я рекомендую придерживаться исходного диапазона, учитывая, что 28 ответов уже опубликованы.
Алекс А.
2
Похоже, вы также изменили приемлемый вывод для целых часов. Если в задаче нет явных проблем, которые необходимо устранить, не вносите изменения в задачу, которые лишают законной силы существующие ответы.
Алекс А.

Ответы:

10

CJam, 39 35 байт

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

Попробуйте онлайн

Последняя версия включает в себя улучшения, предложенные @ MartinBüttner, в частности использование поэлементного векторного оператора вместо транспонирования двух списков.

Объяснение:

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*(Похоже, это дает вам довольно серьезное преимущество в этом испытании :))
Мартин Эндер
@ MartinBüttner r"utehour"+6/W%на самом деле такой же длины "hour minute"S/, что и часть не помогает. Я думаю, что раньше видел .использованный блок, но я снова забыл, что он поддерживается.
Рето Коради
Ах да, я сначала опубликовал 36-байтовую версию, где это действительно помогло (но затем удалил комментарий и заменил его 35-байтовой версией, где это уже не имеет значения).
Мартин Эндер
19

Python 3, 50 67 119 116 112 111 104 94 байта

Я не люблю возвращаться к %форматированию строк в стиле, но это экономит 6 байт .format.

Редактировать: забыл разобрать вход.

Изменить: Забыл обрабатывать множественное число.

Редактировать: Yay лямбды!

Редактировать: Добавлено разукраска

Редактировать: Черт возьми. Лямбда не помогла.

Изменить: Поскольку минуты имеют максимум три цифры и int()не обращают внимания на пробелы в строке, я могу сохранить несколько байтов с помощью 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)
Sherlock9
источник
22
Ах! Увеличение по счету! +1 за то, что не сдался ;-)
agtoever
9

JavaScript, 78 байт

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>

Для набора тестов введите ввод, как "61 min"в поле ввода.


объяснение

n=>                 //Define anonymous function w/ parameter n
(h=                 //start building the string to return with h, the # of hours
(n=parseInt(n))     //parse input for n
/60|0)+             //set h to floor(n / 60)
` hour              //add ' hour' to the string to return
${h-1?"s":""}       //add 's' to the string to return if h != 1, else add ''
                    //<--(a single space) add ' ' to the string to return
${m=n%60}           //set m, the # of miuntes, to n % 60, and add it to the string to return
 minute`+           //add ' minute' to the string to return
(m-1?"s":"")        //add 's' to the string to return if m != 1, else add ''
                    //implicitly return
jrich
источник
Хороший. Предложение: уменьшить parseInt(n)до +n.
Никель
1
Ввод не будет просто целым числом. Это не удается, когда я предоставляю вход как 150 min.
Васу Адари
1
@VasuAdari Это работает для меня, выводы 2 hours 30 minutes. Могу я спросить, как вы это проверили?
Янв
3
@ ev3commander При использовании тестового фрагмента заключите его в кавычки, чтобы он распознавался как строка. например, "61 min"или'61 min'
Jrich
1
+1 для JavaScript. Теперь вам просто нужно сделать из этого букмаркет ;)
MayorMonty
6

Pyth, 39 38 байт

jd.iJ.Dv-zG60+Vc"hour minute")m*\s>d1J
orlp
источник
5

Витси , 57 54 52 байта

Ого, у меня даже нет целых чисел в моем языке. оо

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.

Попробуйте онлайн!

Аддисон Крамп
источник
4

К5, 55 51 байт

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

Это более общее, чем должно быть; может все еще играть в гольф дальше.

В бою:

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

Редактировать:

Эта программа прошла несколько очень разных итераций в процессе разработки, и я подумал, что было бы более полезно показать некоторые промежуточные этапы.

Здесь был мой первый удар по проблеме, прежде чем было введено требование плюрализации. Здесь есть четкое повторение:

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

Я понял, что основным способом обработки разметки мест является форма «декодирования» K5. Чтобы поместить значения в строку в строке, я использовал примитив dot-apply, который применяет список аргументов к функции и распаковывает список в отдельные параметры:

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

Здесь не так много избыточности. Когда было добавлено множественное число, я разложил эту ведущую анонимную функцию в преобразование, которое я мог применить к каждому числу, например так:

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

Присоединяйтесь x, yи либо, sлибо ничего, в зависимости от того x, равно ли «1». В конечном счете, это сработало лучше, чтобы изменить порядок аргументов этой функции.

Изменить 2:

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

Несколько небольших улучшений здесь. Лучший способ выбора «s» или пустой строки, более короткая константа для «decode», которая отражает ограниченный диапазон ввода, и более простой способ отбрасывания «min».

Johne
источник
4

Pyth, 46 байтов

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

Принимает вход как x minи выходыx hours y minutes

Попробуй здесь

Объяснение:

   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 байта

80 байт оригинал

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

Использование:

.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

Из-за изменения в вопросе я могу удалить x?$mиз конца функции, что позволяет мне уменьшить его еще на 3 байта.

{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
Брэд Гилберт b2gills
источник
3

JavaScript (ES6), 100 94 89 81 байт

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

De-golfed demo (преобразован в ES5, так как не все браузеры пока поддерживают 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()))

nicael
источник
Вы можете обернуть t=parseInt(t)и скобка, а затем положить , что где бы вы первым использовать tтак: (h=0|(t=parseInt(t))/60). Таким образом, вы можете удалить возврат и{}
Downgoat
@ Downgoat Я уже пробовал, но по какой-то причине это не сработало. Попробую еще раз.
Никель
1
@ Downgoat По-видимому, раньше я допустил ошибку, теперь она работает правильно. Спасибо :)
Nicael
ИСПОЛЬЗОВАТЬ ШАБЛОНЫ ШАБЛОНОВ. $ {} !!!
Mama Fun Roll
3

C #, 127 байт

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

Это можно поместить в файл и запустить через интерактивную оболочку C #, которая поставляется с Mono, с использованием конфигурации по умолчанию.

[Это моя первая попытка кода в гольф. Я надеюсь, что мой вклад не нарушает никаких правил.]

Гильберт
источник
3

C 89 байтов

main(n){scanf("%d",&n);printf("%d hour%s %d minute%s",n/60,"s"+119/n,n%60,"s"+(n%60<2));}
xsot
источник
3

Рубин, 75 байтов

a,b=gets.to_i.divmod 60;$><<"#{a} hour#{a>1??s:''} #{b} minute#{b>1??s:''}"
Петр Ленкефи
источник
Иногда даже пустая строка слишком длинная. ''p.
Манатворк
2

MATLAB, 111 108 106 байтов

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

Это также работает с Octave и может быть опробовано здесь . Ссылка на рабочую область, уже содержащую код в файле с именем runningLength.m. Чтобы проверить это просто введитеrunningLength в приглашении, а затем введите строку ввода, например, '123 mins'и он будет отображать вывод.

Принимает входные данные в виде строки, например '123 mins', преобразует их в число (которое неявно игнорирует minsбит).

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

Минуты и часы рассчитываются

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

Затем отображает строку вывода

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

Бит 's' вывода рассчитывается и обрабатывается правильно - 's' добавляется всякий раз, когда число не равно 1.

Том Карпентер
источник
2

Python 2, 96 байт

i=int(raw_input().split()[0])
print"%d hour%s %d minute%s"%(i/60,"s"*(i>120),i%60,"s"*(i%60!=1))
quintopia
источник
7
Это не похоже на правильную обработку множественного числа.
дверная ручка
@Doorknob Это то, что происходит, когда правила меняются после
публикации
2

Haskell, 117 109 байт

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

Менее гольф-версия:

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это функция, которая берет первые 3 символа своего ввода и преобразует их в целое число. p#qэто функция, которая плюрализует, qеслиp не равен 1. Чтобы вернуть результат без окружающих кавычек, я использовалputStr для вывода результата в STDOUT.

Спасибо Ними за помощь!

Крейг Рой
источник
2

Python 2, 79 77 байт

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

Первые 3 символа ввода просто анализируются как целое число. Это работает только потому, что третий символ в двузначном вводе - это пробел, который intбудет игнорироваться во время преобразования.

xsot
источник
Я думаю, что вы можете просто так "hour"+m/120*"s"и делать в течение нескольких минут.
xnor
К m=240сожалению, это не удастся .
xsot
2

LabVIEW, 50 байт

Это посчитано в соответствии с моим предложением о Meta .

Код довольно прост: возьмите число из входных данных по модулю на 60 и добавьте s в течение минут! = 1. Другая сторона регистра просто пропускает строку.

enter image description here

Eumel
источник
2

Scala, 135 байт

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

Использование:

a("120 min")
2 hours 0 minute
Васу Адари
источник
2

Haskell, 107 101 байт

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!nЗависит nот s, добавляя 's'в конце, если n /= 1.

f xделает форматирование после использования divMod.

Так как мы можем взять на себя максимальный вход 240, take 3достаточно взять только номер.

(Пришлось действительно изо всех сил, чтобы побить счет @Craig Roy ...)

Actorclavilis
источник
2

R, 112 байт

Редактировать : Исправлена ​​ошибка определения объема, а затем устранена проблема вывода предложения.

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

Контрольные примеры

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

Я пытался сэкономить место, пытаясь найти способ просто добавлять или вычитать «s» по мере необходимости, но мне пришлось возиться с sep =аргументом вpaste() функции, и на самом деле не казалось, что он собирается сэкономить мне очень много места. Какие-либо предложения?

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

При округлении с помощью input / 60 или input %% 60 (mod) отображаются часы и минуты соответственно. Объедините их в цепочку вместе с ifelse()утверждением, которое указывает, являются ли единицы измерения часами или минутами.

syntonicC
источник
Вывод не должен быть заключен в кавычки.
Васу Адари
@Vasu Adari Исправлено с помощью cat()функции.
syntonicC
1
Вы можете сэкономить байты, обрабатывая множественное число с помощью только s и изменяя ваши условия.
Васу Адари
1

Рубин, 97 100 99 88 байт

Редактировать: Исправление вывода.

Изменить: удаление скобок из divmod.

Изменить: Yay строки интерполяции! Спасибо Васу Адари . Кроме того, лучше не играть в гольф.

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
Sherlock9
источник
o / p не следует заключать в кавычки.
Васу Адари
@VasuAdari Fixed
Sherlock9
Вы можете потерять брекеты для divmodметода. Также с помощью строковой интерполяции вы можете сохранить несколько байтов.
Васу Адари
@VasuAdari Я знаю, что iterpolation строки это вещь, но я не уверен, что это такое и как это работает. Спасибо за помощь
Sherlock9
@VasuAdari Ой, подожди. Google научил меня тому, что мне нужно знать. Позвольте мне получить редактирование.
Sherlock9
1

Go, 177 байт

(Включает только функцию и операторы импорта)

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

Красивое решение -

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

Тестирование это -

func main() {
    ip_list := []string{
        "120 min",
        "150 min",
        "60 min",
    }

    for _, ip_val := range ip_list {
        f(ip_val)
        fmt.Println("")
    }
}

/* OUTPUT
2 Hours 0 Minute
2 Hours 30 Minutes
1 Hour 0 Minute
*/
Kamehameha
источник
1

Mathematica, 61 байт

Print@ToString[Quantity@#~UnitConvert~MixedRadix["h","min"]]&
LegionMammal978
источник
1

AutoHotkey , 174 170 160 байт

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

Заметки:

  1. Ввод из буфера обмена
  2. Вывод распечаток в любую форму нажатием x
  3. Правильно обрабатывает множественное число
  4. Может быть меньше, но я хотел предоставить One Liner.
errorseven
источник
1

PHP, 77 76 байт

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

ужасный, ужасный, ужасный!
PHP выдает только пару Noticeс"s"[$h<2]

Для запуска: php -r 'CODE' '150 minutes'
и, конечно, отключить / выводить отчеты об ошибках из stdout!

Редактировать: -1байт назначить в присвоении (кредит: вставить имя пользователя здесь)

Это так ужасно, я должен дать помощнику по запуску для пользователей Linux:

php -c /usr/share/php5/php.ini-production.cli -r 'CODE' '61 min'
CSᵠ
источник
На 1 байт меньше $m=($i=$argv[1])%60;echo$h=$i/60|0," hour","s"[$h<2]," $m minute","s"[$m<2];.
insertusername здесь
@insertusername здесь хорошо, спасибо! сумасшедший
CSᵠ
Пожалуйста. Даже на 4 байта меньше (был слишком устал, чтобы заметить вчера) $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
insertusername здесь
@insertusernamehere, это действительно очень неприятный старый, но не могу поверить, что это работает для php 5.6-7, а не для 5.3-5.5
CSᵠ
Я протестировал его с PHP 5.6.10 (OS X), и он работает здесь. :)
insertusername здесь
1

Arcyóu (неконкурентный), 93 байта

В этом представлении используется версия языка, созданного после этого конкурса.

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

Иш! Этот язык нуждается в лучшей обработке строк.

Объяснение:

(: x              ; Set x
  (#              ; Cast to int
    ((v (l)) 0))) ; First element of input split on spaces
(: h (#/ x 60))   ; Set h to the hours
(: m (% x 60))    ; Set m to the minutes
(%                ; String format
  "%d hour%s %d minute%s"
  ('              ; List
    h             ; Hours
    (* s([ h))    ; Evaluates to 's' if h is not 1
    m             ; Minutes 
    (* s([ m      ; Evaluates to 's' is m is not 1
bkul
источник
1

Рубин, 74 73 71 байт

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

73 байта

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

74 байта:

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

Использование:

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

Котлин, 132 байта

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

Безголовая версия:

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

Проверьте это с:

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

Пример выходов:

2 hours 30 minutes
1 hour 30 minutes
1 hour 1 minute
1 hour 0 minutes
succcubbus
источник
1
Добро пожаловать в PPCG.SE! Я отредактировал ваш пост, чтобы он выглядел более эстетично. Повеселись!
GamrCorps
1

Серьезно , 77 байт

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

Серьезно, серьезно не умеет манипулировать струнами. Попробуйте онлайн с подробным объяснением (вам нужно будет ввести ввод вручную, "210 mins"потому что постоянные ссылки не любят кавычки).

Быстрое и грязное объяснение:

ε" min",Æ≈            get input, replace " min" with the empty string, convert to int
;:60:@\@:60:@%        calculate divmod
'sε(;)1≥I"%d hour"+   push "%d hour" or "%d hours", depending on whether pluralization is needed
(#@%                  format "%d hour(s)" with the # of hours calculated earlier
'sε(;)1≥I"%d minute"+ same as above, but with minutes
(#@%                  same as above, but with minutes
@k' j                 swap the order and join with a space to get "X hour(s) X minute(s)"
Mego
источник
Ваша ссылка не работает
TanMath
1

Java 8, 148 байт

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

Я решил опубликовать альтернативу @TheAustralianBirdEatingLouse, поскольку она не только значительно дешевле (~ 10%), но и более точна в часах и минутах печати вместо сокращенных часов и минут. Реализации методов в интерфейсах являются новыми для Java 8 - так что это необходимо для компиляции / запуска

janschweizer
источник