นี่เป็นความชั่วร้ายหรือเปล่า?


34

บทนำ

ในทฤษฎีตัวเลขตัวเลขนั้นถือว่าชั่วร้ายหากมีจำนวน 1 คู่ในการแทนเลขฐานสอง ในการท้าทายในวันนี้คุณจะสามารถระบุได้หรือไม่ว่าตัวเลขที่ระบุนั้นเป็นความชั่ว

ท้าทาย

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

  • คุณสามารถส่งออกค่าความจริงใด ๆถ้าจำนวนเป็นความชั่วร้ายและมูลค่าที่เป็นเท็จหากจำนวนนั้นไม่ได้เป็นความชั่วร้าย
  • คุณอาจเข้าและส่งออกในรูปแบบที่ยอมรับใด
  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • ลำดับ OEIS A001969เป็นลำดับที่มีตัวเลขชั่วร้ายทั้งหมด
  • นี่คือรายการของ 10,000 ตัวร้ายหมายเลขแรกสำหรับการอ้างอิง (และกรณีทดสอบเพิ่มเติม!)
  • คำถามนี้คือดังนั้นยิ่งสั้นยิ่งดี
  • อย่าถูกเลื่อนออกไปโดยคำตอบสั้น ๆ ในภาษากอล์ฟ ฉันขอแนะนำให้คุณส่งเป็นภาษาที่คุณต้องการ
  • นี่คือกรณีทดสอบบางส่วน:

    3 => True
    11 => False
    777 => True
    43 => True
    55 => False
    666 => False
    

กระดานผู้นำ

ที่ด้านล่างของหน้าเป็นตัวอย่างสแต็กที่มีกระดานผู้นำสำหรับคำถามนี้ (ขอบคุณ @MartinEnder)

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

# Perl, 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

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


2
ที่เกี่ยวข้อง (XOR-ing ทุกเลขฐานสองเหมือนกันกับการหาผลรวม modulo-2)
Kevin Cruijssen


2
@BetaDecay แต่นั่นไม่ทำงานในสิ่งที่ตรงกันข้าม: นั่นคือคุณไม่สามารถตอบคำถามเหล่านี้ทั้งหมดและลบ mod 2 ดังนั้นความท้าทายนี้เชิญวิธีการใหม่บางอย่าง
สะเทินน้ำสะเทินบก

13
ฉันเชื่อว่า666 => Falseควรเป็นกรณีทดสอบ
user2390246

3
กระดานผู้นำเสียหายสำหรับฉัน
โจคิง

คำตอบ:


35

ชุดประกอบ Z80 (8 บิต), 2 ไบต์

รหัสต่อไปนี้ใช้งานได้กับค่าสูงสุด 255 เท่านั้น:

; Input is given in register A.
; P flag is set if A is evil.
B7     or A
C9     ret


รุ่น 16 บิต (ใช้งานได้ในทุกกรณีทดสอบ) 3 ไบต์

ใช้งานได้กับค่าสูงสุด 65535

; Input is given in BC.
; Output is the same as above.
78     ld A,B
A9     xor C
C9     ret

ถ้าคุณรู้สึกรักการผจญภัย, คุณสามารถโกน 1 ไบต์โดยการจัดเก็บการป้อนข้อมูลในAและCชอบ

      ld BC, 777
C5    push BC
F1    pop AF

แล้ววิ่ง

A9    xor C
C9    ret

อย่างไรก็ตามสิ่งนี้ทำให้เกิดภาระกับผู้โทรดังนั้นมันอาจเป็นไปได้ว่าทั้งสองไบต์ ( push BCและpop AF) ควรถูกนับเช่นกัน


ฉันชอบสิ่งนี้ แต่มันทำงานอย่างไร หน่วยความจำของฉันสำหรับการชุมนุม (6502 + แขน) orเป็นบิตที่มีตัวถูกดำเนินการ 2 ตัว
Northern-bradley

2
@ north-bradley บน Z80 มันบอกเป็นนัยว่าตัวถูกดำเนินการที่สองของตัวorช่วยจำคือตัวสะสม A. ในกรณีนี้คำสั่งจะไม่เปลี่ยน A. มันจะรีเฟรชสถานะการลงทะเบียนเท่านั้น (และโดยเฉพาะอย่างยิ่ง สะท้อนเนื้อหาของ A.
cschultz2048

1
เป็นที่Pได้รับอนุญาตตามcodegolf.meta.stackexchange.com/a/8509/29560 ? เป็นบิตภายในการFลงทะเบียน (ค่าสถานะ) ซึ่งมีเพียงสามคู่ของคำสั่งที่ได้รับผลกระทบ นอกจากนี้คำตอบนี้ไม่ได้กล่าวถึงเพียงการแข่งขันสำหรับค่า 8 บิตเนื่องจากAเป็นการลงทะเบียน 8 บิต ซึ่งหมายความว่ามันไม่สามารถให้คำตอบ777หรือค่าอื่น ๆ ที่ไม่ได้ลงนามเกิน 255
CJ Dennis

2
built-ins ประณาม:P
โจคิง

1
@ cschultz2048 Aมีการจับคู่กับFดังนั้นฉันจะไม่ยอมรับABหรือBAเป็นค่า 16 บิต BCคือ 16 บิต แต่จากนั้นคุณต้องมีคำสั่งพิเศษเพื่อทำการโหลดอันใดอันหนึ่งลงไปAก่อนที่จะ XOR อีกอัน ฉันมักจะกล่าวถึงเสมอว่าคำตอบ Z80 ของฉันทำงานได้เต็มที่ 255 หรือ 65535 ขึ้นอยู่กับคำถาม อาจเพิ่มรุ่น 16 บิตด้วยหรือไม่ ดังนั้น 2 ไบต์สำหรับค่า 8 บิต, 3 ไบต์สำหรับค่า 16 บิต
CJ Dennis

25

JavaScript (ES6), 18 ไบต์

f=n=>n?!f(n&~-n):1

ลองออนไลน์!

คำอธิบาย

ตรรกะ bitwise เป็นดังนี้:

  • สำหรับจำนวนเต็ม~-nเทียบเท่า-(-n)-1กับวิธีการทำแบบn-1อื่น n-1ในกรณีที่ว่าโดยเฉพาะอย่างยิ่งที่เราจะได้ใช้จริง
  • n & (n-1)ลบบิตที่มีนัยสำคัญน้อยที่สุดที่ตั้งไว้ที่1ในnเนื่องจากการลดลงnเปลี่ยนการติดตาม0ทั้งหมดเป็น1และล้าง1ที่ตามมาทันที

    ตัวอย่างสำหรับ n = 24 (11000 ในไบนารี):

      11000 (24)                  11000 (24)
    -     1                   AND 10111 (23)
    -------                   ---------
    = 10111 (23)              =   10000 (16)
       ^                           ^
       |                           |
       +--- this bit is cleared ---+
    

ดังนั้นเราจึงดำเนินการให้บริการโทร recursive มากที่สุดเท่าที่มี1 's ในฐานเป็นตัวแทนของn , inverting !ผลที่ได้ในแต่ละครั้งด้วย สายสุดท้ายจะส่งคืน1เสมอ

ตัวอย่าง:

f(24) = !f(16) = !!f(0) = !!1 = true
f(7) = !f(6) = !!f(4) = !!!f(0) = !!!1 = false

สวัสดีฉันเข้าใจว่าโค้ดทำอะไร แต่ฉันไม่สามารถหาเหตุผล / เหตุผลเบื้องหลังได้แม้ว่าจะอ่านบทความเกี่ยวกับการทำงานระดับบิตหลายครั้งแล้วตรวจสอบว่าตัวเลขมีค่าเป็น 2 หรือไม่ฉันรู้ว่าฟังก์ชันแบบเรียกซ้ำคืออะไร . ฉันไม่เข้าใจว่าทำไมมันถึงถูกใช้แบบนี้และทำไมมันถึงใช้ตอบปริศนาได้นั่นคือลิงก์ระหว่างการเรียกซ้ำและ! f (พลังของสอง) <==> จำนวนความชั่วร้าย หากคุณมีเวลาคำอธิบายยินดีต้อนรับ :) ขอบคุณ!
supafly

1
@supafly ฉันได้เพิ่มคำอธิบายแล้ว และ BTW: ยินดีต้อนรับสู่ PPCG!
Arnauld

การประมวลผลมีความชัดเจนมากในขณะนี้ ถึงกระนั้นความคิด / การให้เหตุผลนั้นมหัศจรรย์จริงๆ! ขอบคุณสำหรับคำอธิบาย!
supafly

13

Python 2 , 25 ไบต์

lambda n:int(bin(n),13)%2

ลองออนไลน์!

bin(n)'0b10101'ให้ผลเหมือน เราอ่านนี่เป็นจำนวนเต็มฐาน -13

ซึ่งลดโมดูโล 2 ถึง 1 1 5 + 1 1 4 + 0 1 3 + 1 1 2 + 0 1 1 + 1 1

11135+1134+0133+1132+0131+1130
1 + 1 + 0 + 1 + 0 + 1
115+114+013+112+011+110(พอควร2)
1+1+0+1+0+1(พอควร2).

ดังนั้นint(bin(n),13)%2เท่ากับ 1 + (จำนวนคนในbin(n)) โมดูโล 2

หากnเป็นสิ่งชั่วร้ายผลที่ได้คือ 1; มิฉะนั้นจะเป็น 0

ฉันหยิบเคล็ดลับนี้จากNoodle9


ตั้งแต่นี้เป็นงูหลาม 2 รหัสจะสั้นลงอีกด้วยเลิก Repr backtick lambda n:int(`n`,13)%2ไวยากรณ์: ลองออนไลน์!
GarethPW

ใช่มีสมองผายลมเล็กน้อยและลืมจุดประสงค์ของการโต้แย้งพื้นฐานของ int อ๊ะ!
GarethPW

11

Japt -h!, 5 4 3 ไบต์

¤å^

ลองมัน


คำอธิบาย

¤       :Convert to base-2 string
 å^     :Cumulatively reduce by XORing
        :Implicitly output the last element negated

@LuisfelipeDejesusMunoz ซึ่งเป็นพอร์ตสำหรับโซลูชัน 05AB1E ของ Kevin ยังใช้งานได้ที่ 5 ไบต์หากคุณต้องการลอง
ปุย

¤¬x vนี่คือคำตอบของเควิน
Luis felipe De jesus Munoz

@ LuisfelipeDejesusMunoz, ใช่นั่นแหล่ะ
ปุย

8

C # (Visual C # Interactive Compiler) , 43 38 ไบต์


Golfed ลองออนไลน์!

i=>Convert.ToString(i,2).Sum(c=>c)%2<1

Ungolfed

i => Convert.ToString( i, 2 ).Sum( c => c ) % 2 < 1

รหัสเต็มกับการทดสอบ

Func<Int32, Boolean> f = i => Convert.ToString( i, 2 ).Sum( c => c ) % 2 < 1;

Int32[] testCases = { 3, 11, 777, 43, 55 };

foreach( Int32 testCase in testCases ) {
    Console.Write( $" Input: {testCase}\nOutput: {f(testCase)}" );
    Console.WriteLine("\n");
}

Console.ReadLine();

ข่าว

  • v1.1 - -5 bytes- แทนที่CountไปSum
  • v1.0 - 43 bytes- โซลูชั่นเริ่มต้น

หมายเหตุ

  • ไม่มี

2
โหวตให้กับหัวเราะหึๆรุ่น "ungolfed" ของคุณให้ฉัน
Jack Brounstein

8

Bash (ไม่มียูทิลิตี้ภายนอก), 56 44 ไบต์

while(($1));do set $(($1/2)) $(($2+$1%2));done;!(($2%2))

(($1))&&exec $0 $[$1/2] $[$2+$1%2];!(($2%2))

นี่ถือว่าตัวเลขถูกค้นพบ$1โดยถูกส่งผ่านเป็นอาร์กิวเมนต์บรรทัดคำสั่งแรก มันก็ถือว่านี่เป็นเชลล์สคริปต์ (เพื่อให้มันสามารถexec)

มันจะเกิดขึ้นอีกครั้งหลังจากที่แฟชั่นใช้exec $0จนกระทั่งจำนวน (ใน$1) ถึงศูนย์หารด้วยสองในแต่ละการวนซ้ำ นอกจากนี้ยังสรุป$2จำนวนครั้งที่เราได้รับหมายเลขที่แปลก ในตอนท้ายหมายเลขเดิมคือ "ชั่วร้าย" หากผลรวมอยู่$2ในที่ไม่แปลก

ตัวอย่างการเรียกร้อง:

$ ./script 3 && echo evil
evil

$ ./script 11 && echo evil

$ ./script 777 && echo evil
evil

$ ./script 43 && echo evil
evil

$ ./script 55 && echo evil

สำหรับ0:

$ ./script 0 && echo evil
./script: line 1: ((: %2: syntax error: operand expected (error token is "%2")
evil

ผลลัพธ์ที่ถูกต้องโดยเพิ่มด้านข้างเล็กน้อย


7

R , 37 26 ไบต์

!sum(scan()%/%2^(0:31))%%2

ลองออนไลน์!

อีกทางเลือกหนึ่งสำหรับคำตอบของ Robert S. ทำให้การแยกบิตในตัวแต่จบลงด้วยการตีกอล์ฟที่น้อยลงและต้องขอบคุณ JayCe และ digEmAll ซึ่งจบลงด้วยการตีกอล์ฟเล็กน้อย

2วันที่ 31-1


ทำไมไม่ hardcode 31 แทนที่จะเป็น log2 ลองออนไลน์!
digEmAll

@digEmAll ซึ่งหมายความว่าไม่จำเป็นต้องกำหนด x
JayCe

2วันที่ 31-1%/%%%

นอกจากนี้ intToBits ยังรองรับเฉพาะค่าจำนวนเต็มสูงสุด 2 ^ 31-1;)
digEmAll

6

05AB1E , 4 ไบต์

bSOÈ

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

คำอธิบาย:

b       # Convert to binary string
        #  i.e. 777 → 1100001001
 S      # Change it to a list of 0s and 1s
        #  i.e. 1100001001 → ['1','1','0','0','0','0','1','0','0','1']
  O     # Take the sum
        #  i.e. ['1','1','0','0','0','0','1','0','0','1'] → 4
   È    # Check if it's even (1 as truthy, 0 as falsey)
        #  i.e. 4 → 1


5

R , 99 98 44 34 28 ไบต์

-1 ต้องขอบคุณ Kevin Cruijssen! -54 ขอบคุณ ngm! -10 ขอบคุณ Giuseppe! -6 ขอบคุณ JayCe!

!sum(intToBits(scan())>0)%%2

ลองออนไลน์!


หรือมิฉะนั้นให้ใช้binaryLogicแพ็คเกจ (39 ไบต์):

!sum(binaryLogic::as.binary(scan()))%%2

2
ผมไม่ทราบว่า R ดีเกินไป แต่ผมค่อนข้างมั่นใจว่า==0จะสามารถ<1:)
เควิน Cruijssen



1
งานนี้เช่นกันผมคิดว่า: 32 ไบต์แต่ต้องบิตของคำอธิบาย :)
digEmAll


5

C (gcc) , 36 ไบต์

c;f(n){for(c=0;n;c++)n&=n-1;n=~c&1;}

ลองออนไลน์!

วิธีการจาก K&R https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

ต้องรวบรวมด้วยการเพิ่มประสิทธิภาพระดับ 0


ไม่ได้รวบรวมบน gcc 5.4.0: error: expected constructor, destructor, or type conversion before '(' token(ลูกศรชี้ไปที่fชื่อฟังก์ชัน) ฉันต้องการแฟล็กคอมไพเลอร์ใด
villapx

1
-Oไม่ได้ทำงานกับ
nwellnhof

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

@nwellnhof @villapx -O0คอมไพล์ดีใน 7.3.0 ของฉัน - เพียงตรวจสอบให้แน่ใจว่าคุณไม่พลาดสถานะคอมไพเลอร์

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


4

PHP, 37 36 ไบต์

<?=1&~substr_count(decbin($argn),1);

วิธีเรียกใช้:

echo '<input>' | php -nF <filename>

หรือลองออนไลน์!

พิมพ์1ค่าจริงและ0ค่าเท็จ

-1 ไบต์ขอบคุณเบอนัวต์ Esnard !


1
<?=1&~substr_count(decbin($argn),1);ฉันคิดว่าคุณสามารถบันทึกหนึ่งไบต์โดยการเอามอดุโลไปนี้: อันนี้ก็พิมพ์ 0 สำหรับเท็จ
เบอนัวต์เอสนาร์ด

ขอบคุณ @BenoitEsnard! มันฉลาดมากฉันได้อัพเดตคำตอบแล้ว :) คุณเรียนรู้สิ่งใหม่ทุกวัน!
Davіd

4

Brachylogขนาด 4 ไบต์

ḃo-0

ลองออนไลน์!

มีหลายกรณีทดสอบ (😈เป็นสิ่งที่ชั่วร้ายและ👼ไม่ใช่)

ใช้บางสิ่งที่ฉันค้นพบเมื่อเร็ว ๆ นี้เกี่ยวกับเพรดิเคต-: เอกสารของมันเพิ่งพูดว่า "ความแตกต่างขององค์ประกอบของ [อินพุต]" แต่สิ่งที่จริง ๆ แล้วก็คือ "ผลรวมขององค์ประกอบที่มีการจัดทำดัชนี องค์ประกอบ -exexed ของอินพุต "

ที่นี่

แปลงตัวเลขให้เป็นอาร์เรย์ของเลขฐานสอง

o เรียงลำดับพวกเขาเพื่อนำ 1s ทั้งหมดเข้าด้วยกัน

ทีนี้ถ้ามีเลข 1 คู่, ก็จะมีจำนวน 1 เท่ากับในดัชนีคู่และดัชนีคี่ ดังนั้น-หลังจากนั้นจะให้ 0 แต่ถ้ามีเลขคี่ของ 1s, จะมี 1 ส่วนพิเศษยื่นออกมาทำให้เกิดความแตกต่างทั้ง -1 หรือ 1

ดังนั้นในที่สุดเรายืนยันว่าความแตกต่างคือ0และได้รับผลจริงหรือเท็จตามนั้น ด้วยข้อกำหนดเอาต์พุตที่มีความยืดหยุ่นมากขึ้นสิ่งนี้สามารถลบออกได้สำหรับคำตอบ 3 ไบต์โดยมี 0 เป็นเอาต์พุตจริงและ -1 และ 1 เป็นเอาต์พุตปลอมทั้งคู่


4

INTERCAL , 90 65 63 ไบต์

DOWRITEIN:1
DO:2<-'#0$#65535'~?':1~:1'
DOREADOUT:2
PLEASEGIVEUP

ลองออนไลน์!

Ungolfed และขยาย (สำหรับสิ่งที่คุ้มค่า) กับความคิดเห็นสไตล์ C

DO WRITE IN :1 //Store user input in 1
DO :2<-:1~:1 //Select just the ones. So will convert binary 10101 to 111
DO :3<-:?2 //Run the unary xor over the result. Essentially, xor with the right bitshifted
           //(with wraparound) value).
DO :9<-#0$#65535 //Intermingle the 16 bit values of all 0's and all 1's, to create a
                 //32 bit number with 1's in the odd positions.
DO :4<-:9~:3 //It turns out that at this point, evil numbers will have no bits in odd
             //positions, and non-evil numbers will have precisely one bit in an odd
             //position. Therefore, the ~ will return 0 or 1 as appropriate.
PLEASE READ OUT :4 //Politely output
PLEASE GIVE UP //Polite and self explanatory

ฉันต้องทำสัมปทานเล็กน้อยเพื่อให้เป็นไปได้ใน INTERCAL ที่แรกก็คือเช่นเดียวกับโปรแกรม INTERCAL ทั้งหมดจะต้องเขียนข้อมูลตัวเลข ดังนั้นถ้าคุณต้องการที่จะป้อนข้อมูลที่คุณจะให้707SEVEN OH SEVEN

ประการที่สองคือ INTERCAL ไม่มีมูลค่าที่แท้จริงหรือเป็นเท็จ แต่จะส่งออกตัวเลขโรมันI(1) หากตัวเลขนั้นไม่เลวหรือเป็น 0 (โดยทั่วไปจะแทนด้วย-เนื่องจากตัวเลขโรมันไม่สามารถแทน 0)

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

DO:9<-#65535$#0
DO:4<-#1~:9~3

3

ทูต , 13 12 ไบต์

Even@Sum@Bin

ลองออนไลน์!

(เก่า 13 ไบต์: Even@1&`~@Bin)

นี่คือองค์ประกอบของสามฟังก์ชัน:

  1. Bin
  2. Sum
  3. Even

การตรวจสอบนี้ว่าSumการBinขยายตัวของการป้อนข้อมูล Ary Evenคือ


: | ฉันไม่มีคำพูด
ASCII- เท่านั้น

@ ASCII- ค่อนข้างกระชับเท่านั้นใช่มั้ย c:
Conor O'Brien

3

dc , 18 16 ไบต์

[2~rd1<M+]dsMx2%

ส่งคืน (ไปที่สแต็ก) 0 สำหรับความชั่วร้ายและ 1 สำหรับความชั่วร้ายไม่ได้

ลองออนไลน์!

ตรงไปตรงมาเป็นธรรม - ซ้ำนำไปใช้ประกอบการหาร / ที่เหลือรวม~กับความฉลาดทางใหม่และเพิ่มส่วนที่เหลือทั้งหมดเข้าด้วยกันแล้ววัยรุ่น 2 (หลังจากใช้เวลาสองไบต์ที่จะพลิกให้มีมาตรฐาน truthy / falsy)

แก้ไขเพื่อสะท้อนความเห็นว่า 0 สำหรับความจริงและ 1 สำหรับความเท็จก็โอเคโดยเฉพาะอย่างยิ่งในภาษาที่ไม่มีif(boolean)โครงสร้าง


3

Python 2, 29 ไบต์

lambda n:~bin(n).count('1')&1

ลองออนไลน์!

ส่งคืน 1 หากเป็น True และอีก 0

แปลงตัวเลขให้เป็นสตริงไบนารีเช่น '0b11' นับจำนวน 1s รับส่วนเติมเต็มของผลลัพธ์และส่งกลับบิตสุดท้ายของส่วนประกอบ (ขอบคุณ https://codegolf.stackexchange.com/users/53560/cdlane !) (1 ​​ถ้าหมายเลขเดิมคือเลขคู่, 0 ถ้าเป็นเลขคี่)


1
ไม่น้อยกว่าไบต์ แต่lambda n:~bin(n).count('1')&1แทนที่ส่วนโมดูลาร์ด้วยสิ่งที่อาจแพงกว่า
cdlane

3

x86-16, 3 ไบต์

รายชื่อ NASM:

 1                                  parity16:
 2 00000000 30E0                        xor al,ah
 3 00000002 C3                          ret

ฟังก์ชันเลขจำนวนเต็ม 16 บิตแย้งใน AX (ซึ่งถูกทำลาย) ส่งคืนค่าใน PF

ฮาร์ดแวร์คำนวณความเท่าเทียมกันของผลสำหรับเราในธง Parity x86 ของ ผู้เรียกสามารถใช้jp/ jnpเพื่อแยกสาขาหรืออะไรก็ได้ที่พวกเขาชอบ

ทำงานได้เหมือนคำตอบ Z80 / 8080 ของ @ cschultz ; ในความเป็นจริง 8086 ได้รับการออกแบบมาเพื่อให้กลแหล่งย้ายจาก 8080 ง่าย

โปรดทราบว่า PF ถูกตั้งค่าจากไบต์ต่ำของผลลัพธ์ที่กว้างขึ้นดังนั้นtest edi,ediจะไม่ทำงานสำหรับรุ่น x86-64 คุณจะต้องนอนในแนวนอนหรือลงไปที่ 16 บิตหรือpopcnt eax, edi/ and al,1(โดยที่ 0 คือความจริง)


3

C ++ (gcc) (-O0),  36  31 ไบต์

int f(int i){i=!i||i%2-f(i/2);}

ลองออนไลน์!


C ++ (เสียงดังกราว) , 35 ไบต์

int f(int i){return!i||i%2-f(i/2);}

ลองออนไลน์!


นี่คือความพยายามครั้งแรกของฉันในการตีกอล์ฟหวังว่าฉันจะไม่ผิดกฎใด ๆ ที่ฉันอาจพลาดไป

แก้ไข:
- ที่บันทึกไว้ 5 ไบต์ขอบคุณที่ @ Jonathan Frech: แทนที่!=โดย-และreturnโดยi=(ทดแทนที่ผ่านมาดูเหมือนจะไม่ทำงานร่วมกับเสียงดังกราวแม้ว่า)
- ตั้งแต่ดูเหมือนว่าจะมีการอภิปรายว่าฉันควรใช้ gcc -O0 ละเมิดฉันคิดว่าฉันจะทำได้ เพียงแค่ให้ทั้งสองรุ่น


ยินดีต้อนรับสู่ PPCG! คุณอาจจะสามารถที่จะบันทึกไบต์โดยการเล่นกอล์ฟ!=ไป-และอีกสี่โดยการเล่นกอล์ฟไปreturn i=
Jonathan Frech

@JonathanFrech มันนานมากแล้วที่ฉันได้ทำ C ++ โดยปริยายมันจะส่งคืน expression ที่มอบหมายล่าสุดในฟังก์ชันโดยปริยายถ้าไม่มี statement return หรือไม่? ฉันเดาว่ามันเป็นเรื่อง gcc เหรอ?
sundar - Reinstate Monica

1
เป็นการละเมิดพฤติกรรมที่ไม่ได้กำหนดเฉพาะ gcc ในระดับการเพิ่มประสิทธิภาพ O0
Jonathan Frech

ด้วยการเปลี่ยนเป็น K&R C คุณสามารถลดขนาดลงเป็น 23 ไบต์ (น่าประทับใจมาก!) ลองออนไลน์!
ErikF

@ JonathanFrech: ทำไมผู้คนถึงยืนยันที่จะใช้gcc -O0แฮ็คที่โง่? มันไม่เหมือนกับความยาวของแผ่นภาษารวมทั้งหมดของภาษาที่สำคัญมากเมื่อเปรียบเทียบการใช้งาน นอกจากนี้ก็จะทำให้มันน่าสนใจมากขึ้นในการเลือกระหว่างreturnเทียบกับการเรียกร้องโดยการอ้างอิง (ปรับปรุง*iในสถานที่) ฉันควรเขียนคำตอบ C หรือ C ++ ไม่ใช่คำตอบที่ไม่ได้รับการเพิ่มประสิทธิภาพ -gcc-only เพราะ un-optimization-gcc ไม่ใช่ภาษาที่มีประโยชน์มาก
Peter Cordes

3

SMLขนาด 32 ไบต์

fun%0=1| %n=(n+ %(n div 2))mod 2

ชี้แจง:

  • % เป็นชื่อฟังก์ชั่น
  • ใช้เวลาในการป้อนข้อมูลใน repl และส่งกลับ 1 หากความชั่วร้ายเป็นอย่างอื่น 0
  • n คืออินพุตผลตอบแทน (n +% (n // 2))% 2

ทำโดยนักศึกษา Carnegie Mellon 2 คน


ยินดีต้อนรับสู่ PPCG และคำตอบแรกที่ดี!
mbomb007

2

Forth (gforth) , 53 ไบต์

: f 1 swap begin 2 /mod -rot xor swap ?dup 0= until ;

ลองออนไลน์!

คำอธิบาย

รับผลรวม xor ของตัวเลขของรูปแบบไบนารีของตัวเลข (หารซ้ำด้วย 2 และ xors ส่วนที่เหลือด้วยค่า "รวม") ซ้ำ ๆ

รหัสคำอธิบาย

: f              \ begin a new word definition
  1 swap         \ place 1 on the stack below the input (n)
  begin          \ start an indefinite loop
    2 /mod       \ get the quotient and remainder of dividing n by 2
    -rot         \ move the sum and remainder to the top of the stack
    xor          \ xor the sum and remainder
    swap         \ move the quotient back to the top of the stack
    ?dup         \ duplicate if > 0
    0=           \ get "boolean" indicating if quotient is 0
  until          \ end the loop if it is, otherwise go back to the beginning
;                \ end the word definition

2

Java 8, 40 36 ไบต์

n->n.toString(n,2).chars().sum()%2<1

-4 bytes ต้องขอบคุณ@Okxสำหรับบางสิ่งที่ฉันไม่ควรลืม ..

ลองออนไลน์

คำอธิบาย:

n->                // Method with Integer parameter and boolean return-type
  n.toString(n,2)  //  Convert the integer to a binary String
   .chars()        //  Convert that to an IntStream of character-encodings
   .sum()          //  Sum everything together
    %2<1           //  And check if it's even

โปรดทราบว่าตัวละครเข้ารหัส0และ1มี48และ49แต่ข้อสรุปพวกเขาและการโมดูโล-2 ยังคงถือผลลัพธ์ที่ถูกต้องเพราะและ48%2 = 049%2 = 1


1
n.toString(n,2)บันทึก 4 ไบต์
Okx

@Okx ไม่แน่ใจว่าฉันลืมเรื่องนั้นได้อย่างไรฮ่า ๆ .. ขอบคุณ! ;)
Kevin Cruijssen

หากคุณได้รับอนุญาตให้ใช้ 1 และ 0 แทนที่จะเป็นจริงและเท็จ (ไม่แน่ใจสำหรับ Java) คุณสามารถเปลี่ยนเป็น: ~n.toString(n,2).chars().sum()%2เพื่อบันทึกหนึ่งไบต์
Mario Ishac

1
@MarDev แต่น่าเสียดาย0และ1ไม่ใช่ความจริง / เท็จใน Java เท่านั้นbooleans/ Booleansเป็น หากความท้าทายจะระบุสองเอาต์พุตที่แตกต่างได้รับอนุญาต<1อาจถูกลบออกเพื่อบันทึก 2 ไบต์แน่นอน :)
Kevin Cruijssen

2

Perl 6 , 21 ไบต์

*.base(2).comb(~1)%%2

ทดสอบมัน

ขยาย:

*\        # WhateverCode lambda (this is the parameter)
.base(2)  # Str representing the binary
.comb(~1) # find the "1"s

%% 2      # is the count of "1"s divisible by 2?


อ่านั่นใช้ไม่ได้กับตัวเลขที่มีมากกว่า 9 บิต ...
โจคิง

1
{:3(.base(2))%%2}
nwellnhof

2

เรติน่า 0.8.2 , 28 ไบต์

.+
$*
+`(1+)\1
$+0
0

11

^$

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

.+
$*

แปลงเป็นเอก

+`(1+)\1
$+0

การแปลงแบบไบนารีบางส่วน (ออกเป็นศูนย์พิเศษ)

0

ลบศูนย์ทั้งหมด

11

โมดูโล่สองคน

^$

ทดสอบว่าผลลัพธ์เป็นศูนย์หรือไม่


2

x86 แอสเซมบลี12 11 ไบต์

F3 0F B8 44 24 04  popcnt      eax,dword ptr [esp+4] ; Load EAX with the number of ones in arg
F7 D0              not         eax ; One's complement negation of EAX
24 01              and         al,1 ; Isolate bottom bit of EAX
C3                 ret             

-1 ไบต์ขอบคุณคำแนะนำของ @ ceilingcat


@ceilingcat จับได้ดี!
Govind Parmar

1
แนะนำแทนinc eax not eaxอาจต้องการพูดถึงว่าต้องใช้โปรเซสเซอร์ที่รองรับการpopcntเรียนการสอน
ceilingcat

1
นอกจากนี้คุณไม่ต้องใช้ arg จาก stack ดูอนุสัญญาโทรที่ได้รับอนุญาตcodegolf.stackexchange.com/a/161497/17360 (คำตอบเชิงลึกเพิ่มเติมของ Peter Cordes codegolf.stackexchange.com/a/165020/17360 ) คำตอบเชิงลึกเพิ่มเติม
qwr

1
โปรดทราบว่าคุณอาจส่งคืนบูลีนใน FLAGS stackoverflow.com/a/48382679/3163618
qwr

666 ควรจะเป็นกรณีทดสอบหรือไม่?
Arcanist Lupus

2

ยูทิลิตีBash + GNU, 33

dc -e2o?p|tr -d 0|wc -c|dc -e?2%p

ลองออนไลน์!

อ่านอินพุตจาก STDIN เอาต์พุต 1 สำหรับ True และ 0 สำหรับ False

  • dc แปลงอินพุตเป็นสตริงไบนารี
  • tr ลบศูนย์
  • wc นับจำนวนที่เหลืออยู่ (และขึ้นบรรทัดใหม่ซึ่งแก้ไขความรู้สึกของตรรกะ)
  • dc คำนวณจำนวน mod 2 และส่งออกคำตอบ

2

Python 2, 28 27 ไบต์

f=lambda n:n<1or n&1^f(n/2)

ลองออนไลน์!

ส่งกลับค่าความจริงหากหนึ่งในนั้นคือthe ones-bit is a 1และthe result of calling this function on n/2 is truthyเป็นจริง (หรือn==0 ) มันทำงานได้เพราะn/2เทียบเท่ากับบิตที่ถูกต้องกับการแบ่งพื้น (ดังนั้น Python 2 เท่านั้น)

รุ่นอื่นยัง28 27 ไบต์

g=lambda n:n<1or g(n&n-1)^1

ลองออนไลน์!

ขึ้นอยู่กับวิธี K&R ของการนับบิตการตั้งค่าอ้างอิงโดย vazt

ทั้งสองนี้อาจสั้นลงสองไบต์หากเอาต์พุตอนุญาตให้มีความเท็จหมายถึงความชั่วร้าย

แก้ไข:ขอบคุณ Amphibological สำหรับการบันทึกไบต์!


คุณสามารถลบช่องว่างระหว่าง1และถึงorเพื่อบันทึก +1 ไบต์ ทางออกที่ดี!
ครึ่งบกครึ่งน้ำ

ผู้ชายฉันคิดว่าฉันพยายามอย่างนั้น จับดี!
Jack Brounstein

2

APL (Dyalog Unicode) , 10 ไบต์SBCS

ฟังก์ชั่นเงียบโดยไม่ระบุชื่อ สามารถใช้อาร์เรย์ของจำนวนเต็มใด ๆ เป็นอาร์กิวเมนต์

≠⌿12∘⊥⍣¯1

ลองออนไลน์!

2∘⊥⍣¯1 แปลงเป็นเลขฐานสองโดยใช้จำนวนมากที่สุดตามที่ต้องการโดยจำนวนที่มากที่สุดแยกตัวเลขตามแกนหลัก

1⍪ เสริมคนตามแกนหลัก

≠⌿ การลด XOR ตามแนวแกนหลัก


2

J , 9 ไบต์

ฟังก์ชั่นเงียบโดยไม่ระบุชื่อ สามารถใช้อาร์เรย์จำนวนเต็มใด ๆ เป็นอาร์กิวเมนต์

1-2|1#.#:

ลองออนไลน์!

1- หนึ่งลบ (เช่นลบล้างตรรกะของ)

2| mod-2 ของ

1#. ผลรวม (สว่างการประเมินผลฐาน 1) ของ

#: การเป็นตัวแทนไบนารี


ทำได้ดีนี่! วิธีการที่น่าเบื่อคือ 9 ไบต์:2|1+1#.#:
Conor O'Brien

ดูเหมือนว่าจะใช้งานได้เพียงเพราะ 777 ในอินพุตทำให้ทุกหมายเลขแสดงเป็น 10 บิต แทนที่ด้วยเช่น 480 และการส่งออกพลิก
FrownyFrog

@ ConorO'Brien น่าเบื่อสำคัญกว่าไม่ถูกต้อง
Adas

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