หมายเลขพับได้


37

รับตัวเลขกำหนดว่าเป็นจำนวนการพับ

จำนวนการพับเป็นจำนวนเช่นนั้นถ้าคุณเอามันมาเป็นตัวแทนไบนารีและ "พับ" มันครึ่งหนึ่งนั่นคือผลลัพธ์ของการคูณ XNOR ของครึ่งแรกของตัวเลขและครึ่งหลังที่มีตัวเลขกลับกันคุณจะได้รับ ศูนย์.

หากตัวเลขมีเลขคี่เป็นเลขฐานสองในเลขฐานสองหลักจะต้องเป็น 1 และจะถูกละเว้นเมื่อทำการพับ

เนื่องจากอาจทำให้ฉันสับสนฉันจะยกตัวอย่าง:

178

การแทนเลขฐานสองของ 178 คือ

10110010

เมื่อต้องการพับนี่เราแบ่งครึ่งก่อน

1011 0010

เราสลับครึ่งหลัง

1011
0100

และเรา XNOR ทั้งสองแบ่งเท่า ๆ กัน:

0000

นี่เป็นศูนย์ดังนั้นนี่คือจำนวนการพับ

1644

การเป็นตัวแทนไบนารีของ 1644 คือ

11001101100

เมื่อต้องการพับนี่เราแบ่งครึ่งก่อน

11001 1 01100

ตรงกลางคือ 1 ดังนั้นเราจึงโยนมันออกไป

11001 01100

เราสลับครึ่งหลัง

11001
00110

และเรา XNOR ทั้งสองแบ่งเท่า ๆ กัน:

00000

นี่เป็นศูนย์ดังนั้นนี่คือจำนวนการพับ

4254

การเป็นตัวแทนไบนารีของ 4254 คือ

1000010011110

เมื่อต้องการพับนี่เราแบ่งครึ่งก่อน

100001 0 011110

จุดกึ่งกลางคือ 0 ดังนั้นนี่ไม่ใช่หมายเลขการพับ

งาน

งานของคุณคือการใช้จำนวนบวกและคืนความจริงถ้าจำนวนที่พับและเท็จถ้าไม่ นี่คือรหัสกอล์ฟดังนั้นให้พยายามนับไบต์ลง

กรณีทดสอบ

นี่คือ 99 หมายเลขแรกของการพับ:

[1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120, 142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370, 412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738, 796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206, 1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848, 1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470, 2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132, 3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752, 3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558]

4 ไม่ใช่หมายเลขพับหรือไม่?
Adnan

1
@Adnan บิตกลางคือ0ไม่ (มันอาจจะคุ้มค่าถ้ามีตัวอย่างงานที่สามเช่นนี้) ไปด้วยกัน 18.
Martin Ender

@MartinEnder Ahh ฉันพลาดส่วนนั้นไป ขอบคุณ :)
Adnan

1
เหตุใดตัวเลขกลางจึงต้องเป็นเลขหนึ่ง มันเป็นเหตุผลหรือมีเหตุผล?
greyShift

3
@timrxd ถ้าคุณพยายามที่จะพับตัวเลขโดยการเพิ่มตัวเลขตรงข้ามตัวเลขที่มีตัวเลขอยู่ตรงกลางคุณจะได้รับสตริงของทุกคน ถ้ามันมีศูนย์ในศูนย์คุณจะจบด้วยศูนย์ในผลลัพธ์
Wheat Wizard

คำตอบ:


12

เยลลี่ขนาด 9 ไบต์

Bœs2µḢ^UȦ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

Bœs2µḢ^UȦ  Main link. Argument: n

B          Binary; convert n to base 2.
 œs2       Evenly split 2; split the base 2 array into chunks of equal-ish length.
           For an odd amount of digits, the middle digit will form part of the
           first chunk.
    µ      Begin a new, monadic chain. Argument: [A, B] (first and second half)
     Ḣ     Head; remove and yield A.
       U   Upend; reverse the digits in [B].
      ^    Perform vectorized bitwise XOR of the results to both sides.
           If A is longer than B, the last digit will remain untouched.
           n is a folding number iff the result contains only 1's.
        Ȧ  Octave-style all; yield 1 iff the result does not contain a 0.

ค่อนข้างแน่ใจว่าฉันลองทำมันได้ดี :)
Jonathan Allan

9

05AB1E , 13 12 ไบต์

รหัส:

bS2ä`R0¸«s^P

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!

คำอธิบาย:

bครั้งแรกที่เราแปลงหมายเลขที่ใช้ไบนารี 1644กลายเป็น11001101100 เราแยกนี้เป็นสองชิ้น ตัวอย่างเช่น11001101100จะกลายเป็น:

[1, 1, 0, 0, 1, 1]
[0, 1, 1, 0, 0]

หากมีจำนวนบิตไม่สม่ำเสมอส่วนแรกจะได้รับบิตเพิ่มเติม เราReverse 0¸«สตริงที่ผ่านมาและผนวกศูนย์ใช้ เหตุผลนี้คือเพื่อให้ผลลัพธ์ที่เป็นจริงเมื่อบิตกลางคือ1 ( 1 XOR 0 = 1และ0 XOR 0 = 0 ) หากไม่มีบิตกลาง 05AB1E จะข้ามบิตสุดท้าย (ศูนย์ที่ต่อท้าย):

[1, 1, 0, 0, 1, 1]
[0, 0, 1, 1, 0, 0]

สิ่งสุดท้ายที่เราต้องทำคือทำXOR ที่ชาญฉลาดและใช้ผลิตภัณฑ์ของผลลัพธ์ หากมีองค์ประกอบหนึ่งมากเกินไปโปรแกรมจะปล่อยองค์ประกอบสุดท้ายออก ( [1, 0, 0] XOR [0, 1] = [1, 1]) ตัวอย่างเช่น:

[1, 1, 0, 0, 1, 1]
[0, 0, 1, 1, 0, 0] XOR

กลายเป็น:

[1, 1, 1, 1, 1, 1]

และผลิตภัณฑ์ของนั่นคือ1ซึ่งก็คือความจริง


ดีมาก! แย่มากที่sต้องมี
Emigna

@Emigna ใช่ฉันควรแก้ไขบางครั้ง สิ่งนี้ทำให้ฉันมีแรงบันดาลใจสำหรับคำสั่งอื่น ๆ : p
Adnan

อืมฉันไปครึ่งทางแล้วลอง 05AB1E เป็นครั้งแรกอันนี้ค่อนข้างยาก bÐg;ôเท่าที่ฉันได้ก่อนที่จะสดชื่นและเห็นคุณตอกตะปูมัน คำตอบที่ดีช่วยฉันเรียนรู้!
Magic Octopus Urn

@carusocomputing ขอบคุณ! เป็นเรื่องที่ดีเสมอที่ได้เห็นผู้คนใหม่ ๆ ที่สนใจใน 05AB1E :) หากคุณมีคำถามใด ๆ คุณสามารถถามในห้องสนทนานี้ได้ตลอดเวลา
Adnan

อึอึ! นี่เป็นคำถามที่แตกต่าง! ฉันอยู่ที่คำถาม "super folding" ฉันพยายามที่จะขยายคำตอบให้กับการแก้ปัญหานั้นเช่นกัน แต่การทำซ้ำเป็นสิ่งที่ท้าทายยิ่งกว่าเดิม
Magic Octopus Urn

9

Java 7, 152 145 142 138 134 ไบต์

boolean f(Long a){byte[]b=a.toString(a,2).getBytes();int i=0,l=b.length,z=l%2<1?1:b[l/2]-48;for(;i<l/2;)z*=b[i]-b[l-++i];return z!=0;}

วนรอบสตริงเหมือนที่มันต้องการสำหรับ Palindrome โดยมองหาศูนย์ ติดตามโดยการคูณซ้ำ ๆ ดังนั้นสิ่งที่คุณต้องทำคือตรวจสอบว่ามันไม่เป็นศูนย์ในตอนท้าย

ไม่มีแถบเลื่อน:

boolean f(Long a){
    byte[]b=a.toString(a,2).getBytes();
    int i=0,l=b.length,z=l%2<1?1:b[l/2]-48;
    for(;i<l/2;)
        z*=b[i]-b[l-++i];
    return z!=0;
}

" แต่สามารถลงเล่นกอล์ฟได้อย่างแน่นอน " ฉันไม่คิดว่าคำตอบปัจจุบันของคุณสามารถเล่นกอล์ฟได้มากขึ้น แต่ฉันต้องการพิสูจน์ว่าผิด +1 (PS: ส่วนที่ ungolfed ของคุณมีวงเล็บปิดสองอัน)
Kevin Cruijssen

byte[]b=(a+"").getBytes();สั้นกว่าchar[]b=a.toString(a,2).toCharArray();และยังคงใช้งานได้ (-12 ไบต์)
Kevin Cruijssen

1
@KevinCruijssen นั่นไม่ใช่สตริงเลขฐานสอง AFAICT แต่ฉันคิดว่าgetBytesยังคงสามารถทำงานกับถ่าน [] ขอบคุณ :)
Geobits

@KevinCruijssen ใช่รู้แล้วและลบความคิดเห็น> _ <
Magic Octopus Urn

@Geobits: เนื่องจากวิธีการสามารถคืนค่าความจริงหรือเท็จใด ๆ คุณก็สามารถกลับมาzเป็น int ( 0สำหรับ falsy, อื่น ๆ เพื่อความจริง) - จะช่วยให้คุณไม่กี่ไบต์
shooqie

9

JavaScript (ES6), 61 57 52 ไบต์

คำนวณซ้ำ:

(bit(N) XOR bit(0)) AND (bit(N-1) XOR bit(1)) AND (bit(N-2) XOR bit(2)) etc.

โดยที่Nเป็นตำแหน่งของบิตสูงสุดที่ตั้งค่าไว้ในอินพุต

หากอินพุตมีจำนวนบิตแปลก ๆ บิตกลางคือ XOR'ed พร้อมกับไม่ได้กำหนด (ค่าที่ส่งคืนโดยpop()ในอาเรย์ที่ว่างเปล่า) ซึ่งช่วยให้ไม่เปลี่ยนแปลง ดังนั้น0บิตกลางจะเคลียร์เอาต์พุตและ1บิตกลางจะไม่เปลี่ยนแปลงผลลัพธ์ของการดำเนินการอื่น - ซึ่งสอดคล้องกับคำจำกัดความการท้าทายของหมายเลขพับ

f=(n,[a,...b]=n.toString(2))=>a?(a^b.pop())&f(n,b):1

// testing integers in [1 .. 99]
for(var i = 1; i < 100; i++) {
  f(i) && console.log(i);
}


ดี! คุณสามารถอธิบายได้ว่าวิธีนี้คำนึงถึงบิตกลางหรือไม่
ETHproductions

@ETHproductions - แน่นอน ฉันได้เพิ่มบันทึกเกี่ยวกับเรื่องนั้น
Arnauld

9

Python 2, 57 ไบต์

s=bin(input())[2:]
while''<s!='1':s[-1]==s[0]<_;s=s[1:-1]

ส่งออกผ่านรหัสทางออก : ข้อผิดพลาดสำหรับ Falsey และไม่มีข้อผิดพลาดสำหรับ Truthy

แปลงอินพุตเป็นไบนารี ตรวจสอบว่าอักขระตัวแรกและตัวสุดท้ายไม่เท่ากันรักษาและทำซ้ำหลังจากลบตัวอักษรเหล่านั้น

การเปรียบเทียบให้เกิดข้อผิดพลาดถ้าตัวอักษรตัวแรกและครั้งสุดท้ายที่มีไม่เท่ากันโดยพยายามที่จะประเมินตัวแปรที่ไม่ได้กำหนดชื่อs[-1]==s[0]<_ _หากพวกเขามีค่าเท่ากันโซ่ของความไม่เท่าเทียมกันจะถูกไฟฟ้าลัดวงจรแทน เมื่อเราได้รับไปยังองค์ประกอบกลาง1ที่whileห่วงคือการยุติกรณีพิเศษเป็นตกลง

ฉันสงสัยว่าวิธีการทางคณิตศาสตร์อย่างหมดจดจะสั้นลงด้วยการเรียกซ้ำเช่นf=lambda n,r=0:...f(n/2,2*r+~n%2)...การ chomp ปิดตัวเลขไบนารีจากปลายพลิกและกลับและตรวจสอบเมื่อnและจะขึ้นเท่ากับศูนย์r 1มีรายละเอียดปลีกย่อยแม้ว่ามีศูนย์นำและศูนย์


8

Python 2, 94 79 72 67 ไบต์

F=lambda s:s in'1'or(s[0]!=s[-1])*F(s[1:-1])
lambda n:F(bin(n)[2:])

บันทึก 12 ไบต์ด้วย@xnor

กำหนดฟังก์ชั่นที่ไม่มีชื่อในบรรทัดที่สอง

คำอธิบาย (เพิ่มช่องว่างบางส่วน):

F = lambda s:                                        # We define a function, F, which takes one argument, the string s, which returns the following:
             s in'1'                                 # Gives true if s is '' or s is '1', the first case is a base case and the second is for the middle bit case.
                     or(s[0] != s[-1])               # Or the first and last are different
                                      * F(s[1:-1])   # And check if s, without the first and last element is also foldable.
lambda n: F(bin(n)[:-2])                             # The main function, which calls F with the argument in binary form.

ลองที่นี่!


4
s==''or s=='1'สามารถs in'1'
xnor

โอ้คล้ายกันมาก - จิตใจดี ...
Jonathan Allan

1
สามารถทางคณิตศาสตร์and *นอกจากนี้ยังfได้รับอนุญาตให้ไม่มีชื่อ
xnor

6

Haskell, 89 88 86 ไบต์

f n|n<2=[n]|1>0=mod n 2:f(div n 2)
g n=elem(product$zipWith(+)(f n)$reverse$f n)[1,2]

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


5

Python 2, 100 99 95 94 Bytes

สิ่งนี้ให้ความรู้สึกยาวไปหน่อย แต่ฉันจะทำงานต่อไป :) พิมพ์ a 1หากจำนวนสามารถถูกพับได้เป็น0อย่างอื่น

a=bin(input())[2:]
b=len(a)
print(a[b/2]>=`b%2`)*all(c!=d for c,d in zip(a[:b/2],a[:~b/2:-1]))

ทดสอบที่นี่!

ขอบคุณ Wheat Wizard สำหรับบันทึกขนาด 1 ไบต์ :)

ขอบคุณ Rod สำหรับ 5-byte save! :)


คุณสามารถแทนที่b-1ด้วย~b
Wheat Wizard

@WheatWizard ดีมากขอบคุณ!
Kade

คุณสามารถแทนที่[1,a[b]>'0'][len(a)%2]ด้วย(a[b]>=`len(a)%2`)
Rod

นอกจากนี้คุณสามารถเพิ่มe=len(a)การเปลี่ยนแปลงb=e/2 `e%2`, บันทึก 1 ไบต์ และจากนั้นคำตอบของหลามทั้งสองจะถูกผูกไว้กับค:
ร็อด

2
@Rod Awesome: D ยกเว้นตอนนี้คำตอบอื่น ๆ จะบดขยี้ฉัน;)
Kade

4

> <> , 37 + 3 = 40 ไบต์

<,2-@:%2:v!?:
=2lrv?=1l<+={$r0?
0=n;>

คาดว่าอินพุตจะแสดงบนสแต็กเมื่อเริ่มต้นโปรแกรมดังนั้นจึงมีค่า 3 ไบต์สำหรับ-vแฟล็ก

ลองออนไลน์!


4

เยลลี่ขนาด 13 ไบต์

Bœs2U0¦z0^/€Ạ

TryItOnline
หรือจับคู่คำศัพท์สูงสุด 4558

อย่างไร?

Bœs2U0¦z0^/€Ạ - Main link: n
B             - binary
 œs2          - split into 2 slices (odd length will have first longer than second)
     0¦       - apply to index 0 (the right hand one)
    U         - reverse
       z0     - zip together with filler 0 (thus central 1 or 0 will pair with 0)
          /€  - reduce with for each
         ^    -     XOR
            Ạ - All truthy?

4

Perl, 46 ไบต์

รวม +1 สำหรับ -p

รันด้วยหมายเลขบน STDIN

folding.pl <<< 178

folding.pl:

#!/usr/bin/perl -p
$_=($_=sprintf"%b",$_)<s%.%!/\G1$/^$&^chop%eg

ฉันคิดว่ามันเป็นข้อผิดพลาดของ Perl ที่มันใช้งานได้ ภายใน$_ไม่ควรได้รับการอัปเดตตำแหน่งการจับคู่เมื่อมีการแก้ไข ในโปรแกรมนี้ตำแหน่งการแข่งขันจะเคลื่อนไหวเกินกว่าที่จะสิ้นสุด$_


ทำได้ดีนี่. ดีที่สุดที่ฉันทำได้คือ 59 perl -pe '$_=sprintf("%b",$_)=~/^(.*)1?(??{reverse$^N=~y%01%10%r})$/': / /
Dada

4

Brachylogขนาด 16 ไบต์

ḃḍ{↔|h1&b↔}ᵗz₂≠ᵐ

มันไม่ทำงานออนไลน์ ...

รับอินพุตผ่านตัวแปรอินพุตและเอาต์พุตผ่านสำเร็จหรือล้มเหลว มันอาศัยอย่างหนักz₂ซึ่งเป็นภาษาตั้งแต่วันที่ 30 เมษายน แต่เราลืมที่จะขอให้มันดึง TIO ดังนั้นในขณะนี้จะใช้งานได้เฉพาะในการติดตั้งภาษาท้องถิ่น ไม่ว่าจะด้วยวิธีใดอาจเป็นวิธีที่ไร้เดียงสามาก

                    The input
ḃ                   's binary representation
 ḍ                  split in half
  {       }ᵗ        with its second half
   ↔|               either reversed, or
     h1             if it starts with 1
       &b           relieved of its first element
         ↔          and then reversed
              ≠     has no duplicate elements
            z  ᵐ    in any pair of elements zipped from the two halves
             ₂      which are equal in length.

Brachylog (บน TIO), 19 ไบต์

ḃḍ{↔|h1&b↔}ᵗlᵛ↖Lz≠ᵐ

ลองออนไลน์!

lᵛ↖Lzเทียบเท่ากับการทำงานz₂(ถ้าคุณไม่ใช้ตัวแปร L ที่อื่น) แต่ก็ยาวกว่าสามไบต์เช่นกัน


3

Python 2, 76 71 69 ไบต์

-5 ไบต์ขอบคุณ @Dennis ( ''มีอยู่'1'ดังนั้นแทนที่in('','1')ด้วยin'1')
-2 ไบต์ขอบคุณ @xnor (ใช้การคูณ(...)*แทนand)

f=lambda n:f(bin(n)[2:])if n<''else n in'1'or(n[0]!=n[-1])*f(n[1:-1])

Ideone

ฟังก์ชั่นแบบเรียกซ้ำเมื่อมีการโทรครั้งแรกnจะมีตัวเลขดังนั้นจึงประเมินว่าน้อยกว่าสตริงว่างด้วยif n<''และฟังก์ชันจะถูกเรียกอีกครั้ง แต่มีการnส่งไปยังสตริงไบนารี หางเป็นทั้งสตริงว่าง (แม้ความยาวบิต) หรือบิตกลางซึ่งผลตอบแทนจริงสำหรับที่ว่างเปล่าหรือ'1'; บนลงล่างมันทดสอบบิตด้านนอกเพื่อความไม่เท่าเทียมกัน (เทียบเท่ากับ XOR) และเกิดn[1:-1]ขึ้นซ้ำอีกครั้งในบิตชั้นใน, .


1
ฉันคิดว่าได้n in'1'ผล
เดนนิส

ยอดเยี่ยมฉันจะไม่คิดว่า''มีอยู่'blah'แต่ก็ใช่ :) :)
Jonathan Allan

1
สามารถทางคณิตศาสตร์and *
xnor

3

Python 2, 63 ไบต์

s=bin(input())[2:]
while s[0]!=s[-1]:s=s[1:-1]or'1'
print'1'==s

พิมพ์หรือTrue Falseใช้การแทนค่าฐานสองของsและลบอักขระแรกและอักขระสุดท้ายซ้ำ ๆ ตราบใดที่อักขระเหล่านั้นไม่เท่ากัน 1ตรวจสอบว่าสิ่งที่ยังคงเป็นสตริงที่ว่างเปล่าหรือกลาง นี้จะกระทำโดยการแปลง''ไป'1'และการตรวจสอบถ้าผลเท่ากับ'1'ซึ่งยังหลีกเลี่ยงข้อผิดพลาดดัชนีในสตริงที่ว่างเปล่า


3

PowerShell v2 +, 143 ไบต์

สองแนวทางที่เป็นไปได้ทั้งจำนวนไบต์เดียวกัน

วิธีที่ 1:

param($n)if($n-eq1){$n++}$o=1;0..(($b=($n=[convert]::ToString($n,2)).length-1)/2-!($b%2))|%{$o*=$n[$_]-ne$n[$b-$_]};$o*(+"$($n[$b/2])",1)[$b%2]

รับอินพุต$nถ้าเป็น-equal to 1(เป็นกรณีพิเศษสำหรับอัลกอริทึมนี้) ให้เพิ่มขึ้น ตั้งค่า$output ให้เป็น1(เช่นสมมติว่าเป็นความจริง) จากนั้นวนซ้ำจาก0ไปยังจุดกึ่งกลางของหมายเลขอินพุตที่ถูก[convert]แก้ไขเป็นไบนารี บันทึก-!($b%2)ไปยังบัญชีสำหรับเลขฐานสองความยาวคี่

แต่ละซ้ำเราเปรียบเทียบหลักปัจจุบัน$n[$_]กับหลักความยาวจากปลาย$n[$b-$_]และคูณผลบูลีนเข้า$o(โดยการดำเนินการ-andทั้งหมดของพวกเขา) เมื่อการวนซ้ำเสร็จสิ้นเราจำเป็นต้องคำนึงถึงเลขฐานสองกลางซึ่งเป็นแบบหลอกในตอนท้าย (อาร์เรย์ที่ทำดัชนีผ่าน$b%2) สิ่งนั้น1หรือ0ถูกปล่อยไว้บนไพพ์ไลน์และเอาท์พุทก็เป็นนัย


วิธีที่ 2:

param($n)for($n=[convert]::ToString($n,2);$n.Length-gt2){if($n[0]-ne$n[-1]){$n=$n[1..($n.Length-2)]}else{0;exit}}($n-join'+'|iex)-eq1-or$n-eq10

รับอินพุตและทำกระบวนการเดียวกันกับ[convert]จำนวนเป็นไบนารี จากนั้นเราก็อยู่ในforวงตราบเท่าที่.lengthของสตริงไบนารี-greater hant 2เมื่อเราอยู่ในวงถ้าเป็นครั้งแรก$n[0]และครั้งสุดท้าย$n[-1]ตัวเลขมี-nOT equal ชิ้นทั้งสองออกจากตัวเลขและอีกครั้งมันเข้าไปในร้าน$n $nมิฉะนั้นการส่งออกและ0 exitเมื่อเราออกจากวงเราทั้งสองได้ (อาร์เรย์ของ1, 1,0, 0,1, 1,1หรือ0,0) หรือสตริงไบนารีสอง10หรือ 113 ดังนั้นเราต้องทดสอบความเป็นไปได้ทั้งสองนั้น สำหรับครั้งแรกที่เรา-join $nร่วมกับ+และประเมินผลและทดสอบว่ามันเป็น1(นี้เป็นจริงสำหรับอาร์เรย์1, 1,0และ0,1แต่$falseสำหรับอาร์เรย์0,0และ1,1หรือสตริง10หรือ11) อีกครึ่งหนึ่ง-orคือการทดสอบว่า$nเป็น-equal to 10(เช่นอินพุตของ2) บูลีนนั้นถูกทิ้งไว้บนไพพ์ไลน์และเอาท์พุทก็เป็นนัย



2

MATL , 16 ไบต์

tBn2/kW&\hBZ}P=~

ความจริงคืออาร์เรย์ที่มีทุกสิ่ง ตรวจสอบ truthy / เกณฑ์ falsy ที่นี่

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบ 20 กรณีแรก

คำอธิบาย

ลองใช้อินพุต1644เป็นตัวอย่าง

t     % Imolicitly take input. Duplicate
      %   STACK: 1644, 1644
Bn    % Number of digits of binary expansion
      %   STACK: 1644, 11
2/k   % Divide by 2 and round down
      %   STACK: 1644, 5
W     % 2 raised to that
      %   STACK: 1644, 32
&\    % Divmod
      %   STACK: 12, 51
h     % Concatenate horizontally
      %   STACK: [12 51]
B     % Binary expansion. Each numnber gives a row, left-padded with zeros if needed
      %   STACK: [0 0 1 1 0 0; 1 1 0 0 1 1]
Z}    % Split into rows
      %   STACK: [0 0 1 1 0 0], [1 1 0 0 1 1]
P     % Reverse
      %   STACK: [0 0 1 1 0 0], [1 1 0 0 1 1]
=~    % True for entries that have different elements
      %   STACK: [1 1 1 1 1 1]
      % Implicitly display

2

PHP, 101 ไบต์

for($r=1;$i<($l=strlen($b=decbin($argv[1])))>>1;)$r*=$b[$i]^1^$b[$l-++$i]^1;$r*=$l%2?$b[$i]:1;echo$r;

หรือกับบันทึก

for($r=1,$s=log($n=$argv[1],2)^0;2*$i<$s;)$r*=($n>>$i)%2^($n>>$s-$i++)%2;$s%2?:$r*=($n>>$i)%2;echo$r;

108 ไบต์พร้อมอาเรย์

for($r=1,$a=str_split(decbin($argv[1]));$a;)$r*=array_pop($a)!=($a?array_shift($a):0);$r*=$a?$a[0]:1;echo$r;

ค่าจริง <10,000

1,2,6,10,12,22,28,38,42,52,56,78,90,108,120,142,150,170,178,204,212,232,240,286,310,346,370,412,436,472,496,542,558,598,614,666,682,722,738,796,812,852,868,920,936,976,992,1086,1134,1206,1254,1338,1386,1458,1506,1596,1644,1716,1764,1848,1896,1968,2016,2110,2142,2222,2254,2358,2390,2470,2502,2618,2650,2730,2762,2866,2898,2978,3010,3132,3164,3244,3276,3380,3412,3492,3524,3640,3672,3752,3784,3888,3920,4000,4032,4222,4318,4462,4558,4726,4822,4966,5062,5242,5338,5482,5578,5746,5842,5986,6082,6268,6364,6508,6604,6772,6868,7012,7108,7288,7384,7528,7624,7792,7888,8032,8128,8318,8382,8542,8606,8814,8878,9038,9102,9334,9398,9558,9622,9830,9894

2

Julia , 66 ไบต์

c(s)=s==""||s=="1"||(s[1]!=s[end]&&c(s[2:end-1]))
f(x)=c(bin(x))

กอล์ฟครั้งแรกของฉัน! ทำงานในลักษณะเดียวกับวิธีการแก้ปัญหาของ Python ที่มีความยาวเท่ากันแตกต่างกันเล็กน้อยเนื่องจากภาษา (ฉันคิดขึ้นเอง แต่ ...

คำอธิบาย:

c(s) = s == "" || # Base case, we compared all the digits from 
                  # both halves.
       s == "1" || # We compared everything but left a 1 in the middle
       (s[1] != s[end] &&  # First digit neq last digit (XNOR gives 0).
        c(s[2:end-1]))     # AND the XNOR condition is satisfied for the  
                           # 2nd to 2nd to last digit substring.
f(x) = c(bin(x))  # Instead of a string f takes an integer now.

2

C, 223 201 189 194 178 ไบต์

i,j,m,l,r;f(n){for(m=j=1,i=n;i/=2;++j);for(l=r=i=0;i<j/2;i++)r|=n&m?1<<j/2-i-1:0,m*=2;i=(j&1&&n&m)?i+1:(j&1)?l=r:i;n>>=i;for(m=1;i<j;i++)l|=n&m,m*=2;return !(~(l^r)&(1<<j/2)-1);}

ขั้นตอนวิธีกำลังดุร้าย เรามาดูกันว่ามันสามารถตีกอล์ฟได้ไกลแค่ไหน

ทดสอบการตั้งค่าข้อผิดพลาดที่ดีกว่า ...

 main()
 {
    int t, s, u, testSet[] = 
    {
    1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120,
    142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370,
    412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738,
    796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206,
    1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848,
    1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470,
    2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132,
    3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752,
    3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558
    };


    for (u=s=0,t=1;t<=4558;t++)
    {
        if (f(t))
        {
          u++;            
          if (testSet[s++]!=t)
              printf("BAD VALUE %d %d\n", testSet[s-1], t);
        }
    }

    printf("%d == %d Success\n", u,
           sizeof(testSet)/sizeof(testSet[0]));

}

2

MATL , 13 ไบต์

BttP=<~5Ms2<*

ความจริงคืออาร์เรย์ที่มีทุกสิ่ง ตรวจสอบ truthy / เกณฑ์ falsy ที่นี่

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบ 20 กรณีแรก

คำอธิบาย

การใช้อินพุต1644เป็นตัวอย่าง:

B     % Implicit input. Convert to binary
      %   STACK: [1 1 0 0 1 1 0 1 1 0 0]
t     % Duplicate
      %   STACK: [1 1 0 0 1 1 0 1 1 0 0], [1 1 0 0 1 1 0 1 1 0 0]
tP=   % Element-wise compare each entry with that of the reversed array
      %   STACK: [1 1 0 0 1 1 0 1 1 0 0], [0 0 0 0 0 1 0 0 0 0 0]
<~    % True (1) if matching entries are equal or greater
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1]
5M    % Push array of equality comparisons again
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1], [0 0 0 0 0 1 0 0 0 0 0]
s     % Sum of array
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1], 1
2<    % True (1) if less than 2
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1], 1
*     % Multiply
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1]
      % Implicitly display

1

JavaScript, 71 ไบต์

(i,n=i.toString(2))=>/^(1*)2?\1$/.test(+n+ +n.split``.reverse().join``)

กำหนดฟังก์ชั่นที่ไม่ระบุชื่อ

วิธีการนี้อาจไม่สั้นที่สุด แต่เท่าที่ฉันรู้มันเป็นเอกลักษณ์ มันเพิ่มตัวเลขในเลขฐานสองให้กับตัวเองย้อนกลับถือว่าพวกเขาเป็นทศนิยมแล้วตรวจสอบว่าผลลัพธ์ที่ถูกต้องโดยใช้ regex


1

เรติน่า, 92 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

.+
$*
+`(1+)\1
${1}0
01
1
^((.)*?)1??((?<-2>.)*$.*)
$1¶$3
O$^`.(?=.*¶)

T`01`10`^.*
^(.*)¶\1

ลองออนไลน์

แปลงเป็นเอก แปลงเป็นไบนารี่ ตัดตัวเลขครึ่งแล้วลบกลาง1ถ้ามี กลับครึ่งแรก สลับหนึ่งและศูนย์ จับคู่ถ้าทั้งสองแบ่งเท่ากัน


1

Retina, 71 70 60 ไบต์

.+
$*
+`^(1*)\1(1?)\b
$1 $.2
+`^ (.)(.*) (?!\1).$
$2
^( 1)?$

ฉันอาจยังมีอีกมากที่ต้องเรียนรู้เกี่ยวกับ Retina (เช่น regex ซ้ำ?) คำอธิบาย: ขั้นตอนที่ 1 แปลงจากทศนิยมเป็นเอก ขั้นตอนที่ 2 แปลงจาก unary เป็น pseudo-binary ขั้นตอนที่ 3 ลบตัวเลขจากปลายทั้งสองตราบเท่าที่พวกเขาไม่ตรงกัน ขั้นตอนที่สี่ตรงกับตัวเลือกขั้นสุดท้ายตรงกลาง 1 หากจำเป็น แก้ไข: บันทึกแล้ว 1 ไบต์ขอบคุณ @ mbomb007 บันทึก 10 ไบต์ด้วยการปรับปรุงการแปลงไบนารีของฉันเป็นแบบเอกนารี


บรรทัดแรกสามารถหรือ.* .+
mbomb007

1

Python 2, 61 59 ไบต์

การบันทึกสองไบต์สำหรับการแปลงกะเป็นการคูณ

m=n=input()
i=0
while m:i*=2;i+=m&1;m/=2
print(n+i+1)&(n+i)

ส่งคืน0สำหรับหมายเลขการพับและสิ่งอื่นสำหรับการไม่พับ ใช้วิธีการสองบิต


0

C, 65 63 ไบต์

สองไบต์สำหรับแปลงกะการคูณ

i,m;
f(n){
 m=n;i=0;
 while(m)i*=2,i+=m&1,m/=2;
 return(n+i+1)&(n+i);
}

ช่องว่างถูกแยกออกจาก bytecount แล้วส่งคืน 0 สำหรับหมายเลขการพับและสิ่งอื่นใดสำหรับการไม่พับ ใช้วิธีการสองบิต


0

k, 77 ไบต์

{X:2 0N#X@&:|\X:0b\:x;c:#:'X;$[(~*X 1)|(=). c;~|/(=).(::;|:)@'(-&/ c)#'X;0b]}

โดยวิธีการอธิบายการแปล q

{X:2 0N#X where maxs X:0b vs x;
  c:count each X;
  $[(not first last X)or(=). c;
    not any(=).(::;reverse)@'(neg min c)#'X;0b]
  };
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.