ตัวเลขเป็นอย่างไร


47

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

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

กรณีทดสอบ:

14 -> 1

20 -> 2

94208 -> 12

7 -> 0

-4 -> 2

คำตอบที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ

เคล็ดลับ:ลองแปลงตัวเลขเป็นเบส 2 ดูว่ามีอะไรบอกคุณ


11
@AlexL คุณสามารถดูได้ว่ามันไม่เคยแปลกเลยแม้แต่อนันต์ ฉันสามารถบันทึกไม่กี่ไบต์ถ้าอนุญาตให้ใช้สแต็กมากเกินไป)
Geobits

1
The input will be a nonzero integerสิ่งนี้จำเป็นต้องได้รับการแก้ไขหรือไม่หลังจากที่คุณแสดงความคิดเห็นเกี่ยวกับศูนย์ว่าเป็นอินพุตที่เป็นไปได้หรือไม่
trichoplax

2
สิ่งนี้เรียกว่าการประเมินมูลค่า 2 adic หรือคำสั่งซื้อ 2 adic
พอล

7
จากข้อมูลอ้างอิงจาก Wikipedia ค่า p-adic ของ 0 ถูกนิยามว่าเป็นอนันต์
พอล

3
เป็นคำถามที่แปลกอะไร!
corsiKa

คำตอบ:


23

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

Æfċ2

ใน Jelly เวอร์ชันล่าสุดÆEḢทำงานได้ (3 ไบต์)

Æf      Calculate the prime factorization. On negative input, -1 appended to the end.
  ċ2    Count the 2s.

ลองมันนี่


ใช้งานได้กับอินพุตเชิงลบด้วย
lirtosiast

1
@ThomasKwa ฉันไม่คิดว่าจะนับ อาจเป็นคำถามเมตา
orlp

ไม่ดีใช่ไหม จริง ๆ แล้วมันออก 0 สำหรับเลขคี่
busukxuan

@busukxuan มันใช้ไม่ได้กับ± 1
lirtosiast

1
@Tyzoid Jelly ใช้หน้ารหัสของตัวเองในล่ามออฟไลน์ตามค่าเริ่มต้นโดยที่หนึ่งถ่านเป็นหนึ่งไบต์
lirtosiast

93

รหัสเครื่อง x86_64 ขนาด 4 ไบต์

คำสั่ง BSF (บิตสแกนไปข้างหน้า) ทำสิ่งนี้อย่างแน่นอน !

0x0f    0xbc    0xc7    0xc3

ในการประกอบแบบ gcc นี่คือ:

    .globl  f
f:
    bsfl    %edi, %eax
    ret

อินพุตจะถูกกำหนดในการลงทะเบียน EDI และส่งคืนในการลงทะเบียน EAX ตามมาตรฐานการเรียกแบบ64 บิต

เนื่องจากการเข้ารหัสแบบสองส่วนเสริมของทั้งสองวิธีนี้ทำงานสำหรับ -ve เช่นเดียวกับ + ve ตัวเลข

นอกจากนี้แม้จะมีเอกสารอธิบายว่า"ถ้าเนื้อหาของตัวถูกดำเนินการต้นทางเป็น 0 เนื้อหาของตัวถูกดำเนินการปลายทางจะไม่ได้กำหนด" ฉันพบ Ubuntu VM ของฉันว่าผลลัพธ์ของf(0)เป็น 0

คำแนะนำ:

  • บันทึกข้างต้นเป็นevenness.sและประกอบกับgcc -c evenness.s -o evenness.o
  • บันทึกไดรเวอร์ทดสอบต่อไปนี้เป็นevenness-main.cและคอมไพล์ด้วยgcc -c evenness-main.c -o evenness-main.o:
#include <stdio.h>

extern int f(int n);

int main (int argc, char **argv) {
    int i;

    int testcases[] = { 14, 20, 94208, 7, 0, -4 };

    for (i = 0; i < sizeof(testcases) / sizeof(testcases[0]); i++) {
        printf("%d, %d\n", testcases[i], f(testcases[i]));
    }

    return 0;
}

แล้ว:

  • Link: gcc evenness-main.o evenness.o -o evenness
  • วิ่ง: ./evenness

@FarazMasroor ขอรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการได้รับคำตอบนี้

ฉันคุ้นเคยกับมากกว่าความซับซ้อนของชุดประกอบ x86 ดังนั้นโดยทั่วไปฉันจะใช้คอมไพเลอร์เพื่อสร้างรหัสชุดประกอบสำหรับฉัน ฉันรู้จากประสบการณ์ว่าส่วนขยาย GCC เช่น__builtin_ffs(), __builtin_ctz()และ__builtin_popcount()มักจะรวบรวมและประกอบไป 1 หรือ 2 คำแนะนำเกี่ยวกับ x86 ดังนั้นฉันเริ่มจากฟังก์ชั่นเช่น:

int f(int n) {
    return __builtin_ctz(n);
}

แทนการใช้ GCC รวบรวมปกติทุกวิธีการรหัสวัตถุ, คุณสามารถใช้-Sตัวเลือกในการรวบรวมเพียงเพื่อประกอบ gcc -S -c evenness.c- สิ่งนี้จะให้ไฟล์ประกอบevenness.sดังต่อไปนี้:

    .file   "evenness.c"
    .text
    .globl  f
    .type   f, @function
f:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    %edi, -4(%rbp)
    movl    -4(%rbp), %eax
    rep bsfl    %eax, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   f, .-f
    .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
    .section    .note.GNU-stack,"",@progbits

สิ่งนี้สามารถเล่นกอล์ฟได้มาก โดยเฉพาะอย่างยิ่งเรารู้ว่าอนุสัญญาการเรียก สำหรับฟังก์ชั่นที่มีลายเซ็นดีและเรียบง่าย - พารามิเตอร์การป้อนข้อมูลจะถูกส่งผ่านในการลงทะเบียนและค่าตอบแทนจะถูกส่งกลับในการลงทะเบียน ดังนั้นเราจึงสามารถนำเอาคำแนะนำส่วนใหญ่ออกมาได้ส่วนมากจะเกี่ยวข้องกับการบันทึกการลงทะเบียนและการตั้งค่าสแต็กเฟรมใหม่ เราไม่ใช้สแต็คที่นี่และใช้รีจิสเตอร์เท่านั้นดังนั้นไม่จำเป็นต้องกังวลเกี่ยวกับรีจิสเตอร์อื่น ใบนี้ประกอบรหัส "golfed":int f(int n);EDIEAXEAX

    .globl  f
f:
    bsfl    %edi, %eax
    ret

หมายเหตุตามที่ @zwol ชี้ให้เห็นคุณยังสามารถใช้การรวบรวมที่ปรับให้เหมาะสมเพื่อให้ได้ผลลัพธ์ที่คล้ายกัน โดยเฉพาะอย่างยิ่ง-Osจะสร้างคำแนะนำข้างต้นอย่างแน่นอน (พร้อมกับคำสั่งแอสเซมเบลอร์เพิ่มเติมบางรายการที่ไม่สร้างโค้ดออบเจ็กต์เพิ่มเติม)

ตอนนี้ประกอบกับgcc -c evenness.s -o evenness.oซึ่งสามารถเชื่อมโยงกับโปรแกรมควบคุมการทดสอบตามที่อธิบายไว้ข้างต้น

มีหลายวิธีในการกำหนดรหัสเครื่องที่สอดคล้องกับชุดประกอบนี้ สิ่งที่ฉันชอบคือการใช้disassคำสั่งgdb disassembly:

$ gdb ./evenness
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
...
Reading symbols from ./evenness...(no debugging symbols found)...done.
(gdb) disass /r f
Dump of assembler code for function f:
   0x00000000004005ae <+0>: 0f bc c7    bsf    %edi,%eax
   0x00000000004005b1 <+3>: c3  retq   
   0x00000000004005b2 <+4>: 66 2e 0f 1f 84 00 00 00 00 00   nopw   %cs:0x0(%rax,%rax,1)
   0x00000000004005bc <+14>:    0f 1f 40 00 nopl   0x0(%rax)
End of assembler dump.
(gdb) 

ดังนั้นเราจะเห็นว่ารหัสเครื่องสำหรับbsfการเรียนการสอนเป็น0f bc c7และมีretc3


เราไม่นับนี่เป็น 2 หรือไม่?
lirtosiast

2
ฉันจะเรียนรู้รหัสภาษาของเครื่อง / ไบต์ได้อย่างไร ไม่พบข้อมูลออนไลน์
Faraz Masroor

1
สิ่งนี้ไม่เป็นไปตามข้อกำหนดการเรียก C บน x86-32 อาร์กิวเมนต์ถูกส่งผ่านบนสแต็ก บน x86-64 อาร์กิวเมนต์จะถูกส่งผ่านใน% rdi ดูเหมือนว่าจะทำงานภายในชุดควบคุมการทดสอบของคุณเท่านั้นเนื่องจากคอมไพเลอร์ของคุณมีการคัดลอกอาร์กิวเมนต์เก่าใน% eax มันจะพังถ้าคุณรวบรวมบังเหียนevenness-main.cด้วยการปรับตั้งค่าต่าง ๆ ให้เหมาะสม สำหรับฉันมันแบ่งกับ-O, หรือ-O2 -O3
Anders Kaseorg

1
@AndersKaseorg - ขอบคุณที่ชี้ให้เห็น ฉัน จำกัด มันไว้ที่ x86_64 แล้วดังนั้นอินพุตจะมาใน RDI
Digital Trauma

3
"นอกจากนี้แม้จะมีเอกสารอธิบายว่า [... ]" - ค่าใดก็ตามที่คุณได้รับจะต้องสอดคล้องกับเอกสาร ไม่ได้ตัดทอนโปรเซสเซอร์รุ่นอื่นที่ให้คุณค่าที่แตกต่างจากของคุณ
hvd

25

Python ขนาด 25 ไบต์

lambda n:len(bin(n&-n))-3

n & -n เลขศูนย์ใด ๆ ยกเว้นบิตนัยสำคัญน้อยที่สุดเช่นนี้

100010101010100000101010000
            v
000000000000000000000010000

เรามีความสนใจในจำนวนของเลขท้ายเพื่อให้เราแปลงเป็นสตริงไบนารีใช้ซึ่งจำนวนดังกล่าวข้างต้นจะเป็นbin "0b10000"เนื่องจากเราไม่สนใจ0bหรือ1เราลบ 3 จากความยาวสตริงนั้น


หลังจากโพสต์คำตอบของฉันฉันคิดว่าคุณฉลาดมากดังนั้นฉันจึงลองแปลงเป็น Pyth และดูว่าคุณสั้นกว่าของฉันหรือไม่ ให้ผลลัพธ์ l. & Q_Q โดยใช้ log2 แทน len (bin (_)) มันมีความยาวเท่ากับคำตอบ Pyth ของฉันและคำตอบของ Pyth อีกข้อหนึ่งดูเหมือนว่ามันจะไม่สั้นกว่า 6 ไบต์ใน
Pyth


15

JavaScript (ES6), 18 ไบต์

n=>Math.log2(n&-n)

4 31-Math.clz32ไบต์สั้นกว่า ฮะ


1
โอ้ว้าวและฉันเพิ่งได้เรียนรู้เกี่ยวกับMath.clz32เกินไป ...
นีล

1
ประณามฉันจะโพสต์สิ่งนี้อย่างแน่นอน! +1
Cyoce

13

JavaScript ES6, 22 19 ไบต์

f=x=>x%2?0:f(x/2)+1

ดูเหมือนว่าการเรียกซ้ำเป็นเส้นทางที่สั้นที่สุด


โอ้โห! คุณชนะฉัน! ทำได้ดีมาก :) +1
Connor Bell

6

Pyth, 8 ไบต์

lec.BQ\1
     Q    autoinitialized to eval(input())
   .B     convert to binary string
  c   \1  split on "1", returning an array of runs of 0s
 e        get the last run of 0s, or empty string if number ends with 1
l         take the length

ตัวอย่างเช่นการเป็นตัวแทนไบนารีของ94208คือ:

10111000000000000

หลังจากแยก1และรับองค์ประกอบสุดท้ายของอาร์เรย์ผลลัพธ์จะกลายเป็น:

000000000000

นั่นคือ 12 ศูนย์ดังนั้นมันคือ "12-ly สม่ำเสมอ"

งานนี้เพราะx / 2เป็นหลักx >> 1ใช่หรือไม่เพราะเป็นที่ bitshift 1ขวาของ ดังนั้นตัวเลขจะหารด้วย 2 เมื่อ LSB เท่ากับ0(เช่นเดียวกับวิธีหารด้วยทศนิยม 10 เมื่อหลักสุดท้ายคือ0)




6

MATL , 5 ไบต์

Yf2=s

สิ่งนี้ใช้ได้กับจำนวนเต็มทั้งหมด

ลองออนไลน์!

Yf      % implicit input. Compute (repeated) prime factors. For negative input
        % it computes the prime factors of the absolute value, except that for
        % -1 it produces an empty array instead of a single 1
2=s     % count occurrences of "2" in the array of prime factors

"และตอนนี้สำหรับสิ่งที่แตกต่างอย่างสิ้นเชิง ... "
บีกเกอร์

6

C, 36 (28) ไบต์

int f(int n){return n&1?0:f(n/2)+1;}

(ไม่ได้ทดสอบอาร์กิวเมนต์ศูนย์เนื่องจากระบุอาร์กิวเมนต์ที่ไม่ใช่ศูนย์)

อัปเดต (ตอบกลับความคิดเห็น) : หากเราอนุญาตให้มีการประกาศฟังก์ชันสไตล์ K&R เราสามารถมีรุ่น 28 ไบต์ได้:

f(n){return n&1?0:f(n/2)+1;}

ในกรณีนี้เราพึ่งพาความจริงที่ว่าค่าเริ่มต้นของคอมไพเลอร์ทั้งสองnและประเภทของการกลับมาของการf intฟอร์มนี้สร้างคำเตือนด้วย C99 แม้ว่าและจะไม่คอมไพล์เป็นรหัส C ++ ที่ถูกต้อง


หากคุณเปลี่ยนint n-> nยังคงเป็นรหัส C ที่ถูกต้องและตัด 4 อักขระ
Josh

จุดดี. ฉันกำลังจะบอกว่าสิ่งนั้นทริกเกอร์อย่างน้อยก็มีคำเตือนด้วย C99 แต่จะละเว้นประเภทการส่งคืน และทั้งสองทริกเกอร์ข้อผิดพลาดใน C ++ ดังนั้นฉันจึงเปลี่ยนคำตอบของฉันอย่างเหมาะสม
Viktor Toth

5

Java 7, 39 หรืออาจจะ 44 ไบต์

int s(int a){return a%2!=0?0:s(a/2)+1;}

int s(int a){return a%2!=0|a==0?0:s(a/2)+1;}

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

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


4

JavaScript (ES6), 20 ไบต์ 19 ไบต์

f=x=>~x%2&&1+f(x/2)

นี่คือพอร์ตของโซลูชัน Haskell โดย @nimi ถึง JavaScript มันใช้คุณสมบัติ "ลัดวงจร" &&ซึ่งคืนด้านซ้ายถ้ามันเป็นเท็จ (ซึ่งในกรณีนี้คือ-0) หรือมิฉะนั้นจะส่งกลับทางด้านขวาของมัน ในการดำเนินการodd x = 0ดังนั้นเราจึงทำด้านซ้ายมือ1 - (x % 2)ซึ่งฟอง0ผ่านมิฉะนั้นเราจะ&& recurse1 + f(x / 2)

การโกนของ1 - (x % 2)as (~x) % 2is เกิดจาก @Neil ด้านล่างและมีคุณสมบัติแปลก ๆ ที่ทำให้ฟังก์ชั่นด้านบนปล่อย-0จำนวนคี่เล็ก ๆ ค่านี้เป็นลักษณะเฉพาะของการตัดสินใจของ JS ที่จำนวนเต็มเป็น IEEE754 เป็นสองเท่า ระบบนี้มีระบบแยกต่างหาก+0และ-0เป็นระบบที่พิเศษใน JavaScript เพื่อ===ให้กันและกัน ~ประกอบการคำนวณผกผันบิต 32 บิตลงนามจำนวนเต็มหมายเลขซึ่งสำหรับเลขคี่ขนาดเล็กจะมีจำนวนติดลบ ( Math.pow(2, 31) + 1ตัวอย่างเช่นสร้างจำนวนบวก0มากกว่า-0) ข้อ จำกัด ที่แปลกสำหรับจำนวนเต็มแบบ 32 บิตที่ลงนามแล้วนั้นไม่มีผลกระทบใด ๆ โดยเฉพาะอย่างยิ่งมันไม่ส่งผลกระทบต่อความถูกต้อง


~x&11-x%2เป็นไบต์สั้นกว่า
Neil

@ นีลเจ๋งมาก นั่นมีคุณสมบัติที่ค่อนข้างต่อต้านได้ง่าย แต่ฉันจะเอาไปใช้ต่อไป
CR Drost

4

Perl 6, 23 18 ไบต์

{+($_,*/2...^*%2)}

การใช้

> my &f = {+($_,*/2...^*%2)}
-> ;; $_? is raw { #`(Block|117104200) ... }
> f(14)
1
> f(20)
2
> f(94208)
12
> f(7)
0
> f(-4)
2

4

Ruby 24 ไบต์

การส่งรหัสกอล์ฟครั้งแรกของฉัน (yey!)

("%b"%$*[0])[/0*$/].size

ฉันมาที่นี่ได้อย่างไร :

ก่อนอื่นฉันต้องการรับโค้ดที่เติมเต็มสเป็คจริงเพื่อให้เข้าใจถึงปัญหาดังนั้นฉันจึงสร้างวิธีโดยไม่คำนึงถึงจำนวนไบต์:

def how_even(x, times=1)
  half = x / 2
  if half.even?
    how_even(half, times+1)
  else
    times
  end
end

ด้วยความรู้นี้ฉันยกเลิกการเรียกใช้ฟังก์ชั่นใหม่อีกครั้งในขณะที่ลูปและเพิ่ม$*(ARGV) เป็นอินพุตและ i เป็นการนับจำนวนกี่ครั้งที่จำนวนนั้นลดลงครึ่งหนึ่งก่อนที่มันจะแปลก

x=$*[0];i=1;while(x=x/2)%2<1;i+=1;end;i

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

ดังนั้นฉันจึงรวบรวมผลลัพธ์บางอย่างเกี่ยวกับค่าที่ป้อนเข้าเป็นแบบไบนารี่:

input      in binary      result
---------------------------------
   14               1110   1
   20              10100   2
94208  10111000000000000  12

ฉันสังเกตเห็นว่าผลลัพธ์คือจำนวนตำแหน่งทางด้านซ้ายที่เราต้องทำการสำรวจก่อนที่จำนวนจะเป็นเลขคี่

ทำการจัดการสตริงอย่างง่าย ๆ ฉันแบ่งสตริงในเหตุการณ์ล่าสุด 1 และนับความยาวของ 0s ที่เหลืออยู่:

("%b"%$*[0])[/0*$/].size

ใช้การ("%b" % x)จัดรูปแบบเพื่อเปลี่ยนตัวเลขเป็นไบนารีและString # sliceเพื่อแบ่งสตริงของฉัน

ฉันได้เรียนรู้เล็ก ๆ น้อย ๆ เกี่ยวกับทับทิมในภารกิจนี้และหวังว่าจะได้เล่นกอล์ฟมากขึ้นในไม่ช้า!


2
ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและการแลกเปลี่ยนรหัสกองกอล์ฟ นี่คือคำตอบที่ดี ฉันชอบคำอธิบายจริงๆ +1! หากคุณต้องการความท้าทายรหัสกอล์ฟเพิ่มเติมคลิกที่รหัสกอล์ฟแท็ก ฉันหวังว่าจะได้เห็นคำตอบของคุณมากขึ้น
wizzwizz4

1
อย่าลังเลที่จะถามคำถามเกี่ยวกับคุณ พิมพ์@wizzwizz4ที่จุดเริ่มต้นของความคิดเห็นเพื่อตอบกลับฉัน (ใช้ได้กับชื่อผู้ใช้ทั้งหมด!)
wizzwizz4


4

C, 37 ไบต์

f(int x){return x?x&1?0:1+f(x/2):0;} ตรวจสอบบิตสุดท้ายซ้ำจนกว่าจะไม่ใช่ 0


นอกจากนี้f(int n){return __builtin_ctz(n);}หากคุณยินดีที่จะใช้ส่วนขยาย gcc หรือแม้กระทั่ง#define f __builtin_ctz
บาดเจ็บทางดิจิทัล

int ลบ โดยปริยายเหมือนกับประเภทส่งคืน
luser droog

@luserdroog คุณหมายถึงf(n){...}อะไร GCC จะไม่รวบรวมมัน ฉันไม่ใช่ผู้เชี่ยวชาญของ C แต่การค้นหาอย่างรวดเร็วแสดงให้เห็นว่าคุณลักษณะนี้อาจถูกลบออกในเวอร์ชัน C ล่าสุดกว่าดังนั้นอาจจะรวบรวมด้วยธงที่เหมาะสมหรือไม่
Andy Soffer

@ AndySoffer ฉันเห็น บางที-ansiหรือ-gnu99? ฉันรู้ว่าฉันได้รับมันเพื่อทำงาน ฉันเขียนคำตอบเกี่ยวกับเคล็ดลับ!
luser droog

3

Haskell, 28 ไบต์

f x|odd x=0|1<2=1+f(div x 2)

ตัวอย่างการใช้งาน: ->f 9420812

หากตัวเลขเป็นเลขคี่ผลลัพธ์จะเป็น0อีกค่า1บวกกับการโทรซ้ำด้วยจำนวนครึ่งหนึ่ง


div x 2? ทำไมไม่x/2?
CalculatorFeline

@CatsAreFluffy: Haskell มีระบบการพิมพ์ที่เข้มงวดมาก divคือการหารจำนวนเต็มหารด้วย/จำนวนทศนิยม
nimi

3

Befunge, 20

&:2%#|_\1+\2/#
   @.<

การประมวลผลโค้ดจะย้ายไปทางขวาและล้อมรอบไปที่อักขระตัวที่สองของบรรทัดแรก (เนื่องจากการตามท้าย#) จนกระทั่ง2%เอาท์พุท1ซึ่งทำให้_สลับทิศทางไปทางซ้ายจากนั้น|ขึ้นไปซึ่งล้อมรอบไปยัง<แถวที่สอง ซึ่งเอาต์พุตและออก เราเพิ่มองค์ประกอบที่สองไปยังด้านบนสุดของสแต็กทุกครั้งที่ผ่านลูปแล้วหารด้านบนด้วย 2


3

จอประสาทตา29 17

+`\b(1+)\1$
;$1
;

ลองออนไลน์!

บันทึก 2 ไบต์ขอบคุณ Martin!

ใช้อินพุต unary นี่ตรงกับจำนวนที่มากที่สุดของ1มันซ้ำแล้วซ้ำอีกว่าจำนวนนั้น1ตรงกับส่วนที่เหลือของ1s ในจำนวน ทุกครั้งที่มันทำสิ่งนี้มันจะเป็นการเติม;ให้กับสตริง ในตอนท้ายเราจะนับจำนวน;s ในสตริง

หากคุณต้องการการป้อนทศนิยมให้เพิ่ม:

\d+
$0$*1

ไปที่จุดเริ่มต้นของโปรแกรม


3

Jolf, 6 ไบต์

ลองที่นี่!

Zlm)j2
Zl   2  count the number occurrences of 2 in
  m)j   the prime factorization of j (input)

ค่อนข้างง่าย ... รุ่งโรจน์ถึง ETHProductions สำหรับขับไล่ Jolf ไปกับเวอร์ชั่นที่ควรจะใช้!


1
6 ไบต์ดูเหมือนจะเป็นหมายเลขมายากลสำหรับความท้าทายนี้
Cyoce


3

ภาษาเครื่อง 6502, 7 ไบต์

ในการค้นหาค่าสถานที่ที่มีค่าน้อยที่สุด 1 บิตของค่าที่ไม่ใช่ศูนย์ในตัวสะสมให้คงผลลัพธ์ไว้ใน register X:

A2 FF E8 4A 90 FC 60

ในการรันโปรแกรมจำลอง 6502 บน e-tradition.netให้ใส่คำนำหน้าแล้วA9ตามด้วยเลขจำนวนเต็ม 8 บิต

Disassembles ต่อไปนี้:

count_trailing_zeroes:
    ldx #$FF
loop:
    inx
    lsr a     ; set carry to 0 iff A divisible by 2, then divide by 2 rounding down
    bcc loop  ; keep looping if A was divisible by 2
    rts       ; return with result in X

นี่เทียบเท่ากับ C ต่อไปนี้ยกเว้น C ต้องintมีอย่างน้อย 16 บิต:

unsigned int count_trailing_zeroes(int signed_a) {
    unsigned int carry;
    unsigned int a = signed_a;  // cast to unsigned makes shift well-defined
    unsigned int x = UINT_MAX;
    do {
        x += 1;
        carry = a & 1;
        a >>= 1;
    } while (carry == 0);
    return x;
}

การทำงานแบบเดียวกันบน 65816 สมมติว่า MX = 01 (ตัวสะสม 16 บิตดัชนี 8 บิต) และเทียบเท่ากับตัวอย่างข้อมูล C ข้างต้น


2

Brachylog , 27 15 ไบต์

$pA:2xlL,Al-L=.

คำอธิบาย

$pA             § Unify A with the list of prime factors of the input
   :2x          § Remove all occurences of 2 in A
      lL,       § L is the length of A minus all the 2s
         Al-L=. § Unify the output with the length of A minus L

2

CJam, 8 ไบต์

rizmf2e=

อ่านจำนวนเต็ม, ค่าสัมบูรณ์, แยกตัวประกอบเฉพาะ, นับสองครั้ง


2

JavaScript ES6, 36 38ไบต์

Golfed สองไบต์ด้วย @ETHproductions

คำตอบน่าเบื่อพอสมควร แต่ก็ทำงานได้ดี อาจคล้ายกับคำตอบอื่นมากเกินไปถ้าเขาเพิ่มการเปลี่ยนแปลงที่แนะนำแล้วฉันจะลบของฉันออก

b=>{for(c=0;b%2-1;c++)b/=2;alert(c)}

เพื่อให้ทำงานได้กำหนดให้กับตัวแปร ( a=>{for...) a(100)ในขณะที่มันเป็นฟังก์ชั่นที่ไม่ระบุชื่อแล้วเรียกมันด้วย


คำตอบที่ดี! b%2==0สามารถเปลี่ยนเป็นb%2-1และc++สามารถย้ายภายในส่วนสุดท้ายของforคำสั่ง ฉันคิดว่ามันจะใช้งานได้:b=>eval("for(c=0;b%2-1;b/=2)++c")
ETHproductions

@ ETHproductions ดังนั้นมันสามารถ! Nice catch :)
Connor Bell

หนึ่งไบต์เพิ่มเติม: b%2-1=> ~b&1นอกจากนี้ฉันคิดว่าสิ่งนี้ล้มเหลวในการป้อนข้อมูล0ซึ่งสามารถแก้ไขได้ด้วยb&&~b&1
ETHproductions

แช่แข็งคอมพิวเตอร์ของฉันทดสอบสิ่งนี้ด้วยจำนวนลบ b%2-1การตรวจสอบล้มเหลวสำหรับเลขคี่ที่ติดลบ
Patrick Roberts


2

DUP , 20 ไบต์

[$2/%0=[2/f;!1+.][0]?]f:

Try it here!

แปลงเป็นการเรียกซ้ำการส่งออกตอนนี้เป็นหมายเลขบนสุดของสแต็ก การใช้งาน:

94208[2/\0=[f;!1+][0]?]f:f;!

คำอธิบาย

[                ]f: {save lambda to f}
 2/\0=               {top of stack /2, check if remainder is 0}
      [     ][ ]?    {conditional}
       f;!1+         {if so, then do f(top of stack)+1}
              0      {otherwise, push 0}

2

Japt, 9 5 ไบต์

¢w b1

ทดสอบออนไลน์!

รุ่นก่อนหน้าควรมีขนาดห้าไบต์ แต่อันนี้ใช้งานได้จริง

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

       // Implicit: U = input integer
¢      // Take the binary representation of U.
w      // Reverse.
b1     // Find the first index of a "1" in this string.
       // Implicit output

2

C, 44 40 38 36 ไบต์

2 ไบต์ปิดขอบคุณ@JohnWHSmith 2 ไบต์ปิดขอบคุณ@luserdroog

a;f(n){for(;~n&1;n/=2)a++;return a;}

ทดสอบอาศัยอยู่บนideone


คุณอาจจะสามารถที่จะใช้เวลา 1 ไบต์ออกโดยการเปลี่ยนค่าใช้จ่ายที่มีความสุขเล็ก ๆ น้อย ๆ!(n%2) ~n&1
John WH Smith

@JohnWHSmith นั่นเป็นสิ่งที่ดี !! ขอขอบคุณ
ลบ

=0ลบ Globals ถูกเตรียมใช้งานโดยนัยถึง 0.
luser droog

@luserdroog ขอบคุณฉันไม่รู้เกี่ยวกับสิ่งนั้น
ลบ

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