Tất cả về nhị phân cơ bản


29

Xin thứ lỗi cho tiêu đề.

Đây là một câu hỏi được lấy cảm hứng từ A Curious Property của 82000 . Trong đó, tác giả chỉ ra rằng số 82000 là nhị phân ở cơ sở 2, 3, 4 và 5. Bài đăng sau đó đặt ra câu hỏi "có một số nào là nhị phân trong các cơ sở 2, 3, 4, 5 và 6 không "? (Đối với những người tò mò, tôi đã kiểm tra các giá trị lên tới 10 ^ 1.000.000 và cho đến nay câu trả lời là không.)

Điều này khiến tôi suy nghĩ: đưa ra một con số, nó cơ sở nhị phân nào?

Con số tò mò của chúng tôi, 82000, thực sự là nhị phân trong sáu cơ sở:

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

Không phải tất cả các số sẽ có cơ sở nhị phân là tuần tự. Hãy xem xét số 83521. Đây là số nhị phân trong các cơ sở 2, 17, 289, 83520 và 83521.

Thách thức của bạn là xác định và hiển thị cơ sở nào một số là nhị phân.

Quy tắc

  • Một số được coi là "nhị phân" trong một cơ sở nhất định nếu đại diện của nó trong cơ sở đó chỉ bao gồm các số 0 và số. 110110là một giá trị nhị phân, trong khi 12345không, A380Fchắc chắn là không.
  • Số của bạn sẽ được cung cấp trên đầu vào tiêu chuẩn. Nó sẽ là một giá trị số nguyên nằm trong khoảng từ 2 đến 2 ^ 32-1 và sẽ được cung cấp ở định dạng cơ sở 10.
  • Theo thứ tự tăng dần, hiển thị mỗi cơ sở lớn hơn một cơ sở mà số đó là nhị phân. Mỗi cơ sở nên nằm trên một dòng riêng. Nếu bạn bao gồm giá trị nhị phân trong cơ sở đó (xem phần thưởng cho điểm bên dưới), hãy tách cơ sở và giá trị nhị phân bằng một khoảng trắng. Chỉ đầu ra cho tiêu chuẩn ra sẽ được đánh giá, lỗi tiêu chuẩn và các nguồn khác sẽ bị bỏ qua.

Chấm điểm

Điểm của bạn là kích thước chương trình của bạn tính bằng byte. Điểm càng thấp càng tốt.

Phần thưởng :
Nếu chương trình của bạn cũng xuất ra các giá trị nhị phân trong các cơ sở được tìm thấy, hãy nhân số điểm của bạn với 0,75
Giá trị nhị phân được hiển thị của bạn sẽ không có dấu câu phụ, không có số 0 bên ngoài, không có dấu thập phân, chỉ có số 0 và số không.

Ví dụ

Đầu vào:

82000

Đầu ra (nhận tiền thưởng):

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

Đầu vào:

1234321

Đầu ra (không có tiền thưởng):

2
1111
1234320
1234321

Đầu vào có thể kết thúc với một dòng mới?
LegionMammal978

@ LegionMammal978 - Uhhh ... chắc chắn? Mục đích của tôi là bạn sẽ có thể có được số đầu vào với một số đơn giản, đường đọc hoặc một cái gì đó tương tự.
Ông Llama

1
Nói chung, nluôn luôn là ít nhất nhị phân trong các căn cứ 1(không được tính), 2, n-1, và n.
mbomb007

1
Khi bạn nói, "số của bạn sẽ được cung cấp trên đầu vào tiêu chuẩn", bạn có nghĩa là chỉ STDIN hay chúng ta có thể chấp nhận thay thế số đó làm đối số chức năng như là tiêu chuẩn cho trang web không?
Alex A.

Biểu diễn nhị phân (trong phần thưởng) có định dạng nhất định không? Đặc biệt sẽ [1, 0, 1, 1, 0]ổn, hoặc các số phải được tham gia như thế 10110nào?
Jakube

Câu trả lời:


14

Bình thường, 14 13

jbf!-jQTU2tSQ

Cảm ơn Jakube đã chỉ ra Schức năng mới .

Hãy thử nó ở đây.

Phiên bản trực tuyến quá chậm để làm 1234321. Điều này chỉ đơn giản là chuyển đổi đầu vào thành từng cơ sở từ 2 thành chính nó và loại bỏ các kết quả có chứa các giá trị khác 0 và 1.

Giải trình:

                           : 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)

Ngoài ra, đây là phiên bản ( không được đánh golf tốt, được chơi tốt, một lần nữa nhờ phiên bản thưởng của Jakube) (20 * .75 = 15):

VQI!-JjQK+2NU2pdKjkJ

Hãy thử nó ở đây


Pyth vừa được cập nhật. Vì vậy, bạn có thể liên kết với các giải pháp thực tế.
Jakube

Và đây là giải pháp 20 * 0,75 = 15: VQI!-JjQK+2NU2pdKjkJĐôi khi lập trình chức năng không phải là cách tiếp cận tốt nhất.
Jakube

10

Julia, 72 70 byte

Nó thực sự dài hơn với tiền thưởng, vì vậy không có tiền thưởng ở đây.

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

Điều này đọc một dòng từ STDIN, chuyển đổi nó thành một số nguyên và in kết quả. Mặc dù là một phương pháp vũ phu, đầu vào 1234321 chỉ mất chưa đến 1 giây đối với tôi.

Ungolfed + giải thích:

# 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

Ví dụ:

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

LƯU Ý : Nếu đầu vào có thể được lấy làm đối số chức năng thay vì từ STDIN (đang chờ xác nhận từ OP), thì giải pháp là 55 byte.



7

Toán học, 59 byte

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

Ugh ... IntegerDigitsD:

Thực sự không có nhiều điều để giải thích về mã ... 12 byte bị lãng phí bởi yêu cầu sử dụng STDIN và STDOUT.

Tôi không nghĩ rằng tôi có thể yêu cầu tiền thưởng. Cái tốt nhất tôi có là 84 byte (mang lại số điểm trên 60):

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

7

Con trăn 2, 88 86 80

Khá đơn giản, không có tiền thưởng. Python là tốt đẹp và khoan dung với các biến toàn cầu.

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

Tốt nhất tôi đã quản lý để nhận được tiền thưởng là 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)

Giải pháp tốt đẹp, đánh bại tôi với nó với mã ngắn hơn nhiều.
Kade

Nó sẽ ngắn hơn để chỉ làm g(N)thay vì n=N.
frageum

@feersum Oh yeah (trước đây là g(N,b)dấu phẩy làm cho hai số bằng nhau), nhưng ý bạn là gì tôi sẽ không cần một biến cho N?
KSab

@KSab Tôi đã xóa phần thứ hai đó; đừng bận tâm đến nó
frageum

Tôi có thể sai nhưng bạn không thể nhận được tiền thưởng bằng cách thay đổi g(n/b)thành (g(n/b)+'n%b')nơi 'đại diện cho một backtick?
frageum

4

Con trăn 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

Cách tiếp cận lặp lại khá đơn giản.

Không có phần thưởng, đây là 73 byte:

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)

Vì SQL được biết đến là tuyệt vời ở những thử thách kiểu này, tôi nghĩ rằng tôi nên kết hợp chúng lại với nhau :) Phần thưởng thực sự đáng giá cho thử thách này.
Nó phải tuân theo thông số kỹ thuật, nhưng tôi không có cách nào dễ dàng để kiểm tra BẢN SAO TÔI TỪ STDIN .
Chỉnh sửa thứ tự cố định. Thay đổi cách xử lý cột R để sử dụng một mảng.

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

Như một bài kiểm tra tôi chỉ sử dụng chèn thẳng vào Ibảng. Chạy thử mở rộng và nhận xét.

-- 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


Thật gần! Các cơ sở đầu ra cần phải theo thứ tự tăng dần. +1 để sử dụng một ngôn ngữ độc đáo mặc dù.
Ông Llama

@ Mr.Llama đã sửa nó bằng một order by. Bây giờ để xem liệu tôi có thể lấy lại những nhân vật đó không
MickyT

3

Haskell 109 * 0,75 = 81,75 byte

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

Ví dụ sử dụng (lưu ý: giá trị nhị phân là lsb trước):

p 82000

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

Không có giới hạn đầu vào / đầu ra, tức là đầu vào qua đối số chức năng, đầu ra ở định dạng gốc qua REPL):

Haskell, 67 * 0,75 = 50,25 byte

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

Trả về một danh sách các cặp (cơ sở, giá trị). Các giá trị là lsb trước, ví dụ (dòng mới / khoảng trắng được thêm vào để hiển thị tốt hơn):

 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

Có lẽ rất nhiều phòng để cải thiện điều này vào lúc này

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')

Chạy với cảnh báo

> 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. Cảnh báo gây ra bằng cách ép buộc I%/%bmột logic trong any()mệnh đề. `
MickyT

2

Java, 181 155,25 (207 * .75) 151,5 (202 * .75) byte

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);}}}

Mở rộng với lời giải thích:

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.
        }
    }
}

Bản gốc (không có tiền thưởng):

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 byte nhờ 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")

Sử dụng:

> 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

Cốt lõi của hàm là !sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n}), với mỗi cơ sở x từ 2 đến n, giữ nguyên thương số n / x miễn là phần còn lại là 0 và 1. Sau đó, nó sẽ đưa ra kết quả (là 0 nếu tất cả phần còn lại là 1 hoặc 0) và phủ định nó (0 phủ định thành TRUE, mọi thứ khác phủ định thành FALSE). Nhờ phạm vi chức năng, không cần tạo biến giả cho n. Vectơ kết quả của booleans sau đó được sử dụng để lập chỉ mục 2:nvà do đó chỉ xuất ra các cơ sở mà nó hoạt động.


1

TI-Basic, 45 byte

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

Giải trình

  • Đầu vào N
  • Với mọi B từ 2 đến N
    • Nếu N chỉ là 0 và 1 trong cơ sở B
      • Hiển thị B
  • Kết thúc vòng lặp

Phần phức tạp

Dòng thứ hai hoạt động như sau:

  • Với mọi X từ 0 đến log B N
  • B × fPart (iPart (N / B X ) / B) là chữ số thứ N trong cơ sở B, đếm ngược
  • Hãy coi đây là một danh sách
  • Đối với mỗi phần tử, nếu chữ số nhỏ hơn 2, mang lại 1 (đúng), khác 0 (sai)
  • Lấy sản phẩm: 1 iff tất cả các yếu tố là 1

chú thích

Chương trình chạy nhanh hơn đáng kể nếu dấu ngoặc đơn đóng )được đặt ở cuối dòng thứ hai. Xem ở đây để biết thêm về điều này.


1

TI-CƠ BẢN, 31 29

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

Điều này có lẽ là tối ưu cho TI-BASIC.

Giải trình:

randIntNoRep(1,32)trả về một hoán vị ngẫu nhiên của các số từ 1 đến 32 (Tất cả những gì chúng ta cần là những số đó theo thứ tự; TI-BASIC không có bất cứ thứ gì như lệnh iota của APL). 32 phần tử là đủ vì cơ sở nhỏ nhất có thể là 2 và số lớn nhất là 2 ^ 32-1. B^randIntNoRep(1,31)tăng danh sách đó lên sức mạnh Bth, dẫn đến danh sách chứa tất cả B^1,B^2,...,B^32(theo một số thứ tự).

Sau đó, đầu vào (trong Ansbiến wer, là đầu vào trong biểu mẫu [number]:[program name]) được chia cho số đó. Nếu đầu vào của bạn là 42 và cơ sở là 2, kết quả sẽ là danh sách 21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2], một lần nữa theo thứ tự.

Lấy phần phân số và nhân số với cơ sở của bạn sẽ cho chữ số ở vị trí đó trong biểu diễn cơ sở b. Nếu tất cả các chữ số nhỏ hơn 2, thì chữ số lớn nhất sẽ nhỏ hơn 2.

Như Ypnypn đã nêu, dấu ngoặc đơn đóng trên For câu lệnh sẽ tăng tốc độ này do lỗi trình phân tích cú pháp.

31-> 31: Đã lưu một byte nhưng đã sửa lỗi làm tròn đã thêm byte một lần nữa.

31-> 29: Đã lưu hai byte bằng cách sử dụng RandIntNoRep()thay vì cumSum(binomcdf()).


TI-BASIC có chức năng tuần tự không?
Ông Llama

Vâng, lệnh là seq(expression, variable, start, end[, step]). Nếu không có bước nào được đưa ra, nó mặc định là 1. Tuy nhiên, cumSum(binomcdf(31,0là 8 byte trong khi đó seq(X,X,1,32là 9 byte.
lirtosiast

Ah, điều đó giải thích nó. Tôi không quen với việc ghi điểm trong TI-Basic.
Ông Llama

1

Thạch , 9 byte

³bṀỊµÐfḊY

Hãy thử trực tuyến!

Thực hiện cùng với caird coinheringaahing trong trò chuyện .

Làm thế nào nó hoạt động

Chương trình đầy đủ.

     Đf Lọc phạm vi được tạo ngầm [1, đầu vào].
    Tổ hợp bắt đầu một chuỗi đơn nguyên mới.
³b Chuyển đổi đầu vào thành cơ sở của số hiện tại, dưới dạng danh sách.
  Tối đa.
   Ị không đáng kể. Kiểm tra nếu abs (Z) 1.
       Dequeue; Xóa phần tử đầu tiên của danh sách (để thả cơ sở 1).
        Y Tham gia theo dòng mới.

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}

Phiên bản trước:

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}

Kiểm tra:

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

Ở đây bạn không có đầu vào và không có đầu ra.
edc65

0

JavaScript ( ES6 ) 65

68 byte cho một chức năng với đầu ra tham số và bàn điều khiển.

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

65 byte với I / O qua cửa sổ bật lên

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

Yêu cầu tiền thưởng: 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

Toán học, 76 * 0,75 = 57

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

Ban đầu quên mất các yêu cầu đầu vào ... May mắn thay, những điều đó đã không thêm quá nhiều.



0

Perl 5 , 63 byte

map{$t=$n;1while($f=$t%$_<2)&&($t=int$t/$_);say if$f}2..($n=<>)

Hãy thử trực tuyến!

Không có phần thưởng cho điều này vì nó đạt điểm cao hơn một chút so với phiên bản của tôi với phần thưởng:

Perl 5 , 85 byte * 0,75 = 63,75

map{my$r;$t=$n;$r=$/.$r while($/=$t%$_)<2&&($t=int$t/$_);say"$_ 1$r"if$/<2}2..($n=<>)

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.