เขาจะใช้เวลาขั้นต่ำกี่วันในการทำงานให้เสร็จสมบูรณ์จำนวนหน่วย


10

บุคคลที่มีสมบูรณ์Nหน่วยของการทำงาน; ลักษณะของงานเหมือนกัน

เพื่อที่จะได้รับการแขวนของการทำงานเขาเสร็จสิ้นเพียงหนึ่งหน่วยของการทำงานในวันแรก

เขาปรารถนาที่จะฉลองความสำเร็จของการทำงานเขาจึงตัดสินใจที่จะเสร็จสมบูรณ์หน่วยหนึ่งของการทำงานในวันสุดท้าย

เขาได้รับอนุญาตเท่านั้นที่จะเสร็จสมบูรณ์x, x+1หรือx-1หน่วยของการทำงานในแต่ละวันซึ่งxเป็นหน่วยงานที่ทำเสร็จเมื่อวันก่อน

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่จะคำนวณจำนวนวันขั้นต่ำที่เขาจะใช้ในNการทำงานให้เสร็จสมบูรณ์

ตัวอย่างอินพุตและ Ouput:

input -> output (corresponding work_per_day table)
-1    -> 0      []
0     -> 0      []
2     -> 2      [1,1]
3     -> 3      [1,1,1]
5     -> 4      [1,1,2,1] or [1,2,1,1]
9     -> 5      [1,2,3,2,1]
13    -> 7      [1,2,2,2,3,2,1]

อินพุตอาจถูกนำมาผ่านSTDINหรือเป็นอาร์กิวเมนต์ของฟังก์ชันหรือด้วยวิธีการที่เหมาะสม

ผลลัพธ์อาจถูกพิมพ์หรือเป็นผลลัพธ์ของฟังก์ชันหรือด้วยวิธีการที่เหมาะสม

นี่คือรหัสกอล์ฟทางออกที่สั้นที่สุดชนะ


1
คำแนะนำ: รายการจำนวนเต็มนี้อาจมีประโยชน์
แม่ชีที่รั่ว

1
ดังนั้นการป้อนข้อมูลถูก จำกัด ให้เป็นจำนวนเต็มบวกเนื่องจาก Kenny แสดงให้เห็นว่าเป็นไปได้ที่จะบรรลุจำนวนงานที่เป็นลบ หรืองานต่อวันถูก จำกัด ให้น้อยที่สุดเป็นศูนย์หรือไม่?
mbomb007

1
ทำไมคุณถึงยอมรับคำตอบของ Pyth? คำตอบ Jelly ของฉันคือ 3 ไบต์สั้นลง ...
Dennis

เฮ้ @ เดนนิสฉันต้องเข้าใจวิธีการและ @Kenny Lau ช่วยให้ฉันเข้าใจ
HarshGiri

ฉันใหม่สำหรับ CodeGolf ดังนั้นจึงต้องใช้เวลาพอสมควรในการทำความเข้าใจทุกสิ่งที่นี่อย่างสมบูรณ์
HarshGiri

คำตอบ:


3

เยลลี่ 5 ไบต์

×4’½Ḟ

นี้จะใช้รูปแบบปิดของ@ วิธี

ลองออนไลน์!

เนื่องจากเป็นเรื่องบังเอิญที่โชคดีมีการใช้งานมากเกินไปสำหรับfloor/ realสำหรับจำนวนจริง / ซับซ้อน นี่เป็นหนึ่งในสามอะตอมที่โอเวอร์โหลดมากที่สุดในเยลลี่

มันทำงานอย่างไร

×4’½Ḟ  Main link. Argument: n (integer)

×4     Compute 4n.
  ’    Decrement; yield 4n - 1.
   ½   Square root; yield sqrt(4n - 1).
       If n < 2, this produces an imaginary number.
    Ḟ  If sqrt(4n - 1) is real, round it down to the nearest integer.
       If sqrt(4n - 1) is complex, compute its real part (0).

1
หนึ่งไม่ได้เพียงแค่ ...
รั่วนูน

1
"บังเอิญโชคดี"
Arcturus

4

Pyth , 8 ไบต์

tfg/*TT4

มันทำงานอย่างไร:

tfg/*TT4   Q is implicitly assigned to the input.
 f         test for T=1,2,3,... returning the first successful case
   /*TT4   whether T * T / 4
  g     Q  is greater than or equal to the input (second argument implied)
t          and subtract 1 from the first successful case

ลองออนไลน์!

ในรหัสปลอม:

for(int T=1;;T++)
    if(T*T/4 >= Q)
        return T-1;

โบนัส 22 ไบต์

"ควรกลับ 7 สำหรับ -1"

+tfg/*TT4?>Q0Q-2Q1*4g1

ลองออนไลน์!


3

JavaScript (ES2016) ขนาด 24 ไบต์

เวอร์ชั่นย่อของตัวแปร ES6 ด้านล่างต้องขอบคุณ@FlorentและExponentiation Operator (ปัจจุบันเฉพาะใน Firefox ตอนกลางคืนสร้างหรือ transpilers)

n=>(n-1)**.5+(n+1)**.5|0

JavaScript (ES6), 30 ไบต์

n=>(s=Math.sqrt)(n-1)+s(n+1)|0

ขึ้นอยู่กับลำดับนี้

f=n=>(s=Math.sqrt)(n-1)+s(n+1)|0

units.oninput = () => output.value = f(+units.value||0);
<label>Units: <input id="units" type="number" value="0" /></label>
<label>Days: <input id="output" type="number" value="0" disabled /></label>


ยิ่งสั้นลงใน ES2016 (26 ตัวอักษร):f=n=>(n-1)**.5+(n+1)**.5|0
Florent

@ ขอบคุณว้าวขอบคุณมากไม่ทราบว่าผู้ดำเนินการยกกำลังจะเกิดขึ้น
George Reith

2

JavaScript, 32 31 ไบต์

f=(q,t=1)=>q>t*t/4?f(q,t+1):t-1

รหัสไม่ได้รับการตอบกลับ:

function f(q, t = 1) {
  return q > t * t / 4
    ? f(q, t + 1)
    : t - 1
}

มันใช้อัลกอริธึมแบบเดียวกับ Anwser ของ Kenny Lau แต่มันถูกนำไปใช้เป็นการปิดแบบเรียกซ้ำเพื่อบันทึกไบต์บางส่วน

การใช้งาน:

f(-1)  // 0
f(0)   // 0
f(2)   // 2
f(3)   // 3
f(5)   // 4
f(9)   // 5
f(13)  // 7

โซลูชั่น REPL 23 ไบต์

for(t=1;t*t++/4<q;);t-2

เตรียมที่q=จะเรียกใช้ตัวอย่างข้อมูล:

q=-1;for(t=1;t*t++/4<q;);t-2 // 0
q=9;for(t=1;t*t++/4<q;);t-2  // 5
q=13;for(t=1;t*t++/4<q;);t-2 // 7

มันยังใช้ชื่อตัวแปรเช่นเดียวกับระเบิด :)
รั่วนูน

สามารถบันทึกหนึ่งไบต์โดยเปลี่ยน>=เป็น<: D
Leun Nun

@KennyLau ขอบคุณ! มันนานมากแล้วที่ฉันไม่ได้เล่นกอล์ฟ ฉันเป็นสนิมนิดหน่อย x)
Florent

for(t=1;;)if(t*t++/4>=q)return t-1;เป็นเพียง 36 ไบต์ :)
รั่วนูน

1
@KennyLau ฉันได้เพิ่มโซลูชัน 23 ไบต์ :)
Florent

2

Python ขนาด 28 ไบต์

lambda n:max(4*n-1,0)**.5//1

ส่งออกลอย maxจะมีการให้0สำหรับn<=0ขณะที่หลีกเลี่ยงข้อผิดพลาดสำหรับรากที่สองของเชิงลบ


2

UGL , 30 25 ไบต์

i$+$+dc^l_u^^$*%/%_c=:_do

ลองออนไลน์!

ไม่ทำงานสำหรับอินพุตเชิงลบ

มันทำงานอย่างไร:

i$+$+dc^l_u^^$*%/%_c=:_do
i$+$+d                     #n = 4*input-1
      c                    #i=0
       ^l_     %/%_c=:_    #while      > n:
           ^^$*            #      i**2
          u                #                i = i+1
                       do  #print(i)

โซลูชัน 30 ไบต์ก่อนหน้า:

iuc^l_u^^$*cuuuu/%_u%/%_c=:_do

ล่ามออนไลน์ที่นี่

ไม่ทำงานสำหรับอินพุตเชิงลบ

มันทำงานอย่างไร:

iuc^l_u^^$*cuuuu/%_u%/%_c=:_do
iuc                             #push input; inc; i=0;
   ^l_u             %/%_c=:_    #while        > input:
       ^^$*cuuuu/%_             #      i**2/4
                   u            #                      i = i+1
                            do  #print(i)

1

MATL 11 ไบต์

E:t*4/G<f0)

อัลกอริทึมที่คล้ายกับ @KennyLau ยกเว้นว่าแทนที่จะวนซ้ำไปเรื่อย ๆ ฉันวนลูปจาก 1 ... 2n เพื่อบันทึกไบต์

ลองออนไลน์!

คำอธิบาย

    % Implicitly grab the input
E   % Double the input
:   % Create an array from 1...2n
t*  % Square each element
4/  % Divide each element by 4
G<  % Test if each element is less than G
f   % Get the indices of the TRUE elements in the array from the previous operation
0)  % Get the last index (the first index where T*T/4 >= n)
    % Implicitly display the result.

@LuisMendo ขอบคุณที่ชี้ให้เห็น Updated!
Suever



0

Java 8, 30 24 ไบต์

n->(int)Math.sqrt(n*4-1)

ลองออนไลน์

ไม่จำเป็นต้องตรวจสอบว่าnมีขนาดใหญ่กว่า 0 เพราะ Java ของMath.sqrtผลตอบแทนNaNสำหรับปัจจัยเชิงลบซึ่งจะกลายเป็น0พร้อมกับโยนเพื่อintที่เราจะได้ใช้สำหรับปัจจัยการผลิตในเชิงบวก


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