Tìm kiếm cơ sở Repdigit


21

Một repdigit là một số tự nhiên mà có thể được viết hoàn toàn bằng cách lặp lại các chữ số giống nhau. Ví dụ, 777là một chữ số, vì nó chỉ bao gồm các chữ số được 7lặp lại ba lần.

Tuy nhiên, điều này không giới hạn ở các số thập phân (cơ sở 10) đơn giản:

  • Mỗi số Mersenne (có dạng M n = 2 n -1 ) là một chữ số khi được viết ở dạng nhị phân (cơ sở 2).
  • Mỗi số là một chữ số nhỏ khi được viết bằng unary (cơ sở 1).
  • Mỗi số ncũng có thể được viết một cách tầm thường dưới dạng chữ số gốc 11trong cơ sở n-1(ví dụ: 17khi được viết bằng hệ thập lục phân (cơ sở 16) 113khi được viết ở dạng nhị phân (cơ sở 2) cũng vậy 11).

Thách thức ở đây là tìm các cơ sở khác trong đó số đầu vào có thể là một số kỹ thuật số.

Đầu vào

Một số nguyên dương x > 3, trong bất kỳ định dạng thuận tiện.

Đầu ra

Một số nguyên dương bvới (x-1) > b > 1đại diện xtrong cơ sở blà một chữ số.

  • Nếu không có như vậy b, đầu ra 0hoặc một số giá trị falsey .
  • Nếu nhiều như vậy btồn tại, bạn có thể xuất bất kỳ hoặc tất cả chúng.

Quy tắc

  • Các (x-1) > b > 1hạn chế là để ngăn chặn sự chuyển đổi tầm thường để unary hoặc cơ chế "một trừ" cơ sở. Số đầu ra có thể được viết bằng unary hoặc bất kỳ cơ sở thuận tiện nào, nhưng bản thân cơ sở không được là một trong những chuyển đổi tầm thường.
  • Đầu vào / đầu ra có thể thông qua bất kỳ phương pháp phù hợp .
  • Hạn chế kẽ hở tiêu chuẩn áp dụng.

Ví dụ

In --> Out
11 --> 0            (or other falsey value)
23 --> 0            (or other falsey value)
55 --> 10           (since 55 is 55 in base 10)
90 --> 14           (since 90 is 66 in base 14 ... 17, 29, 44 also allowed)
91 --> 9            (since 91 is 111 in base 9 ... 12 also allowed)

Chúng ta có thể giả sử b ≤ 36(các chức năng chuyển đổi cơ sở tích hợp của nhiều ngôn ngữ không tăng cao hơn) không?
Doorknob

2
@Doorknob Giả sử hạn chế b ≤ 36 nghiêm trọng phạm vi của vấn đề này và tất cả các câu trả lời hiện có xử lý chính xác các cơ sở lớn hơn, vì vậy tôi sẽ nói không, bạn không thể giả sử giới hạn trên bvượt quá những gì được đưa ra.
admBorkBork

Hầu hết các số là chữ số trong một số cơ sở. Chẳng hạn, 91 = 13 * 7 nên 77 ở căn cứ 12.
Neil

@Neil ... Nó gần giống như bạn đang làm gì đó ở đó ...
admBorkBork

Câu trả lời:


11

Thạch, 11 9 byte

bRI¬P€TḊṖ

Trả về một danh sách các căn cứ, trống (giả) nếu không có. Hãy thử trực tuyến!

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

bRI¬P€TḊṖ  Main link. Argument: x (number)

 R         Range; yield [1, ..., x].
b          Base; convert x to base n, for each n in the range.
  I        Compute the increment (differences of successive values) of each array
           of base-n digits. This yields only 0's for a repdigit.
   ¬       Apply logical NOT to each increment.
    P€     Compute the product of all lists of increments.
      T    Get the indices of all truthy products.
       Ḋ   Discard the first index (1).
        Ṗ  Discard the last index (x - 1).

9

Bình thường 11 10

fqjQT)r2tQ

Rõ ràng là qkiểm tra đơn phương của Pyth cho một danh sách có tất cả các giá trị duy nhất vào khoảng 10 ngày trước. Rõ ràng điều tra lỗi Pyth cải thiện điểm số golf.

Lọc danh sách [2..input-1)trên nếu tập hợp các chữ số duy nhất của đầu vào trong cơ sở đó có độ dài 1.

Phòng thử nghiệm

Giải trình:

r2tQ     ##  generate the python range from 2 to the input (Q) - 1
         ##  python range meaning inclusive lower and exclusive upper bounds
f        ##  filter that list with lambda T:
  jQT    ##  convert the input to base T
 q    )  ##  true if the resulting list digits has all equal elements

5

Ruby, 87 69 63 byte

->x{(2..x-2).find{|b|y=x;a=y%b;a=0if a!=y%b while(y/=b)>0;a>0}}

Tôi đã phải thực hiện chuyển đổi cơ sở bằng tay, vì các nội dung của Ruby chỉ đi lên cơ sở 36 ...

Trả về nilcho không tìm thấy.

->x{      # anonymous lambda that takes one argument
(2..x-2)  # range of the possible bases to search over
.find{    # return the first element that satisfies the block, or nil if none
|b|       # b represents the base currently being tested
y=x;      # a temporary value to avoid mutating the original value of x
a=y%b;    # the first (well, last) digit in base b, which will be compared to

                   y/=b      # divide the number by the base
   if a!=y%b                 # if this digit does not match (is different)...
a=0                          # set a to a value representing "failure"
             while(    )>0;  # keep doing this until we get zero (no digits left)

a>0       # return whether a has maintained its original value (no digit change)
}}        # find then returns the first element for which this is true (or nil)

5

Python, 71 72 78 byte

lambda x:{b for b in range(2,x-1)for d in range(x)if x*~-b==x%b*~-b**d}

Không có đệ quy, chỉ cần thử tất cả các cơ sở và đưa ra một tập hợp các cơ sở hoạt động.

Thật hấp dẫn để mã hóa bdtrong một số duy nhất, nhưng phải mất quá nhiều biểu thức được ngoặc đơn để trích xuất chúng. 77 byte:

lambda x:{k/x for k in range(2*x,x*x-x))if x*~-(k/x)==x%(k/x)*~-(k/x)**(k%x)}

72 byte:

f=lambda x,b=2:b*any(x*~-b==x%b*~-b**d for d in range(x))or f(x,b+1)%~-x

Đầu ra đầu tiên bhoạt động, hoặc 0nếu không có.

Một đơn vị đại diện xcủa các dchữ số ctrong cơ sở bcó giá trị x==c*(b**d-1)/(b-1). Tương đương , x*(b-1)==c*(b**d-1).

Giá trị cphải là x%b, chữ số cuối cùng. Tôi không thấy một cách nào để xác định một cách hợp lý d, vì vậy mã sẽ thử tất cả các khả năng để xem liệu chúng có hoạt động không.

Đã lưu 5 byte bằng cách sao chép thủ thuật của Dennis để đưa ra một đầu ra falsey khi bđạt x-1được bằng cách lấy modulo đầu ra x-1. Một byte khác được lưu từ Dennis nhắc nhở tôi rằng lũy ​​thừa không thể giải thích được có mức độ ưu tiên cao hơn ~.

Một giải pháp có độ dài bằng nhau inthay vì any.

f=lambda x,b=2:b*(x*~-b in[x%b*~-b**d for d in range(x)])or f(x,b+1)%~-x

4

Ruby, 50 byte

->n{(2..n-2).find{|b,i=n|i%b==(i/=b)%b ?redo:i<1}}

Tôi thực sự muốn loại bỏ không gian phiền phức đó nhưng với tư cách là người mới chơi ruby, tôi vẫn còn khá lạ lẫm với những cú pháp cú pháp của nó.


Điều khó chịu trong trường hợp này là b?tên phương thức hợp lệ, vì vậy bạn không thể thoát khỏi không gian.
Jordan

4

Biểu tượng cảm xúc , 214 byte

(77 ký tự):

🐇🐹🍇🐇🐖🏁➡🚂🍇🍦b🍺🔲🗞🔷🔡😯🔤🔤🚂🍮i 2🍮n 0🔁◀i➖b 1🍇🍦v🔷🔡🚂b i🍊▶🐔🔫v🔪v 0 1📏v🍇🍮n i🍉🍫i🍉😀🔷🔡🚂n 9🍎0🍉🍉

In kết quả trong cơ sở 9.

Tôi đã có ý định chơi golf mã với biểu tượng cảm xúc trong vài tuần nay, nhưng ngôn ngữ gần đây đã trở nên đủ ổn định để thực sự hoạt động với. Như một phần thưởng, câu hỏi này sử dụng một phần của biểu tượng cảm xúc thực sự rất tốt: đại diện cho các số nguyên trong các cơ sở khác.

Ungolfed (là một nhận xét dòng trong biểu tượng cảm xúc)

🐇🐹🍇         👴 define main class "🐹"
  🐇🐖🏁➡🚂🍇  👴 define main method

    👴 read an integer from stdin, store it in frozen variable "b"
    🍦 b 🍺 🔲 🗞 🔷🔡😯🔤🔤 🚂

    🍮 i 2  👴 i = 2
    🍮 n 0  👴 n = 0

    🔁◀i➖b 1🍇     👴 while i < b - 1
      🍦 v 🔷🔡🚂b i  👴 v = the string representation of b in base i

      👴 Split v on every instance of the first character of v.
      👴 If the length of that list is greater than the actual length of v,
      👴 n = i
      🍊▶🐔🔫v🔪v 0 1📏v🍇
        🍮 n i
      🍉

      🍫 i  👴 increment i
    🍉
    😀 🔷🔡🚂 n 9  👴 represent n in base 9 instead of 10, to save a byte 😜
    🍎 0          👴 return error code 0
  🍉
🍉

4

Python 2, 79 byte

f=lambda x,b=2:~-b*x in[i%b*~-b**(i/b)for i in range(b*x)]and b or f(x,-~b)%~-x

Hãy thử nó trên Ideone .

Ý kiến

Mọi chữ số x của cơ sở b> 1 và chữ số d <b đều thỏa mãn các điều sau.

điều kiện

d <b , bản đồ (b, d) cb + d là tiêm.

Ngoài ra, vì b, x> 1 , chúng ta có c <x , do đó cb + d <cb + b = (c + 1) b ≤ xb .

Điều này có nghĩa là, để tìm các giá trị phù hợp cho cd cho một cơ sở b đã cho , chúng ta có thể lặp qua tất cả i trong [0, Lỗi, bx) và kiểm tra xem (b - 1) x == (i% b) (b i / b - 1) .

Thử nghiệm lambda f có tên là (b - 1) x có trong tập {(i% b) (b i / b - 1) | 0 i <bx} , bắt đầu bằng giá trị b = 2 .

  • Nếu thử nghiệm thành công, chúng tôi trở lại b .

  • Khác, chúng ta gọi lại f , với cùng xb tăng thêm 1 .

b cuối cùng có thể đạt x - 1 , nên chúng tôi lấy kết quả cuối cùng là modulo x - 1 để trả về 0 trong trường hợp này. Lưu ý rằng điều này sẽ không xảy ra nếu b = 2 thỏa mãn điều kiện, vì nó được trả về mà không cần đệ quy. Tuy nhiên, câu hỏi đảm bảo rằng b = 2 <x - 1 trong trường hợp này.


3

Perl 6, 45 43 42 byte

{grep 2..$^x-2: {[==] $x.polymod($_ xx*)}}

Giải thích (loại)

Để tham khảo, một biến $^xtrong { ... }giống như làm-> $x { ... }

{grep 2..$^x-2: {[==] $x.polymod($_ xx*)}}
{                                          # Anonymous function taking $x
 grep                                      # Return the all values in
      2..$^x-2: {                          # Range from 2 to $x - 2 satisfying:
                 [==]                      #     Reduce with ==:
                      $x.polymod(          #         (See below for polymod)
                                 $_ xx*    #         An infinite list containing
                                           #         the current value
                                       )}}

Polymod (TL; DR): $n.polymod($b xx *)cung cấp cho bạn danh sách các chữ số / 'chữ số' đảo ngược cho $ncơ sở$b

Polymod (Đối với thực tế): Phương thức polymod gần giống như một phiên bản mạnh hơn của divmodchức năng python . $n.polymod(*@args)chia $ n cho mỗi giá trị trong * @ args, thêm phần còn lại ( $n mod $x) vào danh sách mà nó trả về và sử dụng thương số cho phép chia tiếp theo. Tôi cảm thấy tôi đã giải thích nó kém nên đây là một số ví dụ (được viết bằng perl 6, nhưng đủ sạch để được hiểu bởi hầu hết tôi hy vọng):

12.polymod(7)    # returns (5, 1)
# Roughly equivalent to:
(12 mod 7, 12 div 7)

86400.polymod(60,60,24) # returns (0, 0, 0, 1)
# Roughly equivalent to (this will give you an array rather than a list):
my $n = 86400;
my @remainders; # Here lies the end result
for (60, 60, 24) -> $divisor {
    @remainders.push( $n mod $divisor );
    $n div= $divisor;
}
@remainders.push($n)

# This is essentially the base conversion algorithm everyone
# knows and loves rolled into a method.
# Given an infinite list of divisors, polymod keeps going until
# the remainder given is 0.     
0xDEADBEEF.polymod(16 xx *) # returns (15 14 14 11 13 10 14 13)
# Roughly equivalent to (but gives an array rather than a list):
my $n = 0xDEADBEEF;
my @remainders; # Here lies the end result
while $n > 0 {
    @remainders.push( $n mod 16 );
    $n div= 16;
}

1
Trên thực tế vì bạn được phép xuất " bất kỳ hoặc tất cả " các giá trị hợp lệ, bạn có thể sử dụng grepphương thức thay vì firstphương thức.
Brad Gilbert b2gills 17/03/2016

Ôi thật tuyệt, tôi đã bỏ lỡ điều đó
Hotkeys

3

APL Dyalog , 28 byte

 {b/⍨⍵{1=≢∪⍵⊥⍣¯1⊢⍺}¨b←1+⍳⍵-3}

{... ... }chức năng ẩn danh được áp dụng cho x(đại diện bởi )
b←1+⍳⍵-3các số nguyên từ 2 - ⍵-2 được lưu trữ như b
⍵{... cho mỗi phần tử trong b ( ), áp dụng các chức năng {... }với x là đối số trái
⍵⊥⍣¯1⊢⍺convert x để cơ sở đó
1=≢∪là 1 tương đương với kiểm đếm chữ số duy nhất?
b/⍨các phần tử của b trong đó đúng (chỉ có một chữ số duy nhất).

Ví dụ trường hợp

Nếu không có cơ sở tồn tại, đầu ra trống (đó là falsey), như chương trình này có thể chứng minh:

 WhatIsEmpty
 →''/TRUE ⍝ goto (→) TRUE: if (/) emptystring ('')
 'False'
 →END       
TRUE:       
 'True'     
END:        

Điều này in 'Sai'



2

MATL , 15 14 byte

3-:Q"G@:YAd~?@

Điều này hoạt động với phiên bản hiện tại (14.0.0) của ngôn ngữ / trình biên dịch.

Nếu không có cơ sở tồn tại, đầu ra trống rỗng (đó là falsey).

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

3-:Q    % take input x implicitly. Generate range of possible bases: [2,3,...,x-2]
"       % for each base b
  G     %   push input again
  @:    %   generate vector of (1-based) digits in base b: [1,2,...,b]
  YA    %   convert to that base
  d~    %   differences between consecutive digits; negate
  ?     %   if all values are true (that is, if all digits were equal)
    @   %     push that base
        %   end if implicitly
        % end for each implicitly
        % display implicitly

2

Toán học, 55 byte

Cases[4~Range~#-2,a_/;Equal@@#~IntegerDigits~a]/.{}->0&

Chức năng ẩn danh, không quá phức tạp. Chỉ cần lọc ra các cơ sở dựa trên repdigit-ness.


2

Python 2, 75 byte

n=input()
b=1
while b<n-2:
 i=n;b+=1
 while i%b==i/b%b:i/=b
 if i<b:print b

Một cổng của câu trả lời ruby ​​của tôi. In tất cả các cơ sở hợp lệ nếu có.


2

Julia, 45 byte

n->filter(b->endof(∪(digits(n,b)))<2,2:n-2)

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một mảng số nguyên. Để gọi nó, gán nó cho một biến. Nó sẽ trả về tất cả các cơ sở áp dụng hoặc một mảng trống. Không có vấn đề với các cơ sở lớn.

Đầu tiên chúng ta tạo phạm vi bao gồm [2, n - 2], trong đó n là đầu vào. Chúng tôi sau đó filterdanh sách chỉ các số nguyên bn trong cơ sở b có ít hơn 2 chữ số duy nhất. Để làm điều này, với mỗi số nguyên b trong phạm vi, chúng ta lấy các chữ số của n trong cơ sở b dưới dạng một mảng bằng cách sử dụng digits, lấy các mục duy nhất bằng cách sử dụng và lấy chỉ mục của phần tử cuối cùng (tức là độ dài) bằng cách sử dụng endof.


1

Brachylog , 12 byte

>>.ℕ₂≜&ḃ↙.=∧

Hãy thử trực tuyến! (như một máy phát điện!)

Đưa đầu vào thông qua biến đầu vào và xuất ra một cơ sở thông qua biến đầu ra trong trường hợp điều này là có thể, nếu không thì sẽ thất bại. Đồng thời, nó cũng hoạt động như một trình tạo ra một danh sách tất cả các cơ sở, trong đó danh sách đó có thể trống.

Lý tưởng nhất là nó có thể trông giống như ḃ↙.=&>>, có thể hy sinh chức năng của trình tạo ở dạng đó hoặc tương tự (vì cuối cùng nó sẽ không đồng nhất), nhưng đến bây giờ 12 byte là ngắn nhất tôi biết cách lấy nó.

     ≜          Assign an integer value to
  .             the output variable
   ℕ₂           which is greater than or equal to 2
 >              and less than a number
>               which is less than the input.
      &         The input
       ḃ↙.      in base-(the output)
          =     is a repdigit.
           ∧    (which is not necessarily the output)


0

05AB1E , 7 byte

ÍL¦ʒвÙg

Xuất ra tất cả các giá trị có thể, hoặc một danh sách trống dưới dạng giá trị falsey (mặc dù các đầu ra hợp lệ về mặt kỹ thuật cũng là falsey, vì chỉ 1 thật trong 05AB1E, và mọi thứ khác đều là falsey).

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Í        # Decrease the (implicit) input-integer by 2
 L       # Create a list in the range [1, input-2]
  ¦      # Remove the first value to make the range [2, input-2]
   ʒ     # Filter this list by:
    в    #  Convert the (implicit) input to the base of the number we're filtering
     Ù   #  Uniquify it, leaving only distinct digits
      g  #  Get the length of this, which is truthy (1) if all digits were the same
         # (and then output the filtered list implicitly as result)

0

Perl 5 -Minteger -na , 63 byte

map{$r=$,=($c="@F")%$_;$r*=$c%$_==$,while$c/=$_;$r&&say}2..$_-2

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

Đưa ra tất cả các câu trả lời có thể hoặc không có gì nếu không có giải pháp tồn tại.

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.