ความยาวของภาพยนตร์ในรูปแบบที่มนุษย์อ่านได้


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 ตามกฎของไซต์หมายเลข คุณสามารถใช้ฟังก์ชั่นได้ถ้าต้องการ
Doorknob

1
ในทางเทคนิคแล้วฉัน (และฉันพนันว่าคนอื่น) สามารถอ่าน "150 นาที"
PyRulez

1
ทำไมถึง จำกัด > 59 นาที นอกจากนี้ฉันชอบ 61 นาทีถึง 1 ชั่วโมง 1 นาทีและเกลียดที่จะเห็น 1 ชั่วโมง 0 นาที
จริงๆ

6
คุณเปลี่ยนช่วงอินพุตเป็น 0-240 แต่ไม่ได้รวมกรณีทดสอบใด ๆ ที่น้อยกว่า 60 ฉันขอแนะนำให้ผสานกับช่วงเดิมโดยให้คำตอบ 28 คำตอบถูกโพสต์แล้ว
Alex A.

2
ดูเหมือนว่าคุณจะเปลี่ยนเอาต์พุตที่ยอมรับได้ตลอดทั้งชั่วโมงด้วย หากไม่มีความท้าทายที่ส่งเสียงปัญหาที่ต้องแก้ไขโปรดอย่าเปลี่ยนแปลงความท้าทายที่ทำให้คำตอบที่มีอยู่นั้นไม่ถูกต้อง
Alex A.

คำตอบ:


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/กันดังนั้นส่วนนั้นจึงไม่ช่วย ฉันคิดว่าฉันเคยเห็นเคย.ใช้กับบล็อกมาก่อน แต่ฉันลืมอีกครั้งว่ามันรองรับ
Reto Koradi

อ่าใช่ฉันได้โพสต์รุ่นที่มีขนาด 36 ไบต์ซึ่งช่วยได้จริง (แต่ก็ลบความคิดเห็นและแทนที่ด้วยรุ่น 35 ไบต์ที่มันไม่สำคัญอีกต่อไป)
Martin Ender

19

Python 3, 50 67 119 116 112 111 104 94 ไบต์

ฉันไม่ได้รักที่จะกลับไป%จัดรูปแบบสตริงสไตล์ แต่ประหยัด 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]))

Ungolfed:

string = input()[:3]
hours, minutes = divmod(int(string), 60)
a = string(div)
b = "hour" + ("s" if hours == 1 else "")
c = string(mod)
d = "minute" + ("s" if minutes == 1 else "")
print(a, b, c, d)

22
Ah! เพิ่มจำนวน bytec! +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

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

K5, 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 ในการเสียบค่าสล็อตเข้ากับสตริงฉันใช้ primitive "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" หรือสตริงว่างเปล่าค่าคงที่ที่สั้นกว่าสำหรับ "ถอดรหัส" ซึ่งสะท้อนถึงช่วงอินพุตที่ จำกัด และวิธีที่ง่ายกว่าในการทิ้ง "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':'')

การสาธิต De-golfed (แปลงเป็น 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

@ 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 โดยใช้การกำหนดค่าเริ่มต้น

[นี่เป็นความพยายามครั้งแรกของฉันที่การตีกอล์ฟ ฉันหวังว่าการมีส่วนร่วมของฉันจะไม่ละเมิดกฎใด ๆ ]




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

นี้ยังทำงานร่วมกับคู่และสามารถพยายามที่นี่ ลิงก์คือเวิร์กสเปซที่มีโค้ดอยู่ในไฟล์ชื่อ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

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

รุ่น golfed น้อยกว่า:

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

ขอบคุณ nimi สำหรับความช่วยเหลือ!


2

Python 2, 79 77 ไบต์

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

อักขระสามตัวแรกของอินพุตจะถูกวิเคราะห์คำแบบง่ายๆเป็นจำนวนเต็ม ใช้งานได้เพียงเพราะอักขระที่สามในอินพุต 2 หลักคือช่องว่างซึ่งintจะละเว้นในระหว่างการแปลง


ฉันคิดว่าคุณสามารถทำได้"hour"+m/120*"s"และในทำนองเดียวกันสำหรับนาที
xnor

มันจะล้มเหลวm=240แต่น่าเสียดายที่
xsot

2

LabVIEW 50 ไบต์

นี้จะนับตามข้อเสนอแนะของฉันใน Meta

รหัสค่อนข้างตรงไปตรงมาเอาตัวเลขจากอินพุต Modulo 60 และเพิ่ม s สำหรับนาที! = 1 อีกด้านหนึ่งของกรณีเพียงแค่ใส่สตริงผ่าน

ป้อนคำอธิบายรูปภาพที่นี่



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!nprepends nจะsเพิ่มถึงจุดสิ้นสุดถ้า's'n /= 1

f xdivModไม่จัดรูปแบบหลังจากที่ใช้

เนื่องจากเราสามารถสันนิษฐานได้ว่าการป้อนข้อมูลสูงสุด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()ฟังก์ชั่นและมันก็ไม่ได้ดูเหมือนว่ามันจะช่วยให้ฉันประหยัดพื้นที่ได้มาก ข้อเสนอแนะใด ๆ

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

การปัดเศษด้วยอินพุต / 60 หรืออินพุต %% 60 (mod) จะให้ชั่วโมงและนาทีตามลำดับ เชื่อมโยงพวกเขาเข้าด้วยกันด้วยifelse()คำสั่งที่ระบุว่าหน่วยเป็นชั่วโมงหรือนาที


ผลลัพธ์ไม่ควรอยู่ในเครื่องหมายคำพูด
Vasu Adari

@Vasu Adari แก้ไขโดยใช้cat()ฟังก์ชั่น
syntonicC

1
คุณสามารถบันทึกไบต์ด้วยการจัดการพหูพจน์ด้วยเพียง s และโดยการเปลี่ยนเงื่อนไขของคุณ
Vasu Adari

1

Ruby, 97 100 99 88 ไบต์

แก้ไข:แก้ไขเอาต์พุต

แก้ไข:divmodถอดเครื่องมือจัดฟันจาก

แก้ไข: การแก้ไขสตริงของ Yay! ขอขอบคุณที่วสุ Adari นอกจากนี้ยังดีกว่า ungolfing

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

Ungolfed:

input = gets                            Input
number = input.split[0].to_i            Get number, convert to int
hours, minutes = number.divmod 60       hours == s / 60, minutes == s % 60
result = hours.to_s+" hour"             Start with the hours
result += {hours == 1 ? "" : "s"}       Put in the first "s" if plural
result += minutes.to_s+" minute"        Add the minutes
result += {minutes == 1 ? "" : "s"}     Put in the second "s" if plural
puts result                             Output

o / p ไม่ควรอยู่ในเครื่องหมายคำพูด
Vasu Adari

@VasuAdari แก้ไขแล้ว
Sherlock9

คุณสามารถสูญเสียการจัดฟันสำหรับdivmodวิธีการ นอกจากนี้โดยใช้การแก้ไขสตริงคุณสามารถบันทึกไม่กี่ไบต์
Vasu Adari

@ VasuAdari ฉันรู้ว่าการแก้ไขสตริงเป็นสิ่งที่ แต่ฉันไม่แน่ใจว่ามันคืออะไรหรือมันทำงานอย่างไร ขอบคุณสำหรับความช่วยเหลือ
Sherlock9

@VasuAdari Oop รอ Google ได้สอนสิ่งที่ฉันต้องรู้ ขอผมแก้ไขหน่อย
Sherlock9

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. อาจมีขนาดเล็กลง แต่ฉันต้องการให้ One Liner

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!

แก้ไข: -1byte assign in assign (เครดิต: insertusernamehere)

มันน่าเกลียดมากฉันต้องให้ผู้ช่วยที่รันสำหรับผู้ใช้ 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 ที่นี่

@insertusername ที่นี่ดีขอบคุณ! บ้า
CSᵠ

ไม่เป็นไร แม้4 ไบต์น้อย $m=($i=$argv[1])%60;echo$h=$i/60|0," hour",s[$h<2]," $m minute",s[$m<2];(เหนื่อยเกินไปที่จะแจ้งให้ทราบเมื่อวานนี้):
insertusername ที่นี่

@insertusername ที่นี่เป็นสิ่งเก่าแก่ที่น่ารังเกียจจริงๆ แต่ก็ไม่สามารถเชื่อได้ว่ามันใช้งานได้กับ PHP 5.6-7 และไม่ใช่สำหรับ 5.3-5.5
CSᵠ

ฉันทดสอบด้วย PHP 5.6.10 (OS X) และใช้งานได้ที่นี่ :)
นี่

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

Yeesh! ภาษานี้ต้องการการจัดการสตริงที่ดีกว่า

คำอธิบาย:

(: 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 ไบต์

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

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

ฉันเลือกที่จะโพสต์ทางเลือกไปที่ @TheAustralianBirdEatingLouse เนื่องจากไม่เพียงสั้นกว่าข้อเสนอที่ดี (~ 10%) แต่ยังถูกต้องมากขึ้นในการพิมพ์ชั่วโมงและนาทีแทนที่จะย่อชั่วโมงและนาที วิธีการใช้งานในส่วนต่อประสานนั้นยังใหม่กับ Java 8 - ดังนั้นจึงจำเป็นต้องรวบรวม / เรียกใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.