ย่อเล็กสุดเหล่านั้น [ปิด]


12

งานของคุณคือการสร้างจำนวนธรรมชาติโดยใช้จำนวนน้อยที่สุดของคนและมีเพียงผู้ประกอบการหรือ+ -ตัวอย่างเช่นหมายเลขเจ็ดสามารถเขียน1+1+1+1+1+1+1=7ได้ แต่ก็สามารถเขียนได้เช่น11-1-1-1-1=7กัน คนแรกที่ใช้คนในขณะที่ใช้เพียงหลัง7 6งานของคุณคือส่งคืนจำนวนต่ำสุดของจำนวนที่สามารถใช้ได้เมื่อใส่ค่าจำนวนธรรมชาติ, n.

นี่คือรหัสกอล์ฟดังนั้นรหัสที่ถูกต้องสั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

อินพุต => เอาท์พุท

0 => 2 (since 1-1=0)
7 => 6
121 => 6
72 => 15
1000 => 7
2016 => 21

ความท้าทายแรกที่ดี ฉันขอแนะนำให้รวมถึงกรณีทดสอบเพิ่มเติม "VALID OUTPUTS" เป็นข้อผิดพลาดเนื่องจากมีเอาต์พุตเดียวหรือไม่ นอกจากนี้ 0 อินพุตที่ถูกต้องคืออะไรและถ้าเป็นเช่นนั้นควรจะเอาต์พุตอะไร
xnor

นี่คือความท้าทายที่น่าสนใจ VALID OUTPUTSคุณอาจต้องการที่จะเพิ่มคำอธิบายสำหรับผลการเปลี่ยนแปลง เป็นตัวเลือกของคุณ แต่โดยทั่วไปคนชอบตัวหนาหรือตัวเอียงแทนที่จะเป็นตัวพิมพ์ใหญ่ (พวกมันทำให้ดูเหมือนว่าตะโกนแทนที่จะเน้น) ตัวหนาและตัวเอียงคือ**bold text** *italics text*คุณสามารถใช้### Textเป็นข้อความตัวหนาได้ อย่างไรก็ตามยินดีต้อนรับสู่ PPCG!
NoOneIsHere ที่

คุณควรสร้างตารางที่คอมพิวเตอร์สามารถอ่านได้หรือรายการกรณีทดสอบที่ผู้ใช้สามารถเรียกใช้รหัสได้ ดูเคล็ดลับนี้
xnor

6
ฉันลงคะแนนเพื่อปิดคำถามนี้เพราะคำถามนี้เป็นซ้ำในปัจจุบัน (ใช้งาน !!) การเล่นกอล์ฟที่ท้าทายมากกว่าที่codefights.com/challenges แม้ว่า OP จะเป็นผู้สร้างความท้าทายเริ่มแรกบน codefights (ซึ่งฉันสงสัย) คำถามควรถูกปิดจนกว่าความท้าทายของ codefights จะไม่ทำงานอีกต่อไป
Jakube

1
@Jakube ลิงก์โดยตรงอาจมีประโยชน์ แต่ฉันเห็นด้วย ฉันจะลงคะแนนให้ปิด
NoOneIsHere

คำตอบ:


3

JavaScript (ES6), 127 126 87 ไบต์

f=(n,z=2,m=n*9+'',r=m.replace(/./g,1))=>n?m.length+(m<'55'?f(n- --r/10,0)-1:f(r-n,0)):z
Input: <input type="number" oninput="result.textContent=f(this.value)"> Result: <span id="result"></span>

ควรทำงานประมาณ 10 14 15ซึ่งเป็นจุดที่คุณเริ่มทำงานเป็นจำนวนเต็มที่ จำกัด ของ JavaScript คำอธิบาย:

f=(                             Recursive function
 n,                             Parameter
 z=2,                           Zero workaround
 m=n*9+'',                      Magic
 r=m.replace(/./g,1)            Find repunit not less than than n
)=>n?                           Nothing to do if n is zero
 m.length+                      Assume subtracting from repunit
 (m<'55'?                       Should we subtract from repunit?
  f(n- --r/10,0)                No, so subtract previous repuint
   -1:                          Which is one 1 shorter
  f(r-n,0)):                    Subtract from repunit
 z                              Return special case if n is zero

ใช้n*9เวทมนตร์สองครั้ง; ประการแรกมันทำให้ฉันยาวของ repunit ต่อไปประการที่สองถ้าตัวเลขสองหลักแรกของการn*9มี55หรือที่สูงขึ้นแล้วเราต้องลบnจาก repunit ถัดไปที่มิฉะนั้นเราจำเป็นต้องลบ repunit ก่อนหน้า (ซึ่งคำนวณโดยการหักที่ 1 และ หารด้วย 10) นี้จะทำงานได้ถึง 10 15


2

Pyth, 19 16 ไบต์

ffqQvs+R1Y^c3"+-

ชุดทดสอบ

ขั้นตอนวิธีกำลังดุร้าย สตริงที่จำเป็นถูกสร้างขึ้นโดยรับรายการทั้งหมดที่มีองค์ประกอบที่มี['+', '-', '']ความยาวเท่ากับจำนวนของ 1s ที่จะทดสอบผนวก 1 กับแต่ละและเชื่อมต่อกับสตริงเดียว สตริงเหล่านี้จะถูกประเมินและเปรียบเทียบกับอินพุต สิ่งนี้จะทำซ้ำจนกว่าจะพบสตริงที่ประสบความสำเร็จ

สตริงบางตัวที่มีผู้นำ+หรือ-ถูกทดสอบ แต่นี่ไม่ใช่ปัญหา มันจะเป็นอย่างไรถ้าอินพุตเป็นลบแม้ว่า

มันสามารถวิ่งได้ถึงความยาว 9 ก่อนที่มันจะช้าเกินไป

คำอธิบาย:

ffqQvs+R1Y^c3"+-
ffqQvs+R1Y^c3"+-"T    Implicit variable introduction
                      Q = eval(input())
f                     Starting with T = 1 and counting upwards, repeat until true.
                      The value of T where the result is first true is output.
           c3"+-"     Chop "+-" into thirds, giving ['+', '-', '']
          ^      T    Form every list with those elements of length T.
 f                    Filter over those lists, lambda var Y.
      +R1Y            Append a 1 to each element of the list.
     s                Concatenate.
    v                 Eval.
  qQ                  Compare for equality with the input.
                      The inner filter will let through the successful cases.
                      The outer filter will stop when there is a successful case.

2

JavaScript (ES6), 92 ไบต์

f=(n,i=3)=>eval([...s=i.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n?f(n,i+1):s.length-1
n = <input type="number" oninput="R.textContent=f(this.value)" /><pre id="R"></pre>

คำอธิบาย

ฟังก์ชั่นวนซ้ำ นี้สร้างพีชคณิตเป็นไปได้ทั้งหมดของ1s แยกจากกันโดยทั้งสอง+, -หรือไม่มีอะไร มันเป็นเช่นนี้โดยการเพิ่มจำนวนฐาน-3, เปลี่ยนมันเป็นอาร์เรย์ของตัวเลขการแปลงแต่ละหลัก0ไป-, 1ไป+และ2เป็นสตริงว่างแล้วมาร่วมงานกับพวกเขาร่วมกันกับ1s สตริงผลลัพธ์คือevald เป็นคำสั่ง JavaScript ซึ่งส่งคืนผลลัพธ์ของสมการ

เนื่องจากตัวดำเนินการเข้าร่วมกับ1s ในระหว่าง (เช่น+1+1+1+) มีlength - 1 1s ผู้ประกอบการครั้งแรกจะถูกละเว้น (เพราะ+1= 1, <nothing>1= 1และมันเป็นจำนวนดังนั้นจะไม่มีชั้นนำ0สำหรับ-) และผู้ประกอบการขั้นสุดท้ายยังถูกละเว้น (โดยท้าย.0สมการ)

เวอร์ชันเอาต์พุตที่สูงกว่า, 96 ไบต์

รุ่นอื่นไม่สามารถส่งคืนผลลัพธ์ที่สูงกว่า ~ 10 ได้เนื่องจากข้อ จำกัด การโทรติดต่อซ้ำ รุ่นนี้ใช้สำหรับลูปแทนการเรียกซ้ำเพื่อให้สามารถส่งคืนเอาต์พุตได้ถึง ~ 33 จำนวนเวลาที่ต้องใช้เพิ่มขึ้นอย่างมากแม้ว่าฉันจะไม่แนะนำให้ทำการทดสอบ

n=>eval('for(a=3;eval([...s=a.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n;)a++;s.length-1')

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