ครึ่งครึ่งครึ่งและครึ่ง


33

พิจารณาลำดับหมายเลขต่อไปนี้:

0,12,14,34,18,38,58,78,116,316,516,716,916,1116,1316,1516,132,332,532,...

มันระบุเศษส่วนไบนารีทั้งหมดในช่วงเวลาที่หน่วย1)[0,1)

(เพื่อให้การท้าทายนี้ง่ายขึ้นองค์ประกอบแรกเป็นทางเลือก: คุณอาจข้ามไปและพิจารณาลำดับที่เริ่มต้นด้วย 1/2)

งาน

เขียนโปรแกรม (โปรแกรมสมบูรณ์หรือฟังก์ชั่น) ซึ่ง ...

เลือกหนึ่งในพฤติกรรมเหล่านี้:

  • อินพุต n, องค์ประกอบที่ n เอาท์พุทของลำดับ (ดัชนี 0 หรือดัชนี 1)
  • อินพุต n, เอาท์พุตองค์ประกอบแรกของลำดับ
  • ไม่มีอะไรให้ป้อนออกลำดับหมายเลขอนันต์ซึ่งคุณสามารถรับได้ทีละตัว

กฎ

  • โปรแกรมของคุณควรสนับสนุนอย่างน้อย 1,000 รายการแรก;
  • คุณสามารถเลือกที่จะเอาท์พุททศนิยมหรือเศษส่วน (ในตัวคู่จำนวนเต็มสตริง) ตามที่คุณต้องการ;
    • คำถามนี้ไม่อนุญาตให้ใช้อินพุต / เอาต์พุตเป็นเลขฐานสอง
  • นี่คือรหัสที่สั้นที่สุดชนะ;
  • ช่องโหว่มาตรฐานไม่อนุญาต

Testcases

input output
1     1/2     0.5
2     1/4     0.25
3     3/4     0.75
4     1/8     0.125
10    5/16    0.3125
100   73/128  0.5703125
511   511/512 0.998046875
512   1/1024  0.0009765625

ตัวอย่างเหล่านี้ขึ้นอยู่กับลำดับ 0 ดัชนีที่มี 0 นำหน้า คุณจะต้องปรับอินพุตเพื่อให้เหมาะสมกับโซลูชันของคุณ

อ่านเพิ่มเติม

  • OEIS A006257
    • ปัญหาฟั: 1 (เดิมคือ M2216)a2n=2an-1,a2n+1=2an+1
    • 0, 1, 1, 3, 1, 3, 5, 7, 1, 3, 5, 7, 9, 11, 13, 15, 1, 3, 5, ...
  • OEIS A062383
    • a0=1 : สำหรับ ,หรือrfloor}n>0an=2ล.โอก.2n+1an=2an2
    • 1, 2, 4, 4, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32, 32, 32, 32, ...
  • A006257 (n) / A062383 (n) = (0, 0.1, 0.01, 0.11, 0.001, ... ) ระบุเศษส่วนไบนารีทั้งหมดในช่วงหน่วย [0, 1) - Fredrik Johansson, 14 ส.ค. 2549


4
" ไม่ป้อนข้อมูลส่งออกลำดับหมายเลขอนันต์ทีละตัว " ต้องเป็นแบบทีละตัวหรือเราได้รับอนุญาตให้ส่งออกรายการแบบไม่มีที่สิ้นสุด (เป็นไปได้ใน Haskell, Elixir, 05AB1E ฯลฯ ) หรือไม่?
Kevin Cruijssen

ฉันสามารถแสดงรายการสตริงได้หรือไม่? เช่น"1/2" "1/4" "1/8"...
Barranka

@KevinCruijssen รายชื่อไม่มีที่สิ้นสุดนั้นใช้ได้ตราบใดที่คุณยังไม่มีtakeองค์ประกอบในภายหลัง
tsh

@Baranka ฉันคิดว่ามันเป็นที่ยอมรับ ไม่มีอะไรแตกต่างจากการพิมพ์เศษส่วนไปยัง stdout
tsh

เมื่อคุณพูดว่าไม่อนุญาตให้ใช้อินพุต / เอาท์พุตเป็นเลขฐานสองคุณหมายถึงเราไม่สามารถเขียนฟังก์ชันที่ส่งคืนคู่ถ้าints หรือdoubleในภาษา / การใช้งานซึ่งdoubleใช้รูปแบบ IEEE binary64หรือไม่ ฉันหวังว่าคุณไม่ได้หมายความว่าต้องแยกสตริง ASCII ถ้าเราต้องการที่จะป้อนจำนวนเต็ม? ประเภทจำนวนเต็มปกติเป็นเลขฐานสองในภาษาเช่น C หรือคุณหมายถึงอินพุต / เอาต์พุตไม่สามารถเป็นอาร์เรย์หรือสตริงของจำนวนเต็มหรือศูนย์ ASCII / คน?
Peter Cordes

คำตอบ:


22

Haskell , 25 ไบต์

pred.until(<2)(/2).(+0.5)

ลองออนไลน์!

ผลผลิตทศนิยมหนึ่งดัชนีโดยไม่มีคำศูนย์เริ่มต้น

เพิ่ม 0.5 ให้กับอินพุตจากนั้นลดลงครึ่งหนึ่งจนกว่าผลลัพธ์จะต่ำกว่า 2 จากนั้นลบ 1 การใช้นิพจน์แบบไม่มีจุดหมายจะช่วยประหยัด 1 ไบต์

f n=until(<2)(/2)(n+0.5)-1

11

Java 10, 68 64 ไบต์

ก่อนอื่นลองโค้ดกอล์ฟ!

ตัวเลือกที่ 1: ค้นหาองค์ประกอบn -th (ดัชนี 1 รายการ)

-4 ไบต์ขอบคุณ@Kevin Cruijssen

n->{int x=0;for(;n>>++x!=1;);return((~(1<<x)&n)*2.+1)/(1<<x+1);}

นี่เป็นวิธีไม่ระบุตัวตนที่ค้นหาคำศัพท์ที่nโดยลบบิตที่สำคัญที่สุดออกจากnเพิ่มเป็นสองเท่าและเพิ่มหนึ่งส่วนจากนั้นหารด้วยกำลังสูงสุดถัดไปของ 2

ลองออนไลน์!

คำแนะนำเกี่ยวกับรหัส:

n->{                      // builds anonymous function with input n
int x=0;                  // stores floor of log(n) (base 2) for most significant digit
for(;n>>++x!=1;);         // calculates floor of log(n) by counting right shifts until 1
return((~(1<<x)&n)        // removes most significant digit of n
*2.+1)                     // multiplies 2 and adds 1 to get the odd numerator
/(1<<x+1);}               // divides by the next highest power of 2 and returns`

จะแก้ไขหากจำเป็นเพื่อพิมพ์ค่าสุดท้ายแทนที่จะส่งคืน


ยินดีต้อนรับสู่ PPCG ดีที่จะมีคุณกับเรา :)
ปุย

สวัสดียินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี +1 จากฉัน ขณะนี้มันนับเป็นไบต์เดียวกับคำตอบ Java ของฉัน แต่คุณยังสามารถเล่นกอล์ฟบางส่วนของคำตอบเพื่อให้สั้นกว่าของฉันได้: {}หลังจากลูปสามารถ;แทนได้ คุณสามารถลบช่องว่างหลังจากreturn; 2.0สามารถ2.; และการเปลี่ยนแปลงn>>x!=1;x++, 1<<xและ1<<x+1เพื่อn>>x++!=1;, 1<<x-1, 1<<xตามลำดับนอกจากนี้ยังช่วยประหยัดไบต์ ลองมันออนไลน์: 64 ไบต์ เพลิดเพลินไปกับการพักผ่อนของคุณ!
Kevin Cruijssen

โอ้และถ้าคุณยังไม่เห็น: เคล็ดลับสำหรับการเล่นกอล์ฟใน Javaและเคล็ดลับสำหรับการเล่นกอล์ฟใน <ทุกภาษา>นั้นทั้งน่าสนใจทีเดียวที่จะอ่าน :)
Kevin Cruijssen

ดูคำตอบ30 ไบต์ของฉันตาม แต่เดิมคุณเล่นกอล์ฟและเล่นกอล์ฟและเล่นกอล์ฟ
Olivier Grégoire

9

MathGolf , 5 4 ไบต์

╫\╨]

ลองออนไลน์!

มันจะดูเหมือนกับผู้ประกอบการทำงานอย่างถูกต้อง

╫\)╨]   (")" adds 1 to TOS, making rounding behave as expected)

ลองออนไลน์!

คำอธิบาย

╫     Left-rotate all bits in input
 \    Swap top two elements on stack, pushing the input to the top
  ╨   Round up to nearest power of 2
   ]  Wrap in array (just for pretty printing)

ฉันใช้แรงบันดาลใจจากคำถามนี้เพื่อแก้ปัญหาทางออก "ของตัวเอง" ของฉันคือประมาณ 10-12 ไบต์ฉันคิดว่า

ฉันตั้งใจให้ปัดเศษขึ้นให้ใกล้เคียงกับกำลังมากที่สุดของ 2 เพื่อคืนค่าจำนวนตัวเองถ้ามันเป็นจำนวนสอง แต่เนื่องจากความผิดพลาดมันจะปัดไปสู่กำลังสองถัดไป (เช่น 4 -> 8 แทน 4 -> 4 ) นี้จะต้องได้รับการแก้ไขในภายหลัง แต่ตอนนี้มันช่วยฉันหนึ่งไบต์


2
ฉันไม่รู้จัก MathGolf แต่ถ้า]ไม่มีวัตถุประสงค์อื่นนอกเหนือจากการจัดรูปแบบผลลัพธ์ฉันจะบอกว่าคุณไม่จำเป็นต้องรวมไว้ในจำนวนไบต์ของคุณ
ปุย

2
ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้ เนื่องจากสแต็กถูกพิมพ์บนเอาต์พุตเป็นสตริงที่รวมมันจะสแต็กเอาท์พุทที่มีตัวเลข 1 และ 2 เป็น 12 หากยังนับว่าฉันจะลบไบต์ด้วย
maxb

ฉันคิดว่าคุณควรทิ้งไว้ในบางครั้งมันจะบันทึกไบต์เพื่อส่งออกสแต็กเป็นหนึ่งสตริงบางครั้งก็จะเสียค่าใช้จ่ายไบต์
H.PWiz

@ H.PWiz นั่นคือความคิดดั้งเดิมของฉันเพราะมันยุติธรรมที่จะใช้จุดแข็งของภาษาของคุณ บางภาษาพิมพ์เฉพาะส่วนบนสุดของสแต็กเมื่อเสร็จสิ้นแล้วบางภาษาจะพิมพ์เป็นรายการ โดยปกติแล้วจะมีความแตกต่าง 1 ไบต์ แต่เป็นส่วนหนึ่งของความท้าทาย
maxb

8

Java 10, 89 85 70 69 68 ไบต์

v->{for(float j,t=2;;t*=2)for(j=1;j<t;j+=2)System.out.println(j/t);}

ท่าเรือ@Emigmaคำตอบ 05AB1E 'sดังนั้นผลทศนิยมไปเรื่อย ๆ เช่นกัน
-15 ไบต์ขอบคุณที่@Arnauld

ลองออนไลน์

คำอธิบาย:

v->{                      // Method with empty unused parameter and no return-type
  for(float j,t=2;;       //  Loop `t` from 2 upwards indefinitely,
                   t*=2)  //  doubling `t` after every iteration
    for(j=1;j<t;          //   Inner loop `j` in the range [1, `t`),
                j+=2)     //   in steps of 2 (so only the odd numbers)
      System.out.println( //    Print with trailing new-line:
        j/t);}            //     `j` divided by `t`

1
ฉันจะบอกได้ไหมว่าฉันนับครึ่งไบต์ของคุณแล้ว ฉันคิดว่านี่เป็นครั้งแรก ;-)
Olivier Grégoire

@ OlivierGrégoire Dang ตอนนี้เป็นคำตอบของจาวาที่น่าประทับใจ :) ฉันเห็นเวอร์ชัน 37- ไบต์ของคุณเป็นความคิดเห็นในคำตอบของ TCFP แต่คุณก็ยังต้องถอดไบต์ออกอีก ดูเหมือนง่ายมากตอนนี้ในรุ่น 30 ไบต์ของคุณ แต่ก็ยังมีความคิดสร้างสรรค์ที่คุณเล่นกอล์ฟจากรุ่นเริ่มต้น ทำได้ดี!
Kevin Cruijssen



7

Java (JDK 10) , 30 ไบต์

n->(n+.5)/n.highestOneBit(n)-1

ลองออนไลน์!

ส่งกลับ n THรายการในลำดับ

คำตอบนี้เป็นครั้งแรกสืบทอดของโรงแรมพร้อมสนามกอล์ฟของTCFP คำตอบของ ในตอนท้ายสนามกอล์ฟไม่เหมือนคำตอบดั้งเดิมอีกต่อไป (แม้ว่าคณิตศาสตร์ที่ใช้จะเหมือนกัน) ดังนั้นฉันจึงตัดสินใจโพสต์กอล์ฟเป็นคำตอบแยกต่างหากแทนที่จะแสดงความเห็นต่อคำตอบของ TCFP ดังนั้นถ้าคุณชอบคำตอบนี้ไปโหวตคำตอบของ TCFPด้วย! ;-)

กอล์ฟระดับกลางคือ:

n->{int x=0;for(;n>>++x!=1;);return((~(1<<x)&n)*2.+1)/(1<<x+1);} // 64 bytes (TCFP's answer when I started golfing)
n->{int x=0;for(;n>>++x!=1;);x=1<<x;return((~x&n)*2.+1)/x/2;}    // 61 bytes
n->{int x=n.highestOneBit(n);return((~x&n)*2.+1)/x/2;}           // 54 bytes
n->{int x=n.highestOneBit(n);return((~x&n)+.5)/x;}               // 50 bytes
n->((n&~(n=n.highestOneBit(n)))+.5)/n                            // 37 bytes
n->(n-(n=n.highestOneBit(n))+.5)/n                               // 34 bytes
n->(n+.5)/n.highestOneBit(n)-1                                   // 30 bytes, current score

และฉันนั่งอยู่ที่นี่โดยคิดว่าคำตอบของฉันสั้นที่สุดเท่าที่จะทำได้คุณมาและตัดมันมากกว่าครึ่ง! สิ่งที่น่าอัศจรรย์ควรได้รับ +1 จากฉันอย่างแน่นอน
TCFP

@TCFP มันเป็นกระบวนการซ้ำในช่วงเวลาหลายชั่วโมง ฉันโพสต์การเล่นกอล์ฟระดับกลางแต่ละอันเพื่อแสดงความคิดเห็นต่อคำตอบของคุณ แต่ลบมันออกเมื่อฉันพบกอล์ฟที่ดีขึ้น ขอบคุณสำหรับการสรรเสริญ ;-)
Olivier Grégoire

6

05AB1E , 11 8 ไบต์

ที่บันทึกไว้ 3 ไบต์ต้องขอบคุณเควิน Cruijssen

∞oDÅÉs/˜

ลองออนไลน์!

คำอธิบาย

∞         # start an infinite list [1...
 o        # calculate 2**N
  D       # duplicate
   ÅÉ     # get a list of odd numbers up to 2**N
     s/   # divide each by 2**N
       ˜  # flatten

1
-1 ไบต์โดยใช้(รายการไม่มีที่สิ้นสุดเริ่มต้นที่ 1):∞oεDÅÉs/}˜
Kevin Cruijssen

@KevinCruijssen: เยี่ยม! นั่นเป็นคำสั่งที่ฉันไม่เคยเห็นมาก่อน ขอบคุณ :)
Emigna

1
อาและวิธีที่ดีในการประหยัดอีกสองไบต์เนื่องจากการทำแผนที่โดยนัย .. ไม่เคยแม้แต่จะคิดเกี่ยวกับเรื่องนี้ฮ่า ๆ ..
เควิน Cruijssen

1
: O เป็นไปได้อย่างไร คุณย่อคำถามหน้า ~ 2 เป็น 8 ไบต์
Cullub

ฉันกำลังคิดที่จะใช้หมายเลขเฉพาะและรายการ[1,2,4,4,8,8,8,8,16,16,...,2**n]และเตรียมการทำดัชนีเฉพาะที่ถูกต้องตามด้วย/... แต่นั่นก็ไม่ได้ผลดีนัก ดี แต่ไม่8-bytesดี 9LoDÅP)ζสิ่งที่ชอบ
Magic Octopus Urn


5

PowerShellขนาด 40 ไบต์

for($i=2;;$i*=2){1..$i|?{$_%2}|%{$_/$i}}

ลองออนไลน์!

ส่งออกลำดับอนันต์เป็นค่าทศนิยม ข้อ จำกัด ด้านภาษาที่กำหนดในที่สุดจะพบปัญหาความแม่นยำ แต่จัดการ 1,000 รายการแรกได้อย่างง่ายดาย

เริ่มต้นด้วยการตั้งค่า$i=2จากนั้นเข้าสู่forวง แต่ละซ้ำเราสร้างช่วงจากและดึงออกค่าคี่กับ1..$i เหล่านั้นจะถูกป้อนเข้าภายในวงของตัวเองที่เราแบ่งแต่ละที่จะได้รับทศนิยม|?{$_%2} |%{$_/$i}สิ่งเหล่านี้จะถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตเมื่อไพพ์ไลน์นั้นถูกล้างหลังจากforการวนซ้ำทุกครั้ง แต่ละซ้ำเราเพียงที่เพิ่มขึ้น$iโดย$i*=2จะได้รับไปในรอบต่อไป



5

Haskell , 40 ไบต์

s=(1,2):[(i*2+u,j*2)|(i,j)<-s,u<-[-1,1]]

ลองออนไลน์!

ลำดับที่ไม่สิ้นสุดเป็นคู่ของจำนวนเต็ม (เริ่มจาก(1,2))

ค่อนข้างนานกว่าคำตอบของ @ nimiแต่วิธีการนั้นแตกต่างกันโดยสิ้นเชิงดังนั้นฉันจึงตัดสินใจโพสต์ต่อไป

วิธีการแก้ปัญหานี้ขึ้นอยู่กับการสังเกตต่อไปนี้

{12,14,34,18,38,58,78,116,316,...}

  • ผมJ{2ผม-12J,2ผม+12J}
    {{14,34},{18,38},{58,78},{116,316},...}
  • {14,34,18,38,58,78,116,316,...}
  • 12
    {12,14,34,18,38,58,78,116,316,...}

สังเกตว่าคุณจะกลับไปสู่ลำดับที่คุณเริ่มต้นได้อย่างไร!

การแก้ปัญหาการใช้ประโยชน์จากความเป็นจริงนี้ (ร่วมกับความเกียจคร้าน Haskell) sเพื่อคำนวณลำดับ


4

Python 2 - 68 66 ไบต์

-2 ไบต์ขอบคุณเควิน

from math import*
def g(n):a=2**floor(log(n,2));print(n-a)*2+1,2*a

ลองออนไลน์!


คุณสามารถกอล์ฟ 1 ไบต์โดยการเปลี่ยนไปreturn 2*(n-a) return(n-a)*2และคุณสามารถบันทึกไบต์เพิ่มเติมได้โดยใช้ Python 2 แทน 3 ดังนั้นreturnสามารถเป็นprint(พร้อมเครื่องหมายวงเล็บ)
Kevin Cruijssen

2
@KevinCruijssen สำหรับคนที่ไม่ได้ใช้ Python แน่นอนว่าคุณเป็นโปรแกรมเมอร์ Python ที่ดีกว่าฉันอย่างแน่นอน
Don Thousand

ฮิฮิ. : D สิ่งง่าย ๆ เช่นนี้มาพร้อมกับประสบการณ์ที่ฉันเดา ฉันอยู่ในไซต์นี้ประมาณสองปีแล้วตอนนี้ฉันคิดว่า (แก้ไข: ตั้งแต่เมษายน 2016) บางครั้งฉันก็แนะนำสิ่งต่าง ๆ ให้เล่นกอล์ฟเพื่อหาคำตอบที่เขียนด้วยภาษาที่ฉันไม่เคยเห็นมาก่อนสิ่งพื้นฐานบางอย่างใช้ได้ในภาษาส่วนใหญ่ ตัวอย่างเช่นเมื่อสัปดาห์ที่แล้วผมแนะนำกอล์ฟสำหรับคำตอบที่ T-ของ SQLและผมเคยแนะนำกอล์ฟในเป็นคำตอบสีแดง xD
Kevin Cruijssen

2
44 ไบต์ใช้lenและแทนbin log
ovs

@ovs 42 ไบต์
Jonathan Frech

4

Python 3 , 53 51 ไบต์

  • ที่บันทึกไว้สองไบต์ขอบคุณที่mypetlion ; nการนำค่าเริ่มต้นการตั้งค่าใหม่
def f(m=2,n=1):n<m and print(n/m)&f(m,2+n)or f(m+m)

ลองออนไลน์!


สลับพารามิเตอร์เพื่อบันทึก 2 ไบต์:def f(m=2,n=1):n<m and print(n/m)&f(m,n+2)or f(m+m)
mypetlion

1
@mypetlion เจ๋งขอบคุณมาก!
Jonathan Frech

4

R , 42 ไบต์

function(n)c(y<-2^(log2(n)%/%1)*2,2*n-y+1)

ลองออนไลน์!

Denominator,Numeratorยังไม่มีข้อความ=2* * * *(n-2เข้าสู่ระบบ2(n))+1D=2เข้าสู่ระบบ2(n)+1



3

MATL , 8 ไบต์

BnWGEy-Q

ลองออนไลน์!

ส่งคืนตัวเศษแล้วจึงเป็นตัวส่วน ใช้วิธีเดียวกันกับคำตอบ R ของฉันแม้ว่ามันจะมีประสิทธิภาพมากกว่าเล็กน้อย

คำอธิบายพร้อมอินพุต5:

           # implicit input 5
B          # convert to array of bits
           # STACK: [[1 0 1]]
n          # length (place of Most Significant Bit)
           # STACK: [3]
W          # elementwise raise 2^x
           # STACK: [8]
G          # paste input
           # STACK: [8, 5]
E          # double
           # STACK: [8, 10]
y          # copy from below
           # STACK: [8, 10, 8]
-          # subtract
           # STACK: [8, 2]
Q          # increment
           # STACK: [8, 3]
           # implicit end of program, display stack contents

2

ภาษาการเขียนโปรแกรมของเช็คสเปียร์ , 426 ไบต์

,.Ajax,.Ford,.Act I:.Scene I:.[Exeunt][Enter Ajax and Ford]Ajax:You be the sum ofyou a cat.Ford:You cat.Scene V:.Ford:Is twice you nicer I?If solet usScene X.You be twice you.Let usScene V.Scene X:.Ford:Remember twice you.You be the sum oftwice the remainder of the quotient betweenI you a cat.Open heart.You big big big big big cat.Speak thy.Recall.Open heart.You be twice the sum ofa cat a big big cat.Speak thy.Let usAct I.

ลองออนไลน์!

ส่งออกลำดับเป็นอนันต์เมื่อตัวเลขทั้งสองคั่นด้วยช่องว่างโดยแต่ละรายการจะถูกคั่นด้วยบรรทัดใหม่


รักมัน LolYou be twice the sum of a cat
Cullub

ที่จริงแล้วมันคือ "ผลรวมของแมวใหญ่โตสองเท่า" (เช่น 10 ด้วยเหตุผลบางอย่าง)
JosiahRyanW


2

Excel 48 28 ไบต์

บันทึก 20 ไบต์ (!) ต้องขอบคุณ tsh

=(A1+0.5)/2^INT(LOG(A1,2))-1

= MOD (A1 + 0.5,2 ^ (INT (เข้าสู่ระบบ (A1,2)))) / 2 ^ INT (เข้าสู่ระบบ (A1,2))

ถือว่าค่าใน A1 เอาต์พุตเป็นทศนิยม หากคุณต้องการให้เอาต์พุตเป็นเศษส่วนคุณสามารถสร้างรูปแบบที่กำหนดเองสำหรับเซลล์เอาต์พุตเป็น "0 / ### 0" และจะแสดงเป็นเศษส่วน

คำอธิบาย: ยากที่จะอธิบายเนื่องจากมีทางลัดไปที่สูตรนี้ โดยพื้นฐานแล้วตัวเศษเป็นบิตเลื่อนไปทางซ้ายของอินพุทและตัวส่วนคือกำลังต่อไปของ 2 สูงกว่าอินพุทตัวเลข

ฉันเริ่มต้นด้วย Excel ในตัวฟังก์ชั่นสำหรับ BITLSHIFT และ BITRSHIFT แต่พวกเขาจะเลื่อนทั้ง 48 บิตซึ่งไม่ใช่สิ่งที่คุณต้องการ ฟังก์ชัน DEC2BIN (และ BIN2DEC) มีขีด จำกัด ของ -512 ถึง 511 (10 บิต) ดังนั้นสิ่งนี้จะไม่ทำงาน แต่ฉันต้องสร้างหมายเลขใหม่ด้วยโมดูลัสของหมายเลขเดิมจากนั้นคูณสองแล้วเพิ่ม 1 (เนื่องจากตัวเลขทางซ้ายจะเป็น 1 ก่อนการเปลี่ยนเสมอ)

=MOD(A1                        Use MOD for finding what the right digits are
       +0.5                    this will later add the left "1" to the right digits
           ,2^INT(LOG(A1,2)))) Take Log base 2 number of digits on the right
                               this creates the numerator divided by 2 (explained later)
/ 2^INT(LOG(A1,2))             The denominator should be 2^ (Log2 + 1) but instead of 
                               adding a 1 here, we cause the numerator to be divided by 2 instead
                               This gives us a fraction.  In the numerator, we also added .5
                               instead of 1 so that we wouldn't need to divide it in both the
                               numerator and denominator
Then tsh showed how I could take the int/log out of the mod and remove it from numerator/denominator. 

ตัวอย่าง: ป้อนคำอธิบายรูปภาพที่นี่


เกี่ยวกับ=(A1+0.5)/2^INT(LOG(A1,2))-1อะไร
tsh

2

C ++, 97 75 71 ไบต์

-26 ไบต์ขอบคุณ tsh, ceilingcat, Zacharý

float f(int i){float d=2,n=1;while(--i)n=d-n==1?d*=2,1:n+2;return n/d;}

รหัสการทดสอบ:

std::cout << "1\t:\t" << f(1) << '\n';
std::cout << "2\t:\t" << f(2) << '\n';
std::cout << "3\t:\t" << f(3) << '\n';
std::cout << "4\t:\t" << f(4) << '\n';
std::cout << "10\t:\t" << f(10) << '\n';
std::cout << "100\t:\t" << f(100) << '\n';
std::cout << "511\t:\t" << f(511) << '\n';
std::cout << "512\t:\t" << f(512) << '\n';

คุณอาจละเว้นif(!i)return 0;เนื่องจากไม่จำเป็นต้องใช้ 0 ในการท้าทาย
tsh

1
เมื่อพยายามที่จะใช้ภาษา C เหมือนกอล์ฟ คุณควรหลีกเลี่ยงการใช้แต่พยายามwhile เหมือนกับแต่คุณสามารถเขียนคำสั่งอื่นอีกสองคำลงไปได้ ชอบมากกว่าซึ่งจะสั้นกว่าในกรณีส่วนใหญ่ forfor(;exp;)while(exp)?:if else
tsh

1
ผมไม่คิดว่าคุณต้องไปรอบ ๆ(...) d-n-1
Zacharý






1

> <> , 19 18 ไบต์

ใช้ความคิดของ xnorซึ่งแก้ไขโดย Jo King, -1 byte โดยใช้กระจกให้ดีขึ้นและ Jo King อีก -2 ไบต์เนื่องจาก!โจทย์ไม่จำเป็นและ;ไม่จำเป็น

2*1+\1-n
2:,2/?(

ลองออนไลน์!


คุณควรจะตรวจสอบว่ามันมีขนาดเล็กกว่า 2 -0.25ครั้งแรกมิฉะนั้นองค์ประกอบแรกคือ แก้ไขสำหรับจำนวนไบต์เดียวกัน
Jo King

ขอบคุณ! ฉันจัดการเพื่อลบไบต์อื่นโดยนำมิเรอร์กลับมาใช้ใหม่
PidgeyUsedGust

ทำไมคุณถึงกลับเงื่อนไข 16 ไบต์
Jo King

ไม่ได้สังเกตว่ามันจะวนซ้ำต่อไป เราได้รับอนุญาตให้จบอย่างไม่ถูกต้องหรือไม่?
PidgeyUsedGust

ใช่การยกเลิกโดยมีข้อผิดพลาดนั้นใช้ได้ตราบใดที่ OP ไม่ได้ระบุไว้เป็นอย่างอื่น
Jo King


1

APL (Dyalog Unicode)ขนาด 15 ไบต์

1-⍨.5∘+÷2*∘⌊2⍟⊢

ลองออนไลน์!

คำนำหน้าไม่ระบุชื่อแลมบ์ดา

ขอบคุณAdámเป็นเวลา 4 ไบต์และวัวต้มตุ๋น 2 ไบต์

วิธี:

1-⍨.5∘+÷2*∘⌊2⍟⊢  Anonymous lambda, argument   10
            2⍟⊢  Log (⍟) of  in base 2. 210  3.32192809489...
                 Floor. 3.32192809489...  3
        2*∘       Take that power of 2. 2³  8
       ÷          Use that as denominator
   .5∘+            + 0.5  10.5. Using that as numerator: 10.5÷8  1.3125
1-⍨               Swap the arguments (⍨), then subtract. 1-⍨1.3125  1.3125-1  0.3125

1

C # (. NET Core) 69 ไบต์

a=>{int b=1,c=2;while(a-->1){b+=2;if(b>c){b=1;c*=2;}}return b+"/"+c;}

ลองออนไลน์!

Ungolfed:

a=> {
    int b = 1, c = 2;   // initialize numerator (b) and denominator (c)
    while (a-- > 1)     // while a decrements to 1
    {
        b += 2;         // add 2 to b
        if (b > c)      // if b is greater than c:
        {
            b = 1;      // reset numerator to 1
            c *= 2;     // double denominator
        }
    }
    return b + "/" + c; // return fraction as string
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.