แปลงเปอร์เซ็นต์เป็นอัตราส่วน "ง่าย"


16

คุณเรียกใช้เว็บไซต์ทางการเมืองและระบุว่าผู้คนมีความเข้าใจที่เข้าใจง่ายกว่าเมื่อมีโอกาสชนะหรือแพ้การเลือกตั้งแสดงเป็นอัตราส่วน ("5 in 7") มากกว่าเมื่อแสดงเป็นเปอร์เซ็นต์ ("71%" )

แต่คุณไม่ต้องการแสดงอัตราส่วนที่ทำให้เกิดความสับสนเช่น "58 ใน 82" คุณต้องการให้พวกเขาเข้าใจได้ง่ายขึ้นแม้ว่าจะไม่แม่นยำ

ดังนั้นให้เปอร์เซ็นต์ระหว่าง 0.1% และ 99.9% ให้ส่งกลับอัตราส่วน "ง่ายต่อการเข้าใจ" ที่ใกล้เคียงที่สุด " x ใน y " โดยใช้กฎต่อไปนี้ :

  1. ค่ามากที่สุด (ดูข้อยกเว้นด้านล่าง) ควรกลับอัตราส่วนที่ใกล้เคียงที่สุดจาก 10 หรือลด 55% ควรกลับมา "5 in 9" ไม่ใช่ "11 in 20"
  2. อัตราส่วนควรจะลดลงถึงข้อตกลงต่ำสุดของพวกเขา 65% ควรกลับ "2 in 3" ไม่ใช่ "4 in 6"
  3. ค่าต่ำกว่า 10% ควรกลับอัตราส่วนใกล้เคียงที่สุดของรูปแบบ " 1 ใน n " ที่nเป็นหนึ่ง (10,12,15,20,30,40,50,60,70,80,90,100) ตัวอย่างเช่น 6% ควรกลับ "1 in 15"
  4. ค่ากว่า 90% ควรกลับอัตราส่วนใกล้เคียงที่สุดของรูปแบบ " n-1 n " ที่nเป็นหนึ่ง (10,12,15,20,30,40,50,60,70,80,90,100) ตัวอย่างเช่น 98.7% ควรกลับ "79 ใน 80"
  5. ค่าต่ำกว่า 1% ควรส่งคืน " <1 ใน 100 "
  6. ค่าที่มากกว่า 99% ควรส่งคืน " > 99 ใน 100 "

หรือเพื่อคิดอีกวิธีหนึ่งโปรแกรมของคุณควรคืนอัตราส่วนที่ใกล้เคียงที่สุดจากผลลัพธ์ที่เป็นไปได้ต่อไปนี้ (ฉันได้รวมค่าโดยประมาณเพื่อความสะดวกของคุณ):

<1 in 100
 1 in 100  = 1.00%
 1 in 90   = 1.11%
 1 in 80   = 1.25%
 1 in 70   = 1.43%
 1 in 60   = 1.67%
 1 in 50   = 2.00%
 1 in 40   = 2.50%
 1 in 30   = 3.33%
 1 in 20   = 5.00%
 1 in 15   = 6.67%
 1 in 12   = 8.33%
 1 in 10   = 10.00%
 1 in 9    = 11.11%
 1 in 8    = 12.50%
 1 in 7    = 14.29%
 1 in 6    = 16.67%
 1 in 5    = 20.00%
 2 in 9    = 22.22%
 1 in 4    = 25.00%
 2 in 7    = 28.57%
 3 in 10   = 30.00%
 1 in 3    = 33.33%
 3 in 8    = 37.50%
 2 in 5    = 40.00%
 3 in 7    = 42.86%
 4 in 9    = 44.44%
 1 in 2    = 50.00%
 5 in 9    = 55.56%
 4 in 7    = 57.14%
 3 in 5    = 60.00%
 5 in 8    = 62.50%
 2 in 3    = 66.67%
 7 in 10   = 70.00%
 5 in 7    = 71.43%
 3 in 4    = 75.00%
 7 in 9    = 77.78%
 4 in 5    = 80.00%
 5 in 6    = 83.33%
 6 in 7    = 85.71%
 7 in 8    = 87.50%
 8 in 9    = 88.89%
 9 in 10   = 90.00%
 11 in 12  = 91.67%
 14 in 15  = 93.33%
 19 in 20  = 95.00%
 29 in 30  = 96.67%
 39 in 40  = 97.50%
 49 in 50  = 98.00%
 59 in 60  = 98.33%
 69 in 70  = 98.57%
 79 in 80  = 98.75%
 89 in 90  = 98.89%
 99 in 100 = 99.00%
>99 in 100

ข้อกำหนดอื่น ๆ :

  • อินพุตตัวเลขสามารถอยู่ในช่วง0.1 ถึง 99.9หรืออยู่ในช่วง0.001 ถึง 0.999แล้วแต่จำนวนใดจะสะดวกกว่า คุณต้องจัดการอย่างน้อย 3 หลักสำคัญ
  • คุณต้องแสดงอัตราส่วน ("3 ใน 4") ไม่ใช่เศษส่วนที่เท่ากัน("3/4")
  • หากมีสองอัตราส่วนใกล้กับอินพุตอย่างเท่าเทียมกันโปรแกรมของคุณสามารถส่งคืนได้ทั้งอัตราส่วน 7.5% สามารถส่งคืน "1 in 12" หรือ "1 in 15"
  • ช่องว่างนำหน้า / ต่อท้ายและ / หรือบรรทัดใหม่นั้นใช้ได้

ตัวอย่าง :

Input  :   Output
 0.5   :  <1 in 100
 1.0   :   1 in 100
 1.5   :   1 in 70
 7.5   :   1 in 15  or  1 in 12 (either is acceptable)
 9.2   :   1 in 10
13.1   :   1 in 8
29.2   :   2 in 7
29.3   :   3 in 10
52.7   :   1 in 2
52.8   :   5 in 9
72.0   :   5 in 7
73.9   :   3 in 4
88.8   :   8 in 9
90.8   :   9 in 10
94.2   :  19 in 20
98.7   :  79 in 80
98.9   :  89 in 90
99.0   :  99 in 100
99.1   : >99 in 100

นี่คือความท้าทายของรหัสที่สั้นที่สุดในแต่ละภาษาชนะ

(คล้ายกับ แต่ไม่ซ้ำกันของ: แปลงทศนิยมเป็นเศษส่วน , เศษส่วนที่ใกล้ที่สุด , จำนวนจุดลอยตัวโดยประมาณที่มีความแม่นยำ n หลัก )


If there are two ratios equally close to the input, your program can return either one. 7.5% could return "1 in 12" or "1 in 15"นั่นหมายความว่าเราสามารถกลับมาได้7 in 100เช่นกัน? Btw 1 in 14ใกล้เคียงกับอินพุตในกรณีนี้
DimChtz

@DimChtz ไม่เนื่องจากละเมิดกฎ 3 (ค่าต่ำกว่า 10% ควรแสดงเป็น "1 in n " สำหรับค่าที่เป็นไปได้เฉพาะของn )
BradC

โอ้ฉันไม่ได้สังเกตเรื่องนี้ ตกลง.
DimChtz

2
ฉันต้องการมันถ้าเราสามารถส่งออกตัวเศษและส่วนเป็นรูปแบบใด ๆ เช่น tuple / list หรืออะไรบางอย่าง แต่มีคำตอบที่แข่งขันกันอยู่แล้วดังนั้นฉันคิดว่ามันสายเกินไปสำหรับความท้าทายนี้ สำหรับความท้าทายในอนาคตฉันจะพิจารณารูปแบบ I / O ที่ยืดหยุ่นมากขึ้นเนื่องจากบางภาษาสูญเสียความสามารถในการแข่งขันมากกว่าภาษาอื่นเมื่อคุณต้องการการจัดการสตริง
HyperNeutrino

1
@BradC - LOL ฉันเพิ่งอายุ 538 ปีและฉันทุกคน "ว้าว! ฉันต้องตีลูกกอล์ฟให้ได้!"
Chas Brown

คำตอบ:


6

T-SQL, 385 ไบต์

SELECT TOP 1IIF(i>.99,'>',IIF(i<.01,'<',''))+n+' in '+d
FROM t,(SELECT ISNULL(PARSENAME(value,2),'1')n,PARSENAME(value,1)d FROM
STRING_SPLIT('100,90,80,70,60,50,40,30,20,15,12,10,9,8,7,6,5,2.9,4,2.7,3.10,3,3.8,2.5,3.7,4.9,2,5.9,4.7,3.5,5.8,2.3,7.10,5.7,3.4,7.9,4.5,5.6,6.7,7.8,8.9,9.10,11.12,14.15,19.20,29.30,39.40,49.50,59.60,69.70,79.80,89.90,99.100',','))m
ORDER BY ABS(i-ABS(n)/d)

การป้อนข้อมูลผ่านทางที่มีอยู่ก่อนตารางทีกับข้อมูลที่เป็นตัวเลขฉัน , ตามมาตรฐาน IO ของเรา

ตารางอินพุตนั้นถูกรวมเข้ากับตารางในหน่วยความจำที่แยกวิเคราะห์จากสตริงผ่านSTRING_SPLIT(ซึ่งคั่นแถว) และPARSENAME(ซึ่งคั่นตัวเลขและตัวหารผ่าน.)

ตารางจะเรียงตามระยะทางจากค่าอินพุตiและส่งกลับแถวบนสุดจัดรูปแบบอย่างเหมาะสม


5

ถ่านขนาด 84 ไบต์

NθF¹¹«F⊖ι⊞υ⟦⊕κι⟧≔⎇⊖ι∨×χι¹²¦¹⁵ιF²⊞υ⟦∨κ⊖ιι⟧»≔Eυ↔⁻θ∕§ι⁰§ι¹η≔⌕η⌊ηη×<‹θ·⁰¹×>›θ·⁹⁹⪫§υη in 

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด รับอินพุตเป็นทศนิยมแทนที่จะเป็นเปอร์เซ็นต์ คำอธิบาย:

Nθ

ใส่เศษส่วน

F¹¹«

เรียกใช้จาก n=0 ถึง n=10.

F⊖ι⊞υ⟦⊕κι⟧

สร้างอัตราส่วนสำหรับ 1n ถึง n-1n.

≔⎇⊖ι∨×χι¹²¦¹⁵ι

รับ nเสื้อชั่วโมง องค์ประกอบของรายการ 12,15,20...100 เข้าไป n.

F²⊞υ⟦∨κ⊖ιι⟧»

สร้างอัตราส่วนสำหรับ n-1n และ 1n.

≔Eυ↔⁻θ∕§ι⁰§ι¹η

คำนวณค่าทศนิยมของอัตราส่วนทั้งหมดและรับผลต่างที่แน่นอนด้วยอินพุตดั้งเดิม

≔⌕η⌊ηη

ค้นหาดัชนีที่มีความแตกต่างน้อยที่สุด ในกรณีที่เสมอกัน (เช่น12 และ 24) ใช้อัตราส่วนที่สร้างขึ้นก่อน

×<‹θ·⁰¹

พิมพ์ a <ถ้าอินพุตน้อยกว่า0.01.

×>›θ·⁹⁹

พิมพ์ a >หากอินพุตมากกว่า0.99.

⪫§υη in 

เข้าร่วมกับตัวเศษและส่วนของอัตราส่วนที่เหมาะสมด้วยinและพิมพ์


5

JavaScript (ES7), 164 159 144 ไบต์

คาดหวังอัตราส่วนอินพุต ]0,1[.

r=>(g=m=>--n+11?g((q=n>1?n*10:n+10-~'13'[n],d=((p=r<.1?1:r>.9?q-1:n<0&&r*q+.5|0)/q-r)**2)>m?m:(o=p+' in '+q,d)):r<.01?'<'+o:r>.99?'>'+o:o)(n=11)

ลองออนไลน์!

อย่างไร?

เราลองอัตราส่วนที่เป็นไปได้ทั้งหมด พี/Q. สำหรับแต่ละคนเราคำนวณ:

d=(พี/Q-R)2

เราอัปเดตคะแนนที่ดีที่สุด ม. (ยิ่งต่ำยิ่งดี) ในแต่ละครั้ง d ต่ำกว่าหรือเท่ากับ ม..

เราไปจากค่าสูงสุดของ Q ไปที่ต่ำที่สุดเพื่อให้ตัวส่วนที่เล็กกว่าเป็นที่ต้องการในกรณีที่เสมอกัน

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

r => (g = m =>               // r = input; g() = recursive function, taking m = best score
  --n + 11 ?                 // decrement n; if n is still greater than or equal to -10:
    g(                       //   do a recursive call to g():
      ( q =                  //     compute q = denominator:
        n > 1 ?              //       if n is greater than 1:
          n * 10             //         q = n * 10 (20, 30, ..., 100)
        :                    //       else:
          n + 10 - ~'13'[n], //         q = 12 if n = 0, 15 if n = 1, n + 11 if n < 0
        d = ((               //     compute d = (p / q - r)²:
          p =                //       compute p = numerator:
          r < .1 ?           //         if r is less than 0.01:
            1                //           p = 1
          :                  //         else:
            r > .9 ?         //           if r is greater than 0.90:
              q - 1          //             p = q - 1
            :                //           else:
              n < 0 &&       //             if n is negative (i.e. q is in [1,10]):
              r * q + .5 | 0 //               p = round(r * q)
                             //             otherwise: p = 0 (which will be ignored)
          ) / q - r          //       compute p / q - r
        ) ** 2               //       and square the result (cheaper than absolute value)
      ) > m ?                //     if d is greater than m:
        m                    //       leave m unchanged
      : (                    //     else:
        o = p + ' in ' + q,  //       update the output string o
        d                    //       and update m to d
    ))                       //   end of recursive call
  :                          // else (all possible ratios have been tried out):
    r < .01 ? '<' + o :      //   if r is less than 0.01, prefix with '<'
    r > .99 ? '>' + o :      //   if r is greater than 0.99, prefix with '>'
    o                        //   otherwise, just return o
)(n = 11)                    // initial call to g() with m = n = 11

4

เยลลี่ , 58 ไบต์

⁵R×⁵;12,15µ’,1,€)Ẏ;⁵Œc¤ð÷/ạ¥ÞḢj“ in ”
”<”>“”>.99$?<.01$?;Ç

ลองออนไลน์!

-16 ไบต์ขอบคุณ Arnauld (สามารถเพิ่ม<และ>แทนที่การเขียนวลีใหม่ทั้งหมด)
-6 ไบต์และแก้ไขข้อผิดพลาดขอบคุณ Jonathan Allan


@Arnauld โอ้คุณพูดถูกไม่เคยคิดเลย: P ขอบคุณ!
HyperNeutrino

0.3ควรส่งผลให้3 in 10ไม่2 in 7
Jonathan Allan

คุณก็ควรจะเอาµµไม่? แก้ไข - แล้วเล่นกอล์ฟÐṂṂกับÞḢ
Jonathan Allan

การเปลี่ยน9เป็นควรแก้ไขข้อผิดพลาดที่ฉันเชื่อ
โจนาธานอัลลัน

@JanathanAllan โอ้โหฉันไม่ได้ใช้ 10 เป็นตัวส่วนที่ถูกต้อง ขอบคุณ และไม่การลบ mu สองครั้งไม่ทำงานเพราะจากนั้น "ค่าต่ำสุด" นั้นติดอยู่ทางด้านขวาของฟังก์ชัน dyadic link-min ซึ่งไม่ใช่สิ่งที่ฉันต้องการอย่างแน่นอน . ขอบคุณสำหรับการเล่นกอล์ฟ: D
HyperNeutrino

3

Python 2 , 261 278 261 237 177 ไบต์

lambda n:' <>'[(n<.01)-(n>.99)]+'%d in %d'%min([(a,b)for b in[[12,15]+r(10,110,10),r(1,11)][.1<n<.9]for a in r([1,b-1][n>.9],[b,2][n<.1])],key=lambda(a,b):abs(1.*a/b-n))
r=range

ลองออนไลน์!


1
Python ไม่รองรับเครื่องหมายอัฒภาคหรือไม่ คุณสามารถแทนที่'\n 'ด้วย';'... เว้นแต่ว่าฉันผิด
Dev

@BradC แก้ไข :)
TFeld

3

ทำความสะอาด , 224 198 197 ไบต์

import StdEnv,Data.List,Text
t=toReal
$p=if(p<1.0)"<"if(p>99.0)">"""+snd(minimum[(abs(p-t n*1E2/t d),n<+" in "<+d)\\i<-[10,12,15:[20,30..100]],(n,d)<-[(1,i),(i-1,i):diag2[1..10][1..10]]|gcd n d<2])

ลองออนไลน์!

อธิบาย:

t = toReal                              // give `toReal` a shorter name
$ p
 = if(p < 1.0)                          // if the percentage is less than 1%
  "<"                                   // prepend "<"
 if(p > 99.0)                           // if the percentage is > 99%
  ">"                                   // prepend ">"
  ""                                    // otherwise prepend nothing
 + snd (                                // to the second element of
  minimum [                             // the smallest item in a list composed of
   (                                    // pairs of
    abs (                               // the absolute value of
     p -                                // the difference between the percentage
     t n*1E2 / t d                      // and the ratio
    ) 
   ,                                    // associated with
    n <+ " in " <+ d                    // the string representation of the ratio
   )                                    // in the form of a tuple
   \\ i <- [10, 12, 15: [20, 30..100]]  // for every special denominator `i`
   , (n, d) <- [(1, i), (i - 1, i): diag2 [1..10] [1..10]]
                                        // for every ratio `n` : `d`
   | gcd n d < 2                        // where `n` / `d` cannot be further simplified
  ]
 )

3

เจลลี่ ,  53  52 ไบต์

_.01,.99Ṡµ<0ịØ<ḣE⁵Ż×⁵+12,5Ṡ,’Ɗż€$Ẏ;⁵Œc¤÷/ạ¥Þ³Ḣj“ in 

โปรแกรมเต็มรูปแบบที่พิมพ์ผลลัพธ์

ลองออนไลน์!

หรือดูที่ ทดสอบ

โปรดทราบว่าชุดการทดสอบนั้นได้รับการแก้ไขเพื่อให้โค้ดเป็นลิงก์แบบ monadic โดย:

  1. ใช้รีจิสเตอร์ติดตามสถานะของ "อินพุตโปรแกรม" ปัจจุบันด้วย ³ถึง® ; และ
  2. ปิดรายการรหัสอักขระสำหรับ "ใน" ด้วย “ in ถึง“ in ”

อย่างไร?

เริ่มต้นด้วยรหัสที่บังคับให้มีการพิมพ์<หรือ>เซ็นชื่อที่จำเป็นและจากนั้นโค้ดที่สร้างคู่ตัวเศษ - ตัวหารทั้งหมด (ด้วยรูปแบบที่ซ้ำซ้อนบางอย่างที่ไม่ง่ายแบบฟอร์มทั้งหมดหลังจากแบบฟอร์มที่เรียบง่าย) และพิมพ์รายการที่หารด้วย in ร่วมกับการจัดเรียง

_.01,.99Ṡµ<0ịØ<ḣE⁵Ż×⁵+12,5Ṡ,’Ɗż€$Ẏ;⁵Œc¤÷/ạ¥Þ³Ḣj“ in  - Main Link: number in [0,1], n
 .01,.99                                             - literal pair = [0.01, 0.99]
_                                                    - subtract -> [n - 0.01, n - 0.99]
        Ṡ                                            - sign (vectorises) (-1 if <0; 1 if >0; else 0) 
         µ                                           - start a new monadic link
                                                     -   call that X
          <0                                         - less than zero? (vectorises)
             Ø<                                      - literal list of characters = "<>"
            ị                                        - index into (vectorises) ("<<" if n < 0.01; ">>" if n >= 0.99; else "><")
                E                                    - all (of X) equal? (1 if ((n < 0.01) OR (n > 0.99)) else 0
               ḣ                                     - head to index ("<" if n < 0.01; ">" if n > 0.99; else "")
                                                     -   (the following nilad forces a print of that)
                 ⁵                                   - literal 10
                  Ż                                  - zero-range -> [0,1,2,3,4,5,6,7,8,9,10]
                   ×⁵                                - multiply by 10 -> [0,10,20,30,40,50,60,70,80,90,100]
                      12,5                           - literal pair = [12,5]
                     +                               - add -> [12,15,20,30,40,50,60,70,80,90,100]
                                $                    - last two links as a monad
                             Ɗ                       -   last three links as a monad
                          Ṡ                          -     sign -> [1,1,1,1,1,1,1,1,1,1,1]
                            ’                        -     decrement -> [11,14,19,29,39,49,59,69,79,89,99]
                           ,                         -     pair -> [[1,1,1,1,1,1,1,1,1,1,1],[11,14,19,29,39,49,59,69,79,89,99]]
                              ż€                     -   zip with for €ach -> [[[1,12],[1,15],[1,20],[1,30],[1,40],[1,50],[1,60],[1,70],[1,80],[1,90],[1,100]],[[11,12],[14,15],[19,20],[29,30],[39,40],[49,50],[59,60],[69,70],[79,80],[89,90],[99,100]]]
                                 Ẏ                   - tighten -> [[1,12],[1,15],[1,20],[1,30],[1,40],[1,50],[1,60],[1,70],[1,80],[1,90],[1,100],[11,12],[14,15],[19,20],[29,30],[39,40],[49,50],[59,60],[69,70],[79,80],[89,90],[99,100]]
                                      ¤              - nilad followed by link(s) as a nilad:
                                   ⁵                 -   literal 10
                                    Œc               -   unordered pairs -> [[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[2,3],[2,4],[2,5],[2,6],[2,7],[2,8],[2,9],[2,10],[3,4],[3,5],[3,6],[3,7],[3,8],[3,9],[3,10],[4,5],[4,6],[4,7],[4,8],[4,9],[4,10],[5,6],[5,7],[5,8],[5,9],[5,10],[6,7],[6,8],[6,9],[6,10],[7,8],[7,9],[7,10],[8,9],[8,10],[9,10]]
                                  ;                  - concatenate -> [[1,12],[1,15],[1,20],[1,30],[1,40],[1,50],[1,60],[1,70],[1,80],[1,90],[1,100],[11,12],[14,15],[19,20],[29,30],[39,40],[49,50],[59,60],[69,70],[79,80],[89,90],[99,100],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[2,3],[2,4],[2,5],[2,6],[2,7],[2,8],[2,9],[2,10],[3,4],[3,5],[3,6],[3,7],[3,8],[3,9],[3,10],[4,5],[4,6],[4,7],[4,8],[4,9],[4,10],[5,6],[5,7],[5,8],[5,9],[5,10],[6,7],[6,8],[6,9],[6,10],[7,8],[7,9],[7,10],[8,9],[8,10],[9,10]]
                                           Þ         - sort by:
                                          ¥          -   last two links as a dyad:
                                                     -       ...(with right argument of
                                            ³        -           the program input, n)
                                        /            -     reduce by:
                                       ÷             -       division
                                         ạ           -     absolute difference
                                             Ḣ       - head
                                               “ in  - literal list of characters " in "
                                              ;      - concatenate
                                                     - implicit print

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