การเล่นกอล์ฟที่เกลียดชัง


20

การตั้งค่า:

เครือข่ายโซเชียลรายงานจำนวนโหวตที่โพสต์มีสองวิธีคือจำนวนupvotes สุทธิ ( upvotesทั้งหมด - downvotes ทั้งหมด) และ% ของคะแนนโหวตที่ upvotesปัดเศษเป็นจำนวนเต็มที่ใกล้เคียงที่สุด (.5 รอบขึ้น) จำนวน upvotes สุทธิเป็นจำนวนเต็ม (ไม่จำเป็นต้องเป็นค่าบวก) และตัวที่สองรับประกันว่าจะเป็นจำนวนเต็มระหว่าง 0 ถึง +100 จำนวนของ upvotes และจำนวน downvotes มีทั้งจำนวนเต็มศูนย์หรือบวก 32 บิต (คุณสามารถระบุลายเซ็นหรือไม่ได้ลงนาม) สมมติว่าหากไม่มีการลงคะแนนรวมเป็นศูนย์เปอร์เซ็นต์ที่ประกาศเพิ่มจะถูกรายงานว่าเป็นศูนย์

ความท้าทาย:

ด้วยจำนวนเต็มสองจำนวนนี้ (net upvotes และ% upvoted) โปรแกรมสั้นที่สุดที่คุณสามารถเขียนได้คืออะไรซึ่งกำหนดจำนวนรวมของupvotes ที่ต่ำที่สุดที่โพสต์ได้รับโดยมีข้อ จำกัด ทั้งหมดข้างต้นเป็นที่พอใจ?

รับประกันข้อ จำกัด อินพุต หากอินพุตไม่เป็นไปตามข้อ จำกัด ข้างต้นพฤติกรรมของโปรแกรมขึ้นอยู่กับคุณ ความรุ่งโรจน์โบนัสหากไม่เข้าสู่วงวนไม่สิ้นสุดหรือเกิดปัญหาขัดข้อง ลองส่งคืนจำนวนลบหากคุณต้องการคำแนะนำเพิ่มเติม

กฎทั่วไป:

  • นี่คือดังนั้นวิธีแก้ปัญหาที่สั้นที่สุดที่ถูกต้อง (วัดเป็นไบต์) ชนะ
  • อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ ' โบนัสความรุ่งโรจน์สำหรับภาษาเว็บฝั่งไคลเอ็นต์เช่น Javascript
  • หากคุณมีการแก้ปัญหาที่น่าสนใจในหลายภาษา, โพสต์ไว้แยกต่างหาก
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชัน / วิธีด้วยพารามิเตอร์ที่เหมาะสมและชนิดส่งคืนหรือโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้โปรดเพิ่มคำอธิบายว่ารหัสทำงานอย่างไร
  • โปรดทราบว่าหากคุณกำลังดำเนินการหารจำนวนเต็มที่ตัดทอน (เช่น 20/3 = 6) แทนที่จะเป็นรอบนั่นอาจไม่ถูกต้องทั้งหมด
  • กรณีทดสอบเพิ่มเติมที่สำรวจกรณีขอบในข้อ จำกัด ข้างต้นยินดีต้อนรับ
  • ในขณะที่ชนิดของการส่งคืนที่คาดหวังเป็นตัวเลขบูลีน "false" สามารถใช้แทน 0ได้

ตัวอย่างกรณีทดสอบ:

คอลัมน์แรกเป็นเพียงหมายเลขอ้างอิงที่มีให้เพื่ออำนวยความสะดวกในการอภิปราย

ref net  %up    answer
1   0    0   => 0    
2   -5   0   => 0    
3   -4   17  => 1    
4   -3   29  => 2    
5   -2   38  => 3    
6   -1   44  => 4    
7   0    50  => 1    
8   5    100 => 5    
9   4    83  => 5    
10  3    71  => 5    
11  2    63  => 5    
12  1    56  => 5    
13  1234 100 => 1234
14  800  90  => 894  (tip: don't refer to this as the "last test case;" others may be added.)

กรณีพิเศษที่โหวตรวมศูนย์นั้นค่อนข้างจู้จี้จุกจิก หากมีจำนวน upvote และ downvote เท่ากันเปอร์เซ็นต์ upvote คือ 50% ยกเว้น 0% เมื่อไม่มีการลงคะแนนเสียงแบ่งสัดส่วน upvote-downvote
xnor

2
@xnor 0/0 โดยทั่วไปจะไม่ได้กำหนดดังนั้นจึงต้องทำการสันนิษฐาน ด้วยตัวเลือกนี้คุณจะได้รับอัตโนมัติ "answer = second input" หากอินพุตที่สองคือ 0 และอัตโนมัติ "answer = อินพุตแรก" หากอินพุตที่สองคือ 100
WBT

1
กรณีทดสอบที่แนะนำที่ยืมมาจาก 1000, 100@nwellnhof: คุณช่วยยืนยันได้1000หรือไม่ว่าคำตอบที่คาดหวังคืออะไร?
Arnauld

1
ลงคะแนนแล้วเพราะผู้เกลียดชังต้องเกลียด :)
Hosch250

@Arnauld และ nwellnhof: ตามที่ระบุไว้ในความคิดเห็นต่อหน้าคุณหากอินพุตที่สอง = 100 คำตอบ = อินพุตแรก หาก 100 เป็นเปอร์เซ็นต์ที่ต่ำกว่าเล็กน้อยจริง ๆ จะต้องใช้อินพุท # แรกของ upvote เพื่อรับคะแนนเสียงโหวตสุทธิ = อินพุตแรกและความท้าทายนี้ค้นหาจำนวน upvotes ทั้งหมดที่ต่ำที่สุด
WBT

คำตอบ:


10

JavaScript (ES6), 47 ไบต์

รับอินพุตในรูปแบบ currying (n)(p)โดยที่nคือจำนวน net upvotes และpคือเปอร์เซ็นต์ของ upvotes อาจจะกลับมาfalse0สำหรับ

n=>p=>(g=u=>u/(u-n/2)*50+.5^p?g(u+1):u)(n>0&&n)

ลองออนไลน์!

แสดงความคิดเห็น

n => p => (          // given n and p
  g = u =>           // g = recursive function taking u = number of upvotes
    u / (u - n / 2)  //   compute u / (total_votes / 2)
    * 50 + .5        //   turn it into a percentage, add 1/2
    ^ p ?            //   XOR it with p, which gives 0 if the integer parts are matching
                     //   if the result is not equal to 0:
      g(u + 1)       //     try again with u + 1
    :                //   else:
      u              //     stop recursion and return u
)(n > 0 && n)        // initial call to g() with u = max(0, n)

กรณีขอบ

ให้F n (u) = u / (u - n / 2) * 50 + 0.5

  • ถ้าU = 0และn = 0แล้วF n (U) = น่านและF n (U) แฮคเกอร์ p = P ดังนั้นเราจะส่งคืนu = 0ถ้าn = p = 0 (การทำซ้ำครั้งแรกของกรณีทดสอบครั้งแรก) หรือดำเนินการต่อด้วยการเรียกซ้ำถ้าp! = 0 (การทำซ้ำครั้งแรกของกรณีทดสอบที่ 7)

  • ถ้าu> 0และU = n / 2แล้วF n (U) + = Infinityและ - อีกครั้ง - F n (U) แฮคเกอร์ p = P เว้นแต่ว่าp = 0เราจะดำเนินการซ้ำต่อไป (สิ่งนี้เกิดขึ้นในกรณีทดสอบที่ 9 และ 11)


ดี! คุณจะได้รับโบนัสรุ่งโรจน์สำหรับการเลือกภาษาและรวมถึงคำอธิบาย + ลิงก์ไปยังการสาธิตสด!
WBT

6

Stax , 17 ไบต์

ëI╩½• ╠☺Vì∞«S↑♠αS

เรียกใช้และแก้ไขข้อบกพร่อง

นี่คือกำลังดุร้าย มันเริ่มต้นด้วย 0 สำหรับผู้สมัคร upvotes และเพิ่มขึ้นจนกว่ามันจะสอดคล้องกับสูตร

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

0       push zero
{       start filter block...
        candidate upvotes is on the stack
  cHx-  calculate candidate downvotes for denominator (upvotes * 2 - net)
  c1?   if denominator is zero, replace it with 1
  :_    floating point division
  AJ*   multiply by 100
  j     round to integer
  ;=    is equal to second input?
        increment until a match is found
}gs

เรียกใช้อันนี้


2

ทำความสะอาด , 114 107 104 ไบต์

import StdEnv
? =toReal o toInt
$a d#e= ?d
= ?a+until(\c#b= ~c*e/(e-100.0)
= ?(?100*b/(?b+c))==e)inc 0.0

ลองออนไลน์!

กำหนดฟังก์ชั่น$ :: Int Int -> Realโดยที่อาร์กิวเมนต์เป็นจำนวนเต็มที่ลงนามและค่าส่งคืนเป็นทศนิยมที่มีความแม่นยำสองเท่าซึ่งสามารถแทนได้โดยจำนวนเต็มแบบ 32 บิต

มันตรวจสอบค่าทุกค่าcในสมการb=-cd/(d+1)เพื่อหาค่าที่bน่าพอใจa+c=bและb/(b+c)=dเนื่องจากcผลลัพธ์ที่เล็กที่สุดในค่าที่น้อยที่สุดbให้นำองค์ประกอบแรกของชุดของโซลูชันทั้งหมด


2

05AB1E , 13 ไบต์ [แตกอย่างอ่อนโยน]

*²·т-/ò²т;Qi1

ลองออนไลน์!

คำอธิบาย:

ในการแก้ปัญหานี้ฉันถือว่าอินพุต a, b และผลลัพธ์ที่คาดหวัง x รับข้อมูลในการตั้งค่าที่ให้ฉันสมการ:

 2x         100x
———— - a = ——————
 a           b

การจัดเรียงใหม่สำหรับ x ให้

        ab
x = ——————————
     2b - 100

กรณีทดสอบเดียวที่ใช้ไม่ได้คือ 0, 50 - ฉันเพียงฮาร์ดโค้ดเพื่อตรวจสอบสิ่งนี้

*²·т-/ò²т;Qi1     Implicit Inputs: a, b              STACK (bottom to top)
*                 Multiply the inputs together       [ab]
 ²·               Take the second input * 2          [ab, 2b]
   т-             Subtract 100                       [ab, 2b - 100]
     /ò           Divide and round                   [round(ab/(2b-100))]
       ²т;Qi1     If 2nd input = 50, push 1 to stack
                  { Implicitly output top item of stack [either 1, or round(...)] }

สิ่งนี้ทำงานไม่ถูกต้องสำหรับอินพุตบางตัว 90% กับ 800 คะแนนเสียงสุทธิสามารถทำได้ด้วย 894 คะแนนขึ้นไป
เรียกซ้ำ

@ recursive ฉันรู้ว่ามันคืออะไร ถือว่า 90% ว่าไม่ใช่ 89.5%
Geno Racklin Asher

ใกล้ถึง 90.5% ในกรณีนี้ แต่ใช่
เรียกซ้ำ

1
ตอนนี้ฉันรู้แล้วว่ามันยากกว่าที่ฉันคิด ฉันจะคิดเกี่ยวกับมัน แต่ตอนนี้ฉันจะทำเครื่องหมายว่าแตก
Geno Racklin Asher

@GenoRacklinAsher ตอนนี้ฉันรู้ว่ามันยากกว่าที่ฉันคิด ฉันจะคิดเกี่ยวกับมัน ...เหล่านี้เป็นประเภทของความคิดเห็นที่ฉันชอบอ่านโดยให้พวกเขาเป็นสัญลักษณ์ของปริศนาที่ดี :-)
WBT

0

ไปที่ 1.10, 154 ไบต์

func h(n,u float64)float64{if u==50{return 1};r:=Round(n*u/(2*u-100));s:=Round(n*(u+.5)/(2*u-99));v:=s/(2*s-n);if v>1||Round(v*100)!=u{return r};return s}

ลองไปที่สนามเด็กเล่น! (TIO วิ่งไป 1.9 ซึ่งไม่มีคณิตศาสตร์รอบ)

เวอร์ชันที่ไม่ดี

func haters(n, u float64) float64 {
    if u == 50 {
        return 1
    }
    r := Round(n * u / (2*u - 100))
    //Test the case where we were given a percentage that was rounded down (e.g. 90.4% given as 90%)
    //We test this by adding 0.5% to u. The denominator is just a simplified form of 2*(u+0.5) - 100
    s := Round(n * (u + .5) / (2*u - 99))
    //Check if s is a valid result
    v := s / (2*s - n)
    if v > 1 || Round(v*100) != u {
        return r
    }
    //s is strictly less than r, so we don't need to check the minimum.
    return s
}

ในความสนใจของการเพิ่มคำอธิบายสูตรข้างต้นสำหรับ r สามารถได้มาจากการแก้พร้อมกันn=v-dและu = 100 * v/(v + d)สำหรับ v โดยที่ v และ d คือจำนวน upvotes และ downvotes ตามลำดับ สูตรที่ได้รับนั้นไม่ได้ถูกกำหนดสำหรับ v = 50 ดังนั้นเราต้องจัดการกับกรณีนั้น (ซึ่งเราทำกับคำสั่ง if อันดับแรก)

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