Durasi film berjalan dalam format yang dapat dibaca manusia

24

Setiap kali saya mencari panjang film di IMDb, itu ditampilkan dalam hitungan menit. Segera saya akan mencoba mengubahnya menjadi jam dan menit. Akan lebih baik jika kita bisa mengotomatisasi ini.

Memasukkan:

150 min

Keluaran:

2 hours 30 minutes

Memasukkan:

90 min

Keluaran:

1 hour 30 minutes

Memasukkan:

61 min

Keluaran:

1 hour 1 minute

Memasukkan:

60 min

Keluaran:

1 hour 0 minute or 1 hour 0 minutes

Berikut ini kondisinya:

  1. Input dan Output harus dalam format yang tepat ini.

  2. Input menit akan antara 0 dan 240.

  3. Jawaban Anda dapat menerima argumen baris perintah atau membaca input dari pengguna atau fungsi.

  4. Output tidak boleh dilampirkan dalam tanda kutip.

  5. Keluaran harus dicetak, tidak dikembalikan.

Papan peringkat:

Hasil:

Ikatan antara CJam dan Pyth. Menerima jawaban CJam seperti yang disampaikan sebelum kode 35 byte Pyth. Namun, tolong terus mendorong pengiriman baru.

Vasu Adari
sumber
2
@quintopia Menurut aturan situs , no. Anda dapat menggunakan fungsi jika Anda mau.
Gagang Pintu
1
Secara teknis, saya (dan saya bertaruh manusia lain) dapat membaca "150 menit".
PyRulez
1
Mengapa membatasi> 59 menit? Juga, saya lebih suka 61 menit hingga 1 jam 1 menit dan benar-benar akan benci melihat 1 jam 0 menit
markshancock
6
Anda mengubah rentang input menjadi 0-240 tetapi belum menyertakan setiap kasus uji kurang dari 60. Saya sarankan tetap menggunakan rentang asli mengingat 28 jawaban telah diposting.
Alex A.
2
Tampaknya Anda juga mengubah output yang dapat diterima untuk seluruh jam. Kecuali ada tantangan yang memiliki masalah besar yang perlu diperbaiki, jangan lakukan perubahan pada tantangan yang membatalkan jawaban yang ada.
Alex A.

Jawaban:

10

CJam, 39 35 byte

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

Cobalah online

Versi terbaru mencakup perbaikan yang disarankan oleh @ MartinBüttner, khususnya menggunakan operator vektor elemen-bijaksana alih-alih mentransposisi dua daftar.

Penjelasan:

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.
Reto Koradi
sumber
1
35: ri60md]r"utehour"+6/W%.{1$1>'s*+}S*(Sepertinya ini memberi Anda petunjuk yang cukup kuat tentang tantangan ini :))
Martin Ender
@ MartinBüttner r"utehour"+6/W%sebenarnya panjangnya sama "hour minute"S/, sehingga bagian itu akhirnya tidak membantu. Saya pikir saya pernah melihat .digunakan dengan blok sebelumnya, tetapi saya lupa lagi bahwa itu didukung.
Reto Koradi
Ah, benar, saya pertama kali memposting versi 36-byte di mana itu benar-benar membantu (tapi kemudian menghapus komentar dan menggantinya dengan versi 35-byte di mana tidak masalah lagi).
Martin Ender
19

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

Saya tidak suka kembali ke %format string-gaya, tetapi menghemat 6 byte .format.

Sunting: Lupa input parse.

Sunting: Lupa menangani bentuk jamak.

Sunting: Yay lambdas!

Sunting: Menambahkan ungolfing

Edit: Sial. Lambdas tidak membantu.

Sunting: Karena menit memiliki maksimum tiga digit, dan int()tidak keberatan spasi dalam string, saya dapat menyimpan beberapa byte dengan menggunakan input()[:3].

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

Tidak Disatukan:

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
sumber
22
Ah! Meningkatkan bytecount! +1 karena tidak menyerah ;-)
agtoever
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>

Untuk suite tes, masukkan input seperti "61 min"ke dalam kotak input.


Penjelasan

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
sumber
Bagus Saran: kurangi parseInt(n)menjadi +n.
nicael
1
Input tidak hanya berupa integer. Gagal ketika saya memberikan input sebagai 150 min.
Vasu Adari
1
@VasuAdari Ini berfungsi untuk saya, keluaran 2 hours 30 minutes. Bolehkah saya bertanya bagaimana Anda mengujinya?
jrich
3
@ ev3commander Saat menggunakan cuplikan tes, bungkus input dengan tanda kutip sehingga dikenali sebagai string. misalnya "61 min"atau'61 min'
jrich
1
+1 Untuk JavaScript. Sekarang Anda hanya perlu membuatnya menjadi buklet buku ;)
MayorMonty
6

Pyth, 39 38 byte

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

Vitsy , 57 54 52 byte

Oh, wow, saya bahkan tidak memiliki bilangan bulat dalam bahasa saya. 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.

Cobalah online!

Addison Crump
sumber
4

K5, 55 51 byte

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

Ini lebih umum daripada yang seharusnya; mungkin masih golf lebih jauh.

Beraksi:

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

Edit:

Program ini melewati beberapa iterasi yang sangat berbeda selama pengembangan, dan saya pikir mungkin akan lebih mencerahkan untuk menunjukkan beberapa langkah menengah.

Inilah penusukan pertama saya pada masalah, sebelum persyaratan pluralisasi diperkenalkan. Ada pengulangan yang jelas di sini:

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

Saya menyadari bahwa cara umum untuk menangani casting keluar dari tempat adalah bentuk "decode" K5. Untuk memasukkan nilai slot ke dalam string saya menggunakan primitif "dot-apply", yang menerapkan daftar argumen ke suatu fungsi dan membongkar daftar ke dalam parameter individual:

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

Tidak banyak redundansi yang tersisa di sini. Ketika pluralisasi ditambahkan, saya mendekomposisi fungsi anonim yang mengarah ke transformasi yang bisa saya terapkan pada setiap angka, seperti ini:

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

Bergabunglah x,, ydan salah satu satau tidak sama sekali, tergantung apakah xsama dengan "1". Pada akhirnya itu bekerja lebih baik untuk membalik urutan argumen ke fungsi ini.

Edit 2:

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

Beberapa perbaikan kecil di sini. Cara yang lebih baik untuk memilih "s" atau string kosong, konstanta yang lebih pendek untuk "decode" yang mencerminkan jangkauan input yang terbatas, dan cara yang lebih sederhana untuk membuang "min".

JohnE
sumber
4

Pyth, 46 byte

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

Mengambil input x mindan outputx hours y minutes

Cobalah di Sini

Penjelasan:

   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
Biru
sumber
3

Perl 6 , 80 73 byte

80 byte asli

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

Pemakaian:

.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

Karena perubahan dalam pertanyaan saya dapat menghapus x?$mdari akhir fungsi, yang memungkinkan saya untuk mengurangi 3 byte lebih banyak.

{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
Brad Gilbert b2gills
sumber
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 (dikonversi ke ES5, karena belum semua browser mendukung 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
sumber
Anda bisa membungkus t=parseInt(t)dan kurung, dan kemudian menempatkan bahwa di mana pun Anda pertama kali menggunakan tbegitu: (h=0|(t=parseInt(t))/60). Dengan cara ini, Anda dapat menghapus kembalinya dan{}
Downgoat
@Downgoat Saya sudah mencoba tetapi tidak berhasil karena suatu alasan. Akan coba lagi.
nicael
1
@Downgoat Rupanya saya telah melakukan kesalahan sebelumnya, sekarang berfungsi dengan baik. Terima kasih :)
nicael
GUNAKAN STRING TEMPLATE. $ {} !!!
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":""));

Ini bisa dimasukkan ke dalam file dan dijalankan melalui shell interaktif C # yang datang dengan Mono, menggunakan konfigurasi default.

[Ini adalah upaya pertama saya di kode golf. Saya berharap kontribusi saya tidak melanggar aturan apa pun.]

Hilbert
sumber
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));}
xsot
sumber
3

Ruby, 75 byte

a,b=gets.to_i.divmod 60;$><<"#{a} hour#{a>1??s:''} #{b} minute#{b>1??s:''}"
Peter Lenkefi
sumber
Terkadang bahkan string kosong terlalu panjang. ''p.
manatwork
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))

Ini juga berfungsi dengan Oktaf , dan dapat dicoba sini . Tautan ke ruang kerja yang sudah berisi kode dalam file bernama runningLength.m. Jadi untuk mengujinya cukup masukkanrunningLength pada prompt, lalu masukkan string input, misalnya '123 mins'dan itu akan menampilkan output.

Mengambil input sebagai string, mis '123 mins' , mengubahnya menjadi angka (yang secara implisit mengabaikan minsbit).

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

Menit dan jam kemudian dihitung

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

Kemudian menampilkan string output

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

Bit keluaran dihitung dan ditangani dengan benar - an 'ditambahkan' setiap kali angkanya 1.

Tom Carpenter
sumber
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))
kuintopia
sumber
7
Ini tampaknya tidak menangani bentuk jamak dengan benar.
Gagang Pintu
@Doorknob Inilah yang terjadi ketika aturan diubah setelah jawaban diposting :)
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"]

Versi yang kurang 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"]

fadalah fungsi yang mengambil 3 karakter pertama dari inputnya dan mengubahnya menjadi integer. p#qadalah fungsi yang majemuk qjikap tidak sama dengan 1. Untuk mengembalikan hasil tanpa tanda kutip di sekitarnya, saya biasa putStrmencetak hasilnya ke STDOUT.

Terima kasih kepada nimi untuk bantuannya!

Craig Roy
sumber
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]

3 karakter pertama dari input hanya diurai sebagai integer. Ini hanya berfungsi karena karakter ketiga dalam input 2 digit adalah spasi, yang intakan diabaikan selama konversi.

xsot
sumber
Saya pikir Anda bisa melakukan "hour"+m/120*"s"dan juga selama beberapa menit.
xnor
Sayangnya, itu akan gagal m=240.
xsot
2

LabVIEW, 50 Bytes

Ini dihitung berdasarkan saran saya di Meta .

Kode cukup lurus ke depan, ambil angka dari modulo input dengan 60 dan tambahkan s untuk menit! = 1. Sisi lain dari kasus hanya menempatkan string melalui.

enter image description here

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

Pemakaian:

a("120 min")
2 hours 0 minute
Vasu Adari
sumber
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

Tidak Disatukan:

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!nmenambahkan nke s, menambahkan a 's'ke akhir jika n /= 1.

f xmelakukan pemformatan setelah menggunakan divMod.

Karena kita dapat mengasumsikan input maksimum 240, take 3cukup untuk hanya mengambil nomor.

(Harus berusaha sangat keras untuk mengalahkan skor @Craig Roy ...)

Actorclavilis
sumber
2

R, 112 byte

Sunting : Memperbaiki kesalahan pelingkupan dan kemudian mengatasi masalah keluaran kutipan.

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

Uji kasus

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

Saya mencoba menghemat ruang dengan mencoba menemukan cara untuk menambah atau mengurangi "s" seperlunya tetapi saya harus mengacaukan sep =argumen dipaste() fungsi dan sepertinya tidak akan menghemat banyak ruang. Ada saran?

Tidak disatukan

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

Pembulatan dengan input / 60 atau input %% 60 (mod) memberikan jam dan menit masing-masing. Rantai mereka bersama-sama dengan ifelse()pernyataan yang menentukan apakah unit adalah jam atau menit.

syntonicC
sumber
Output tidak boleh dilampirkan dalam tanda kutip.
Vasu Adari
@Vasu Adari Memperbaikinya menggunakan cat()fungsi.
syntonicC
1
Anda dapat menyimpan byte dengan menangani jamak dengan s dan dengan mengubah kondisi Anda.
Vasu Adari
1

Ruby, 97 100 99 88 byte

Sunting: Memperbaiki output.

Sunting: Menghapus kawat gigi dari divmod.

Sunting: Yay interpolasi string! Terima kasih kepada Vasu Adari . Juga, ungolfing lebih baik.

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

Tidak Disatukan:

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
sumber
o / p tidak boleh dilampirkan dalam tanda kutip.
Vasu Adari
@VasuAdari Tetap
Sherlock9
Anda bisa kehilangan kawat gigi untuk divmodmetode. Juga dengan menggunakan interpolasi string Anda dapat menghemat beberapa byte.
Vasu Adari
@VasuAdari Saya menyadari bahwa iterpolasi string adalah sesuatu, tapi saya tidak yakin apa itu atau bagaimana cara kerjanya. Terima kasih atas bantuannya
Sherlock9
@VasuAdari Oop, tunggu. Google telah mengajari saya apa yang perlu saya ketahui. Biarkan saya mengedit.
Sherlock9
1

Pergi, 177 Bytes

(Ini hanya mencakup fungsi dan pernyataan impor)

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

Solusi cantik -

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

Mengujinya -

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

Mathematica, 61 byte

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

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

Catatan:

  1. Masukan dari Clipboard
  2. Output mencetak ke bentuk apa pun dengan menekan x
  3. Menangani bentuk jamak dengan benar
  4. Bisa jadi lebih kecil tapi saya ingin menyediakan One Liner.
errorseven
sumber
1

PHP, 77 76 byte

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

mengerikan, mengerikan, mengerikan!
PHP hanya mengeluarkan beberapa Noticeuntuk"s"[$h<2]

Untuk menjalankan: php -r 'CODE' '150 minutes'
dan tentu saja matikan pelaporan off / away from stdout!

Edit: -1byte assign in assign (kredit: insertusernamehere)

Ini sangat jelek, saya harus memberikan run helper untuk pengguna linux:

php -c /usr/share/php5/php.ini-production.cli -r 'CODE' '61 min'
CSᵠ
sumber
1 byte kurang: $m=($i=$argv[1])%60;echo$h=$i/60|0," hour","s"[$h<2]," $m minute","s"[$m<2];.
masukkan nama pengguna di sini
@insertusername ada bagus, terima kasih! crazy
CSᵠ
You're welcome. Even 4 bytes lesser (was too tired to notice yesterday): $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];.
insertusernamehere
@insertusernamehere that's a really nasty old one, but can't believe it works for php 5.6-7 and not for 5.3-5.5
CSᵠ
Saya sudah mengujinya dengan PHP 5.6.10 (OS X) dan berfungsi di sini. :)
insertusernamehere
1

Arcyóu (non-kompetitif), 93 byte

Kiriman ini menggunakan versi bahasa yang dibuat setelah tantangan ini.

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

Ya! Bahasa ini membutuhkan manipulasi string yang lebih baik.

Penjelasan:

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

Ruby, 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:''}"}

Pemakaian:

->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
Vasu Adari
sumber
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")}

Versi Tidak Serigala:

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

Uji dengan:

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

Output contoh:

2 hours 30 minutes
1 hour 30 minutes
1 hour 1 minute
1 hour 0 minutes
succcubbus
sumber
1
Welcome to PPCG.SE! I have edited your post to make is look more aesthetically pleasing. Have fun!
GamrCorps
1

Seriously, 77 bytes

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

Seriously is seriously not good at string manipulation. Try it online with full explanation (you will need to manually enter the input like "210 mins" because permalinks don't like quotes).

Quick and dirty explanation:

ε" 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
sumber
Your link does not work
TanMath
1

Java 8, 148 Bytes

interface S{static void main(String[]b){int a=new Integer(b[0]),h=a/60,m=a%60;System.out.printf(h+" hour%s "+m+" minute%s",h>1?"s":"",m>1?"s":"");}}

I chose to post an alternative to @TheAustralianBirdEatingLouse as this is not only shorter by a good deal (~10%) but also more correct in printing hour(s) and minutes(s) instead of abbreviated hrs and mins. Method implementations in Interfaces are new to Java 8 - so this would be needed to compile/run

janschweizer
sumber