Cơ sở Zeroless nhỏ nhất


28

Cho một số nguyên dương n, xuất ra cơ sở nhỏ nhất b >= 2trong đó biểu diễn ntrong cơ sở bkhông có số 0 đứng đầu không chứa a 0. Bạn có thể cho rằng b <= 256cho tất cả các đầu vào.

Các trường hợp thử nghiệm

1 -> 2 (1)
2 -> 3 (2)
3 -> 2 (11)
4 -> 3 (11)
5 -> 3 (12)
6 -> 4 (12)
7 -> 2 (111)
10 -> 4 (22)
17 -> 3 (122)
20 -> 6 (32)
50 -> 3 (1212)
100 -> 6 (244)
777 -> 6 (3333)
999 -> 4 (33213)
1000 -> 6 (4344)
1179360 -> 23 ([12, 9, 21, 4, 4])
232792560 -> 23 ([15, 12, 2, 20, 3, 13, 1])
2329089562800 -> 31 ([20, 3, 18, 2, 24, 9, 20, 22, 2])
69720375229712477164533808935312303556800 -> 101 ([37, 17, 10, 60, 39, 32, 21, 87, 80, 71, 82, 14, 68, 99, 95, 4, 53, 44, 10, 72, 5])
8337245403447921335829504375888192675135162254454825924977726845769444687965016467695833282339504042669808000 -> 256 ([128, 153, 236, 224, 97, 21, 177, 119, 159, 45, 133, 161, 113, 172, 138, 130, 229, 183, 58, 35, 99, 184, 186, 197, 207, 20, 183, 191, 181, 250, 130, 153, 230, 61, 136, 142, 35, 54, 199, 213, 170, 214, 139, 202, 140, 3])

1
Các giá trị cho mười, mười một, vv trong các cơ sở cao hơn bạn đang sử dụng là gì? Chúng có chứa số không?
Stephen

19
@Stephen Các giá trị được chọn cho các chữ số ở trên 9không quan trọng, vì chúng không phải là 0.
Mego

9
Đây là OEIS A106370 .
Kỹ sư Toast

1
@Titus Đó là một điểm tốt. Tôi sẽ giới hạn cơ sở cho một cái gì đó hợp lý.
Mego

1
@Mego: Hãy thử 232792560. Đó là lcm của 2,3, ..., 20, vì vậy trong mọi cơ sở <= 20, nó có 0 là chữ số có nghĩa ít nhất.
Nate Eldredge

Câu trả lời:


15

Bình thường , 6 byte

f*FjQT

Xác nhận tất cả các trường hợp thử nghiệm.

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

f * FjQT ~ Chương trình đầy đủ.

f ~ Số nguyên dương đầu tiên trong đó điều kiện là trung thực.
   jQT ~ Đầu vào được chuyển đổi thành cơ sở của phần tử hiện tại.
 * F ~ Sản phẩm. Nếu danh sách chứa 0, thì nó là 0, nếu không thì nó hoàn toàn tích cực.
          0 -> Giả; > 0 -> Sự thật.
        ~ Kết quả đầu ra ngầm.

Mặc dù Pyth fhoạt động trên 1, 2, 3, 4, ...(bắt đầu từ 1), Pyth coi các số trong cơ sở 1 (đơn nguyên) là một nhóm các số không, vì vậy cơ sở 1 bị bỏ qua.


Rất lạm dụng thực tế là đại diện cơ sở 1 của Pyth là tất cả các số không.
Erik the Outgolfer

@EriktheOutgolfer Cảm ơn! Tôi sẽ thêm một lời giải thích liên quan đến điều đó.
Ông Xcoder

Pyth không phải là ngôn ngữ duy nhất có đại diện đơn nguyên sử dụng số 0 làm gợi ý chữ số : P
Mego

Bạn đã viết 0 -> Falsy; > 0 -> Truthy. Là cố ý đó 0là cả TruthyFalsytrong tình huống đó?
Brian J

@BrianJ Có một >dấu hiệu ở phía trước của thứ hai 0, có nghĩa là mọi thứ cao hơn 0 là sự thật.
Ông Xcoder

11

C,  52  50 byte

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}

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

C (gcc),  47  45 byte

i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}

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


Hai byte được lưu nhờ đề xuất của @ Nevay về câu trả lời của @Kevin Cruijssen!


2
Phiên bản sau chỉ hoạt động bởi sự may mắn ngẫu nhiên, ngay cả khi bạn nhấn mạnh vào một trình biên dịch cụ thể. Và, tất nhiên, không có phiên bản nào thực sự là C.
AnT

3
@AnT nó là C .. nó sẽ đưa ra rất nhiều cảnh báo nhưng nó sẽ được biên dịch. miễn là bạn tìm thấy một trình biên dịch hoạt động cho mã của mình, bạn sẽ ổn
Felipe Nardi Batista

1
@Blacksilver k%ilà một ternary-kiểm tra ở đây. Một biến thể dễ đọc hơn sẽ k=(k%i?k:n*++i);hoặc thậm chí rõ ràng hơn : if(k%i){k=k;}else{k=n*++i;}.
Kevin Cruijssen

1
Ngoài ra, bạn có thể chơi gôn cả 2 byte: i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;return i;}i,k;f(n){for(i=2,k=n;k;)k=k%i++?k/--i:n;n=i;}. Tất cả tín dụng được gửi tới @Nevay , người đã đăng đề xuất này trên câu trả lời Java 8 được chuyển của tôi .
Kevin Cruijssen

1
@Felipe Nardi Batista: Tôi nhận thức được thực tế rằng các quy tắc CodeGolf nói "miễn là nó biên dịch", v.v. Tuy nhiên, thực tế là nó "biên dịch" không bằng bất kỳ cách nào chứng minh rằng đó là C. Đây không phải là C. Các tuyên bố không tên giống như i, k;f(n)tồn tại trong các phiên bản cổ của C (K & R), mà chỉ trong thời đại khi returnyêu cầu dấu ngoặc tròn xung quanh nó. tranh luận. Nếu bạn muốn sử dụng K & R với i,k;, bạn cũng phải sử dụng return(i);. Ở trên có thể là gnuc, nhưng không phải C.
AnT

8

Haskell , 56 52 48 byte

b#n=n<1||mod n b>0&&b#div n b
f n=until(#n)(+1)2

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

Khá cơ bản nhưng không thể nghĩ ra bất kỳ cách hay nào để rút ngắn nó

EDIT: Cảm ơn Laikoni vì đã tiết kiệm cho tôi 4 byte! Không biết tại sao tôi không bao giờ nghĩ đến !!0. Tôi có lẽ nên thử loại bỏ những dấu ngoặc đơn đó nhưng tôi có những ký ức mơ hồ về một số lỗi kỳ lạ khi bạn cố gắng sử dụng ||&&cùng nhau. Có lẽ tôi đang nhầm lẫn nó với các nhà khai thác bình đẳng.

EDIT 2: Cảm ơn @Lynn đã cạo thêm 4 byte! Không biết làm thế nào tôi chưa bao giờ biết về untiltrước đây.


1
Bạn đánh tôi một phút với giải pháp gần như chính xác. :) !!0ngắn hơn headvà tôi nghĩ bạn có thể bỏ dấu ngoặc đơn vào #.
Laikoni

2
Việc đánh giá thấp hình sự until :: (a → Bool) → (a → a) → a → atiết kiệm bốn byte:f n=until(#n)(+1)2
Lynn


6

Husk , 7 byte

→V▼MBtN

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

Giải trình

→V▼MBtN
     tN    list of natural numbers starting from 2
   MB      convert the (implicit) input to each of those bases
 V▼        find the (1-based) index of the first result where the minimum digit is truthy
→          add 1 to this index




3

Husk , 9 byte

←foΠ`B⁰tN

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

Giải trình

            -- input N
        tN  -- tail of [1..] == [2..]
←f(    )    -- filter with the following:
    `B⁰     --   convert N to that base
   Π        --   product (0 if it contains 0)
←           -- only keep first element

3

Java 8, 61 56 54 byte

n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}

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

Giải trình:

n->{            // Method with integer as both parameter and return-type
  int b=2,      //  Base-integer, starting at 2
      t=n;      //  Temp-integer, copy of the input
  for(;t>0;)    //  Loop as long as `t` is not 0
    t=t%b++<1?  //   If `t` is divisible by the base `b`
                //   (and increase the base `b` by 1 afterwards with `b++`)
       n        //    Set `t` to the input `n`
      :         //   Else:
       t/--b;   //    Divide `t` by the `b-1`
                //    (by decreasing the base `b` by 1 first with `--b`)
                //  End of loop (implicit / single-line body)
  return b;     //  Return the resulting base
}               // End of method

Tôi có cảm giác điều này có thể được đánh gôn bằng cách sử dụng phương pháp số học. Nó thực sự có thể, với một cổng câu trả lời C của @Steadybox , và sau đó được chơi bằng 2 byte nhờ @Nevay .

Câu trả lời cũ ( 61 byte ):

n->{int b=1;for(;n.toString(n,++b).contains("0"););return b;}

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

Giải trình:

n->{         // Method with Integer as both parameter and return-type
  int b=1;   //  Base-integer, starting at 1
  for(;n.toString(n,++b).contains("0"););
             //  Loop as long as the input in base-`b` does contain a 0,
             //  after we've first increased `b` by 1 before every iteration with `++b`
  return b;  //  Return the resulting base
}            // End of method

2
54 byte:n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}
Nevay

2

Japt , 8 byte

@ìX e}a2

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

Giải trình

@    }a2

Trả về số đầu tiên ( X) để truyền hàm, bắt đầu từ2

ìX

Chuyển đổi số đầu vào thành một mảng các Xchữ số cơ bản .

e

Kiểm tra nếu tất cả các chữ số là trung thực.


Điều này có thất bại không nếu mảng chứa bất kỳ bội số 10nào?
Xù xì

@Shaggy Sự hiểu biết của tôi là, theo nhận xét của OP, rằng các chữ số cho các cơ sở trên 9 không được tính là không.
Justin Mariner

Ah, tôi thấy điều đó bây giờ. Có một vấn đề với giai đoạn thử thách, vì vậy (hoặc tôi quá mệt mỏi!).
Xù xì

2

JavaScript (ES6), 43 41 37 byte

n=>(g=x=>x?g(x%b++?x/--b|0:n):b)(b=1)

Các trường hợp thử nghiệm



2

Python 2 , 57 byte

n=m=input()
b=2
while m:c=m%b<1;b+=c;m=(m/b,n)[c]
print b

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

-1 cảm ơn Felipe Nardi Batista .
-2 cảm ơn Lynn (và bây giờ đây là bản sao của giải pháp của cô ấy: D)


59 byte bằng cách thay đổi a,b=a+c,dthànha+=c;b=d
Felipe Nardi Batista

Tôi nghĩ bạn có thể thay thế while m>1bằng while m(và sau đó chúng tôi bị ràng buộc!)
Lynn

@Lynn Đó là lý do tại sao tôi nhận xét về giải pháp của bạn, nó sẽ giống hệt như vậy sau đó.
Erik the Outgolfer


1
@Lynn Tôi đã biết: p nếu không tôi đã yêu cầu bạn xóa của bạn.
Erik the Outgolfer

2

APL (Dyalog) , 20 19 byte

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕

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

Như thường lệ, cảm ơn @ Adám đã giúp đỡ trong trò chuyện và nhận mã để làm việc trong TIO. Ngoài ra, tiết kiệm 1 byte.

Đây là tradfn ( trad itional f unctio n ) cơ thể. Để sử dụng nó, bạn cần gán cho nó một tên (nằm trong trường tiêu đề của TIO), đặt nó trong s (một trước tên và một trong trường chân trang của TIO), sau đó gọi nó bằng tên của nó. Vì nó sử dụng một quad ( ) để lấy đầu vào của người dùng, nên nó được gọi là f \n inputthay vì thông thườngf input

Làm sao?

1+⍣{~0∊⍺⊥⍣¯1n}≢n←⎕   Main function.
                  n←⎕  Assigns the input to the variable n
1+⍣{           }≢      Starting with 1, add 1 until the expression in braces is truthy
    ~0                returns falsy if 0 "is in"
                      convert
            n         the input
         ⍣¯1           to base
                      left argument (which starts at 1 and increments by 1)

Hàm sau đó trả về cơ sở kết quả.


1
Mẹo chơi gôn: vì n←⎕sẽ là một số đơn giản và bạn cần 1làm đối số ban đầu cho phần còn lại của mã, bạn chỉ có thể đếm số phần tử trong n(là 1), bằng cách thay thế 1⊣bằng . Hãy thử trực tuyến!
Adám


1

R , 79 71 66 63 65 byte

function(n){while(!{T=T+1;all(n%/%T^(0:floor(log(n,T)))%%T)})T
T}

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

Câu trả lời này dựa trên sự sắp xếp lại của Giuseppe trong một vòng lặp duy nhất.

Đã lưu 8 byte nhờ JDL và 6 byte nhờ Giuseppe.


1
Bạn có thể sub bcho T, bắt đầu được xác định là TRUE == 1, loại bỏ sự cần thiết cho b=1. Tương tự, bạn có thể Fđăng ký k( FFALSE)
JDL

Tôi thấy những gì bạn đã làm ở đó. Đó là một điều hữu ích để biết!
NofP

1
66 byte bằng cách sử dụng m%/%T(phân chia số nguyên) thay vì(m-m%%T)/T
Giuseppe

65 byte . nó hơi lộn xộn nhưng tôi nghi ngờ việc thoát khỏi các vòng lặp lồng nhau sẽ cứu được một cái gì đó ; Tôi chỉ nghĩ rằng nó sẽ nhiều hơn 1 byte :(
Giuseppe

1

MATL , 13 12 byte

`G@Q_YAA~}@Q

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

-1 byte nhờ Luis Mendo. Chương trình này không xử lý các testcase lớn hơn 2 ^ 53 ( flintmax, số nguyên liên tiếp tối đa có thể biểu thị bằng loại dấu phẩy động), vì kiểu dữ liệu mặc định nằm doubletrong MATL. Tuy nhiên, nó sẽ có thể tìm thấy bất kỳ cơ sở zeroless tùy ý dưới số đó.

`            % Do while
 G           %  Push input
  @ _        %  Outputs the iteration number, negate.
     YA      %  Convert input to base given by the iteration number, the negative number is to instruct MATL we want an arbitrary high base with a integer vector rather than the default character vector we know from hexadecimal
       A~    %  If they're not all ones, repeat
         }   % But if they are equal, we finally
          @  %  Push the last base
   Q       Q %  As base 1 makes no sense, to prevent MATL from errors we always increase the iteration number by one.

@LuisMendo Tôi thực sự nên bắt đầu đọc tài liệu tốt hơn. Cảm ơn.
Sanchise

Điều này dường như không hoạt động đối với các trường hợp thử nghiệm lớn hơn, nhưng tôi không biết đủ về MATL / Matlab để biết liệu điều đó có phải do giới hạn số nguyên hay không.
Mego

@Mego Tôi đã thử nghiệm phiên bản 13 byte của mình tương đương với phiên bản hiện tại lên tới 1e6, trên MATLAB R2017a. Thiết lập thử nghiệm nào dẫn đến các vấn đề cho bạn?
Chiếm

2 trường hợp kiểm tra cuối cùng gây ra lỗi.
Mego

@Mego Ah trước đây tôi không thấy những cái thử nghiệm đó. Điều này là do việc triển khai MATL YAbằng cách sử dụng nhân đôi trong nội bộ, do đó, nó chỉ có thể xử lý các đầu vào tối đa liên tiếp với số nguyên tối đa có thể biểu thị bằng một số kép (xem flintmax). Điều này có làm mất hiệu lực câu trả lời? Về nguyên tắc, thuật toán hoạt động cho cơ sở tùy ý, tôi đã làm việc rõ ràng xung quanh một lệnh khác chỉ thực hiện đến cơ sở 36.
Chiếm

0

PHP, 59 + 1 byte

sử dụng nội trang , tối đa cơ sở 36:

for($b=1;strpos(_.base_convert($argn,10,++$b),48););echo$b;

không có nội dung, 63 60 + 1 byte , bất kỳ cơ sở nào:

for($n=$b=1;$n&&++$b;)for($n=$argn;$n%$b;$n=$n/$b|0);echo$b;

Chạy như ống với -nRhoặc thử chúng trực tuyến .



0

J, 26 byte

]>:@]^:(0 e.]#.inv[)^:_ 2:

Rất muốn biết nếu điều này có thể được cải thiện.

Động từ chính là cụm từ dyadic:

>:@]^:(0 e.]#.inv[)^:_

được đưa ra đầu vào bên trái và hằng số 2 ở bên phải. Sau đó, cụm động từ chính đó sử dụng Do của J..Trong khi xây dựng, tăng đối số y bên phải miễn là 0 là một thành phần của e.đối số ban đầu trong cơ sở y.

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



0

Dải ngân hà , 38 byte

^^'%{255£2+>:>R&{~^?{_>:<;m_+¡}}^^^}

sử dụng: ./mw base.mwg -i 3


Giải trình

code                                 explanation                    stack layout

^^                                   clear the preinitialized stack []
  '                                  push the input                 [input]
   %{                              } for loop
     255£                             push next value from 0..254   [input, base-2]
         2+                           add 2 to the get the base     [input, base]
           >                          rotate stack right            [base, input]
            :                         duplicate ToS                 [base, input, input]
             >                        rotate stack right            [input, base, input]
              R                       push 1                        [input, base, input, 1]
               &{~             }      while ToS (=remainder) is true ...
                  ^                    pop ToS                      [input, base, number]
                   ?{         }        if ToS (=quotient) ...
                     _>:<;              modify stack                [input, base, number, base]
                           m            divmod                      [input, base, quotient, remainder]
                           _+¡         else: output ToS (0) + SoS and exit
                                ^^^   pop everything but the input.

Tôi chắc chắn rằng điều này có thể được rút ngắn bằng cách sử dụng vòng lặp while thay vì vòng lặp for, nhưng tôi không thể làm cho nó hoạt động được.



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.