Тривалість фільму у читаному для людини форматі


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. Вихід повинен бути надрукований, а не повернутий.

Табло:

Результат:

Його зв'язок між CJam та Pyth. Прийнявши відповідь CJam, як вона була подана перед 35-байтним кодом Pyth. Однак, будь ласка, продовжуйте заохочувати нові подання.


2
@quintopia Відповідно до правил сайту , немає. Ви можете використовувати функцію, якщо хочете.
Дверна ручка

1
У технічному плані я (і, маю на заклад інших людей) можу прочитати "150 хвилин".
PyRulez

1
Чому обмежуватись> 59 хвилинами? Крім того, я віддаю перевагу від 61 хвилини до 1 години 1 хвилину, і мені б дуже не
шкода

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

Пітон 3, 50 67 119 116 112 111 104 94 байт

Мені не подобається повертатися до %-style форматування рядків, але це економить 6 байт .format.

Редагувати: Забули проаналізувати введення.

Редагувати: Забули обробляти множини.

Редагувати: Yay lambdas!

Редагувати: Додано ungolfing

Редагувати: Дарт. Лямбдас не допоміг.

Редагувати: Оскільки в хвилинах є максимум три цифри, і int()це не заважає пробілам у рядку, я можу зберегти кілька байтів за допомогою input()[:3].

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

Безголівки:

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
Ах! Збільшення кількості рахунків! +1 за не
здавання

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

Хороший. Пропозиція: зменшити parseInt(n)до +n.
nicael

1
Введення не буде лише цілим числом. Він не вдається, коли я надаю введення як 150 min.
Vasu Adari

1
@VasuAdari Це працює на мене, виводить 2 hours 30 minutes. Чи можу я запитати, як ви це тестували?
jrich

3
@ ev3commander Використовуючи фрагмент тесту, оберніть його в лапки, щоб він був розпізнаний як рядок. наприклад "61 min"або'61 min'
jrich

1
+1 для JavaScript. Тепер ви просто повинні зробити це закладкою ;)
мерМонти


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. Для розміщення значень місця в рядку я використав примітив "застосовувати крапки", який застосовує список аргументів до функції та розпаковує список за окремими параметрами:

{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" або порожнього рядка, коротша константа для "декодування", яка відображає обмежений діапазон введення, та більш простий спосіб відкидання "min".


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

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

Демо-гольф демо (перетворений на 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()))


Ви можете обернути t=parseInt(t)і дужка, а потім покласти , що де б ви першим використовувати tтак: (h=0|(t=parseInt(t))/60). Таким чином, ви можете видалити повернення і{}
Пуховик

@Downgoat Я вже намагався, але це чомусь не вийшло. Спробую ще раз.
nicael

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


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

7
Здається, це неправильно обробляти множини.
Дверна ручка

@Doorknob Це те, що відбувається, коли правила змінюються після публікації відповідей :)
quintopia

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 буде ігноруватися під час перетворення.


Я думаю, що ти можеш зробити "hour"+m/120*"s"так само і хвилин.
xnor

На m=240жаль, не вдасться .
xsot


2

Скала, 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

Безголівки:

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


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() функції, і це насправді не здавалося, що це дозволить заощадити мені дуже багато місця. Будь-які пропозиції?

Безумовно

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()твердженням, яке визначає, чи є одиниці годин чи хвилин або хвилин.


Вихідні дані не повинні входити до лапок.
Васу Адарі

@Vasu Adari Виправлено це за допомогою cat()функції.
syntonicC

1
Ви можете зберегти байти, обробляючи множину, справедливо s та змінюючи свої умови.
Васу Адарі

1

Рубі, 97 100 99 88 байт

Редагувати: Виправлення виводу.

Редагування: видалення брекетів з divmod.

Редагувати: Yay string interpolation! Спасибі Васю Адарі . Також краще унгольфінг.

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

Безголівки:

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 не слід включати в лапки.
Vasu Adari

@VasuAdari Виправлено
Sherlock9

Ви можете втратити дужки за divmodметодом. Також за допомогою рядкової інтерполяції ви можете зберегти кілька байтів.
Vasu Adari

@VasuAdari Я знаю, що ітерполяція рядків - це річ, але я не впевнений, що це таке чи як він працює. Дякую за допомогу
Sherlock9

@VasuAdari На жаль, зачекайте. Google навчив мене тому, що мені потрібно знати. Дозвольте мені редагувати.
Шерлок9

1

Ідіть, 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
*/


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. Може бути меншим, але я хотів забезпечити один лайнер.

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'

1 байт менше: $m=($i=$argv[1])%60;echo$h=$i/60|0," hour","s"[$h<2]," $m minute","s"[$m<2];.
вставитикористувач туди

@insertusernameусь мило, спасибі! crazy
CSᵠ

Ласкаво просимо. Навіть 4 байта меншою (занадто втомився , щоб повідомлення вчора): $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
вставитикористувач туди

@insertusername, це справді неприємне старе, але не можу повірити, що воно працює для php 5.6-7, а не для
5.3-5.5

Я тестував його на PHP 5.6.10 (OS X), і він працює тут. :)
вставитикористувач туди

1

Арсіу (неконкурентоспроможний), 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

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

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

Ваше посилання не працює
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 - тому це знадобиться для компіляції / запуску

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.