ทุกอย่างเกี่ยวกับไบนารีพื้นฐาน


29

กรุณาแก้ตัวชื่อบทลงโทษ

นี่คือคำถามที่เป็นแรงบันดาลใจอยากรู้อยากเห็นของทรัพย์สิน 82000 ในนั้นผู้เขียนชี้ให้เห็นว่าจำนวน 82000 เป็นเลขฐานสองในฐาน 2, 3, 4 และ 5 โพสต์แล้วโพสต์คำถาม "มีจำนวนที่เป็นเลขฐานสองในฐาน 2, 3, 4, 5 และ 6 "? (สำหรับคนที่อยากรู้อยากเห็นฉันได้ตรวจสอบค่ามากถึง 10 ^ 1,000,000 และคำตอบก็คือไม่)

สิ่งนี้ทำให้ฉันคิดว่า: รับจำนวนฐานมันคืออะไรในฐาน?

จำนวนที่น่าสงสัย 82000 ของเราเป็นเลขฐานสองในหกฐาน:

Base 2 = 10100000001010000
Base 3 = 11011111001
Base 4 = 110001100
Base 5 = 10111000
Base 81999 = 11
Base 82000 = 10

ไม่ใช่ว่าทุกหมายเลขจะมีฐานไบนารีที่เรียงตามลำดับ ลองพิจารณาตัวเลข 83521 มันเป็นเลขฐานสองในฐาน 2, 17, 289, 83520 และ 83521

ความท้าทายของคุณคือการกำหนดและแสดงว่าฐานใดเป็นเลขฐานสอง

กฎระเบียบ

  • จำนวนถือว่าเป็น "เลขฐานสอง" ในฐานที่กำหนดหากการเป็นตัวแทนในฐานนั้นประกอบด้วยศูนย์และคนเท่านั้น 110110เป็นค่าไบนารีในขณะที่12345ไม่ใช่ไม่ใช่A380Fแน่นอน
  • หมายเลขของคุณจะถูกระบุในอินพุตมาตรฐาน มันจะเป็นค่าจำนวนเต็มระหว่าง 2 ถึง 2 ^ 32-1 แบบรวมและจะมีให้ในรูปแบบฐาน -10
  • ในการเรียงลำดับจากน้อยไปมากแสดงแต่ละฐานมากกว่าหนึ่งที่เป็นเลขฐานสองแต่ละฐานควรอยู่ในบรรทัดของตัวเอง หากคุณรวมค่าเลขฐานสองในฐานนั้น (ดูคะแนนโบนัสด้านล่าง) ให้แยกฐานและค่าเลขฐานสองด้วยช่องว่าง จะตัดสินเฉพาะเอาต์พุตไปยังเอาต์พุตมาตรฐานข้อผิดพลาดมาตรฐานและแหล่งอื่น ๆ จะถูกละเว้น

เกณฑ์การให้คะแนน

คะแนนของคุณคือขนาดของโปรแกรมเป็นไบต์ ยิ่งคะแนนต่ำเท่าไหร่ก็ยิ่งดีเท่านั้น

โบนัส :
หากโปรแกรมของคุณส่งออกค่าไบนารีในฐานที่พบให้คูณคะแนนของคุณด้วย 0.75
ค่าเลขฐานสองที่แสดงของคุณควรไม่มีเครื่องหมายวรรคตอนพิเศษ

ตัวอย่าง

การป้อนข้อมูล:

82000

เอาท์พุท (รับโบนัส):

2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10

การป้อนข้อมูล:

1234321

ผลผลิต (ไม่มีโบนัส):

2
1111
1234320
1234321

อินพุตจะจบด้วยการขึ้นบรรทัดใหม่ได้หรือไม่
LegionMammal978

@ LegionMammal978 - เอ่อ ... แน่ใจเหรอ? ความตั้งใจของฉันคือการที่คุณควรจะได้รับหมายเลขอินพุตด้วย fgets ง่ายๆ readline หรือสิ่งที่คล้ายกัน
Mr. Llama

1
โดยทั่วไปnอยู่เสมออย่างน้อยไบนารีในฐาน1(ไม่นับ) 2, และn-1 n
mbomb007

1
เมื่อคุณพูดว่า "หมายเลขของคุณจะได้รับการป้อนเข้ามาตรฐาน" คุณหมายถึง STDIN เท่านั้นหรือเราจะรับหมายเลขเป็นอาร์กิวเมนต์ของฟังก์ชันหรือเป็นมาตรฐานสำหรับไซต์ได้หรือไม่
Alex A.

ควรเป็นตัวแทนไบนารี (ในส่วนโบนัส) ควรมีรูปแบบที่แน่นอน? โดยเฉพาะอย่างยิ่งจะ[1, 0, 1, 1, 0]โอเคหรือจะต้องมีหมายเลขเข้าร่วมเช่น10110?
Jakube

คำตอบ:


14

Pyth, 14 13

jbf!-jQTU2tSQ

ขอบคุณที่ Jakube ชี้ให้เห็นถึงSฟังก์ชั่นใหม่

ลองที่นี่

1234321รุ่นออนไลน์ช้าเกินไปที่จะทำ สิ่งนี้จะแปลงอินพุตไปยังแต่ละฐานจาก 2 ถึงตัวมันเองและทิ้งผลลัพธ์ที่มีค่าอื่นที่ไม่ใช่ 0 และ 1

คำอธิบาย:

                           : Q=eval(input) (implicit)
jb                         : join on newlines the list...
  f!                       : filter away nonempty values (impliticly named T)
    -jQTU2                 : sewtise difference of number converted to base and range(2)
     jQT                   : convert Q to base T
        U2                 : range(2)
          tSQ              : over the range [2 Q+1)

นอกจากนี้นี่คือ ( ไม่เล่นกอล์ฟได้ดีตอนนี้เล่นกอล์ฟได้ดีขอบคุณ Jakube อีกครั้ง) เวอร์ชั่นโบนัส (20 * .75 = 15):

VQI!-JjQK+2NU2pdKjkJ

ลองที่นี่


Pyth เพิ่งได้รับการอัปเดต ดังนั้นคุณสามารถเชื่อมโยงไปยังโซลูชันที่เกิดขึ้นจริง
Jakube

และนี่คือวิธีแก้ปัญหา 20 * 0.75 = 15: VQI!-JjQK+2NU2pdKjkJบางครั้งการเขียนโปรแกรมที่ใช้งานได้ไม่ใช่วิธีที่ดีที่สุด
Jakube

10

จูเลีย72 72ไบต์

จริง ๆ แล้วมันมีโบนัสนานกว่าดังนั้นจึงไม่มีโบนัสที่นี่

n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end

สิ่งนี้อ่านบรรทัดจาก STDIN แปลงเป็นจำนวนเต็มและพิมพ์ผลลัพธ์ แม้จะเป็นวิธีการที่โหดเหี้ยมอินพุต 1234321 ก็ใช้เวลาน้อยกว่า 1 วินาทีสำหรับฉัน

คำอธิบาย Ungolfed +:

# Read n from STDIN and convert to integer
n = int(readline())

# For every potential base from 2 to n
for j = 2:n
    # If all digits of n in base j are 0 or 1
    if all(i -> i0:1, digits(n, j))
        # Print the base on its own line
        println(j)
    end
end

ตัวอย่าง:

julia> n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end
1234321
2
1111
1234320
1234321

julia> n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end
82000
2
3
4
5
81999
82000

หมายเหตุ : หากอินพุตสามารถใช้เป็นอาร์กิวเมนต์ฟังก์ชันแทนจาก STDIN (กำลังรอการยืนยันจาก OP) วิธีการแก้ปัญหาคือ 55 ไบต์


7

CJam, 20 ไบต์ (หรือ 27 ไบต์ * 0.75 = 20.25)

นี่คือเวอร์ชั่นโบนัส 20 ไบต์:

ri:X,2f+{X\b2,-!},N*

ลองที่นี่

เพื่อความสนุกนี่คือโบนัสเวอร์ชั่น 27 ไบท์:

ri:X{X\)b2,-!},1>{)SX2$bN}/

ลองออนไลน์ได้ที่นี่


แน่ใจ เมื่อฉันเล่นกอล์ฟสักเล็กน้อย
เครื่องมือเพิ่มประสิทธิภาพ

1
ri_,f{2+S@2$bN}4/{2=2,-!},(19.5 ไบต์)
Dennis

7

Mathematica, 59 ไบต์

Print/@Select[1+Range[n=Input[]],Max@IntegerDigits[n,#]<2&]

อืม ... IntegerDigitsD:

มีไม่มากที่จะอธิบายเกี่ยวกับรหัส ... 12 ไบต์สูญเปล่าเนื่องจากข้อกำหนดในการใช้ STDIN และ STDOUT

ฉันไม่คิดว่าฉันสามารถรับโบนัสได้ สิ่งที่ดีที่สุดที่ฉันมีคือ 84 ไบต์ (ซึ่งให้คะแนนมากกว่า 60):

Print@@@Select[{b=#+1," ",##&@@n~IntegerDigits~b}&/@Range[n=Input[]],Max@##3<2&@@#&]

7

Python 2, 88 86 80

ค่อนข้างตรงไปตรงมาไม่มีโบนัส Python นั้นดีและผ่อนปรนกับตัวแปรโกลบอล

N=input();g=lambda n:n<1or(n%b<2)*g(n/b)
for b in range(2,N+1):
 if g(N):print b

ดีที่สุดที่ฉันจัดการเพื่อรับโบนัสคือ 118 * .75 = 87.75 :

N=input();g=lambda n:0**n*" "or" "*(n%b<2)and(g(n/b)+`n%b`)*(g(n/b)>'')
for b in range(2,N+1):
 if g(N):print`b`+g(N)

ทางออกที่ดีเอาชนะฉันไปกับมันด้วยรหัสที่สั้นกว่ามาก
Kade

มันจะสั้นลงเพียงแค่ทำแทนg(N) n=N
feersum

@feersum โอ้ใช่ (มันเคยเป็นg(N,b)เครื่องหมายจุลภาคที่ทำให้ทั้งสองเท่ากัน) แต่คุณหมายถึงสิ่งที่ฉันไม่ต้องการตัวแปรสำหรับ N?
KSab

@KSab ฉันลบส่วนที่สองนั้น ไม่เป็นไรหรอก
feersum

ฉันอาจจะผิด แต่คุณไม่สามารถรับโบนัสเพียงแค่เปลี่ยนg(n/b)เป็น(g(n/b)+'n%b')'แสดง backtick?
feersum

4

Python 2, 90 * 0.75 = 67.5

n=input();b=1
while b<n:
 b+=1;s="";c=k=n
 while k:s=`k%b`+s;c*=k%b<2;k/=b
 if c:print b,s

วิธีการทำซ้ำที่ค่อนข้างตรงไปตรงมา

หากไม่มีโบนัสนี่คือ 73 ไบต์:

n=input();b=1
while b<n:
 b+=1;c=k=n
 while k:c*=k%b<2;k/=b
 if c:print b

4

SQL (PostgreSQL), 247.5 255 230.25 (307 * .75)

เนื่องจาก SQL รู้ว่าเป็นสิ่งที่ยอดเยี่ยมสำหรับความท้าทายเหล่านี้ฉันจึงคิดว่าฉันควรจะรวมมันเข้าด้วยกัน :) โบนัสเป็นสิ่งที่คุ้มค่าสำหรับมัน
มันควรจะสอดคล้องกับข้อมูลจำเพาะ แต่ฉันไม่มีวิธีง่ายๆในการทดสอบCOPY I จาก STDIN
แก้ไขคำสั่งซื้อคงที่ เปลี่ยนวิธีจัดการคอลัมน์ R เพื่อใช้อาร์เรย์

CREATE TABLE IF NOT EXISTS I(I INT);TRUNCATE TABLE I;COPY I FROM STDIN;WITH RECURSIVE R AS(SELECT n,I/n I,ARRAY[I%n] R FROM generate_series(2,(SELECT I FROM I))g(n),(SELECT I FROM I)I(I)UNION ALL SELECT n,I/n,I%n||R FROM R WHERE I>0)SELECT n||' '||array_to_string(R,'')FROM R WHERE 2>ALL(R)and i=0ORDER BY n

ในการทดสอบฉันเพิ่งใช้เม็ดมีดตรงเข้าไปในIโต๊ะ ทดสอบการทำงานขยายและแสดงความคิดเห็น

-- Create the table to accept the input from the copy command
CREATE TABLE IF NOT EXISTS I(I INT);
-- Make sure that it is empty
TRUNCATE TABLE I;
-- Popoulate it with a value from STDIN
--COPY I FROM STDIN;
INSERT INTO I VALUES(82000); -- Testing
--Using a recursive CTE query
WITH RECURSIVE R AS (
    -- Recursive anchor
    SELECT n,                -- base for the row
       I/n I,                -- integer division
       ARRAY[I%n] R   -- put mod value in an array
    FROM generate_series(2,(SELECT I FROM I))g(n), -- series for the bases
         (SELECT I FROM I)I(I) -- Cross joined with I,  saves a few characters
    UNION ALL 
    -- for each row from r recursively repeat the division and mod until i is 0
    SELECT n,
        I/n,
        I%n||R -- Append mod to beginning of the array
    FROM R WHERE I>0
    )
-- return from r where i=0 and r has 1's and 0's only
SELECT n||' '||array_to_string(R,'')
FROM R 
WHERE 2 > ALL(R)and i=0
ORDER BY n -- Ensure correct order

2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10


เฉียดฉิว! ฐานเอาท์พุทจะต้องเรียงลำดับจากน้อยไปมาก +1 สำหรับการใช้ภาษาที่แปลกใหม่
Mr. Llama

@ Mr.Llama order byคงที่ด้วย ทีนี้เพื่อดูว่าฉันจะได้ตัวละครเหล่านั้นกลับมาหรือไม่
MickyT

3

Haskell 109 * 0.75 = 81.75 ไบต์

0#x=[]
n#x=n`mod`x:div n x#x 
f n=[show x++' ':(n#x>>=show)|x<-[2..n+1],all(<2)$n#x]
p=interact$unlines.f.read

ตัวอย่างการใช้งาน (หมายเหตุ: ค่าไบนารีคือ lsb ก่อน):

p 82000

2 00001010000000101
3 10011111011
4 001100011
5 00011101
81999 11
82000 01

ไม่มีข้อ จำกัด อินพุต / เอาต์พุตเช่นอินพุตผ่านอาร์กิวเมนต์ของฟังก์ชันเอาต์พุตในรูปแบบเนทิฟผ่าน REPL):

Haskell, 67 * 0.75 = 50.25 ไบต์

0#x=[]
n#x=n`mod`x:div n x#x
f n=[(x,n#x)|x<-[2..n+1],all(<2)$n#x]

ส่งคืนรายการคู่ (ฐานค่า) ค่าเป็น lsb ก่อนเช่น (เพิ่มบรรทัด / ช่องว่างเพื่อเพิ่มการแสดงผลที่ดีกว่า):

 f 82000
 [ (2,[0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1]),
   (3,[1,0,0,1,1,1,1,1,0,1,1]),
   (4,[0,0,1,1,0,0,0,1,1]),
   (5,[0,0,0,1,1,1,0,1]),
   (81999,[1,1]),
   (82000,[0,1]) ] 

2

R, 111

Probably a lot of room to improve this at the moment

i=scan();b=2:i;R=i%%b;I=rep(i,i-1);while(any(I<-I%/%b))R=cbind(I%%b,R);for(x in b)if(all(R[x-1,]<2))cat(x,'\n')

Runs with warnings

> i=scan();b=2:i;R=i%%b;I=rep(i,i-1);while(any(I<-I%/%b))R=cbind(I%%b,R);for(x in b)if(all(R[x-1,]<2))cat(x,'\n')
1: 82000
2: 
Read 1 item
There were 17 warnings (use warnings() to see them)
2 
3 
4 
5 
81999 
82000
>

@AlexA. Warnings caused by coercing the I%/%b to a logical in the any() clause. `
MickyT

2

Java, 181 155.25(207 * .75) 151.5(202 * .75) bytes

class I{public static void main(String[]a){a:for(long b=new java.util.Scanner(System.in).nextLong(),c,d=1;d++<b;){String e="";for(c=b;c>0;e=c%d+e,c/=d)if(c%d>1)continue a;System.out.println(d+" "+e);}}}

Expanded with explanation:

class I {
    public static void main(String[]a){
        a:for(long b=new java.util.Scanner(System.in).nextLong(),c,d=1; //b = input(), d = base
              d++<b;) {                                           //For all bases in range(2,b+1)
            String e="";
            for(c = b;c > 0; e = c % d + e,c /= d)                //Test all digits of base-d of b
                           //e = c % d + e                        //Append digits to string
                if (c % d > 1)                                    //Reject base if the digit is greater than 1
                    continue a;
            System.out.println(d+" "+e);                          //Print base and digits.
        }
    }
}

Original (without bonus):

class I{public static void main(String[]a){long b=new java.util.Scanner(System.in).nextLong(),c,d=1;a:for(;d++<b;){c=b;while(c>0){if(c%d>1)continue a;c/=d;}System.out.println(d);}}}

3.75 bytes thanks to Ypnypn :)


2

R, 94 83 79

n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")

Usage:

> n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")
1: 82000
2: 
Read 1 item
2
3
4
5
81999
82000
> n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")
1: 1234321
2: 
Read 1 item
2
1111
1234320
1234321

The core of the function is !sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n}) which, for each base x from 2 to n, keep the quotient n/x as long as the remainder is either 0 and 1. It then outputs the result (which is 0 if all remainders were either 1 or 0) and negates it (0 negates to TRUE, everything else negates to FALSE). Thanks to function scope, there is no need to make a dummy variable for n. The resulting vector of booleans is then used to index 2:n and therefore outputs only the bases for which it worked.


1

TI-Basic, 45 bytes

Input N
For(B,2,N
If prod(seq(BfPart(iPart(N/B^X)/B),X,0,log(N)/log(B))<2
Disp B
End

Explanation

  • Input N
  • For every B from 2 to N
    • If N is just 0 and 1 in base B
      • Display B
  • End loop

The complicated part

The second line works as follows:

  • For every X from 0 to logB N
  • B × fPart(iPart(N / BX) / B) is the Nth digit in base B, counting backwards
  • Consider this as a list
  • For each element, if the digit is less than 2, yield 1 (true), else 0 (false)
  • Take the product: 1 iff all elements are 1

Note

The program runs significantly faster if a closing parenthesis ) is placed at the end of the second line. See here for more about this.


1

TI-BASIC, 31 29

For(B,2,Ans
If 2>round(Bmax(fPart(Ans/B^randIntNoRep(1,32
Disp B
End

This is probably optimal for TI-BASIC.

Explanation:

randIntNoRep(1,32) returns a random permutation of the numbers from 1 to 32 (All we need is those numbers in some order; TI-BASIC doesn't have anything like APL's iota command). 32 elements is enough because the smallest possible base is 2 and the largest number is 2^32-1. B^randIntNoRep(1,31) raises that list to the Bth power, which results in the list containing all of B^1,B^2,...,B^32 (in some order).

Then the input (in the Answer variable, which is input to in the form [number]:[program name]) is divided by that number. If your input is 42 and the base is 2, the result will be the list 21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2], again in some order.

Taking the fractional part and multiplying the number by your base gives the digit at that position in the base-b representation. If all digits are less than 2, then the greatest digit will be less than 2.

As Ypnypn stated, a closing parenthesis on the For statement speeds this up due to a parser bug.

31->31: Saved a byte but fixed rounding errors which added the byte again.

31->29: Saved two bytes by using RandIntNoRep() instead of cumSum(binomcdf()).


Does TI-BASIC have a sequence function?
Mr. Llama

Yes, the command is seq(expression, variable, start, end[, step]). If no step is given, it defaults to 1. However, cumSum(binomcdf(31,0 is 8 bytes whereas seq(X,X,1,32 is 9 bytes.
lirtosiast

Ah, that explains it. I'm not familiar with scoring works in TI-Basic.
Mr. Llama

1

Jelly, 9 bytes

³bṀỊµÐfḊY

Try it online!

Done alongside caird coinheringaahing in chat.

How it works

³bṀỊµÐfḊY    Full program.

     Ðf      Filter the implicitly generated range [1, input].
    µ        Starts a new monadic chain.
³b           Convert the input to the base of the current number, as a list.
  Ṁ          Maximum.
   Ị         Insignificant. Checks if abs(Z) ≤ 1.
       Ḋ     Dequeue; Removes the first element of the list (to drop base 1).
        Y    Join by newlines.

0

Javascript, ES6, 118*.75 = 88.5 110*.75 = 82.5

f=x=>{res={};for(b=2;b<=x;++b)if(!+(res[b]=(c=x=>x%b<2?x?c(x/b|0)+""+x%b:"":"*")(x)))delete res[b];return res}

Previous version:

f=x=>{res={};for(q=2;q<=x;++q)if(!+(res[q]=(c=(x,b)=>x%b<2?x?c(x/b|0,b)+""+x%b:"":"*")(x,q)))delete res[q];return res}

Check:

f(82000)
Object { 2: "10100000001010000", 3: "11011111001", 4: "110001100", 5: "10111000", 81999: "11", 82000: "10" }

Here you have no input and no output.
edc65

0

JavaScript (ES6) 65

68 bytes for a function with a parameter and console output.

f=n=>{s=n=>n%b>1||b<n&&s(n/b|0);for(b=1;b++<n;)s(n)||console.log(b)}

65 bytes with I/O via popup

n=prompt(s=n=>n%b>1||b<n&&s(n/b|0));for(b=1;b++<n;)s(n)||alert(b)

Claiming the bonus: 88*0.75 => 66

n=prompt(s=n=>n%b>1?9:(b<=n?s(n/b|0):'')+n%b);for(b=1;b++<n;)s(n)<'9'&&alert(b+' '+s(n))

0

Mathematica, 76 * 0.75 = 57

n=Input[];G=#~IntegerDigits~b&;If[Max@G@n<2,Print[b," ",Row@G@n]]~Do~{b,2,n}

Initially forgot about the input requirements... Fortunately, those didn't add too much extra.



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