แก้ไขการค้นหาฐานอีกครั้ง


21

repdigitเป็นจำนวนธรรมชาติที่สามารถเขียนได้ แต่เพียงผู้เดียวโดยการทำซ้ำเหมือนกันหลัก ตัวอย่างเช่น777เป็น repdigit เนื่องจากมันประกอบด้วยตัวเลขหลัก7ซ้ำสามครั้งเท่านั้น

สิ่งนี้ไม่ จำกัด เพียงแค่เลขฐานสิบ (ฐาน 10) แต่:

  • หมายเลข Mersenne ทุกตัว (ของแบบฟอร์มM n = 2 n -1 ) คือ repdigit เมื่อเขียนเป็นเลขฐานสอง (ฐาน 2)
  • ทุกหมายเลขนั้นมี repdigit เพียงเล็กน้อยเมื่อเขียนด้วยภาษาเดียว (ฐาน 1)
  • ทุกหมายเลขnสามารถเขียนเป็น repdigit 11ในฐานได้เล็กน้อยn-1(เช่น17เมื่อเขียนเป็นเลขฐานสิบหก (ฐาน 16)) 11และ3เมื่อเขียนด้วยเลขฐานสอง (ฐาน 2) ก็เป็นเช่น11กัน

ความท้าทายที่นี่คือการหาฐานอื่น ๆที่หมายเลขอินพุตอาจเป็น repdigit

อินพุต

จำนวนเต็มบวกx > 3ในรูปแบบที่สะดวก

เอาท์พุต

เป็นจำนวนเต็มบวกbกับ(x-1) > b > 1ที่ตัวแทนของxในฐานbเป็น repdigit

  • หากไม่มีbอยู่ให้เอาต์พุต0หรือมีความผิดพลาดบางอย่างค่า
  • หากbมีอยู่หลายรายการคุณสามารถส่งออกได้ทั้งหมดหรือทั้งหมด

กฎระเบียบ

  • (x-1) > b > 1ข้อ จำกัด คือการป้องกันไม่ให้มีการแปลงเล็กน้อยเพื่อเอกหรือ "ลบหนึ่ง" ฐาน การส่งออกจำนวนสามารถเขียนได้ในฐานเอกหรือสะดวกใด ๆ แต่ฐานตัวเองจะต้องไม่เป็นหนึ่งในการแปลงจิ๊บจ๊อย
  • อินพุต / เอาต์พุตสามารถผ่านใด ๆวิธีการที่เหมาะสม
  • มีข้อ จำกัดช่องโหว่มาตรฐาน

ตัวอย่าง

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)

เราสามารถสมมติb ≤ 36(ฟังก์ชั่นการแปลงฐานในตัวหลายภาษาไม่สูงขึ้นไปได้หรือไม่)
Doorknob

2
@Doorknob สมมติว่าจำกัด ขอบเขตของปัญหานี้b ≤ 36 อย่างรุนแรงและคำตอบที่มีอยู่ทั้งหมดจัดการกับฐานที่มีขนาดใหญ่ขึ้นอย่างถูกต้องดังนั้นฉันจะบอกว่าไม่คุณไม่สามารถคาดเดาขอบเขตที่สูงbกว่าที่กำหนดไว้
AdmBorkBork

ตัวเลขส่วนใหญ่เป็น repdigits ในบางฐาน ตัวอย่างเช่น 91 = 13 * 7 ดังนั้นจึงเป็น 77 ในฐาน 12
Neil

@Neil ... มันเกือบจะเหมือนกับว่าคุณกำลังทำอะไรอยู่ที่นั่น ...
AdmBorkBork

คำตอบ:


11

เยลลี่, 11 9 ไบต์

bRI¬P€TḊṖ

ส่งคืนรายการฐานซึ่งว่างเปล่า (เป็นเท็จ) หากไม่มี ลองออนไลน์!

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

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

Pyth, 11 10

fqjQT)r2tQ

เห็นได้ชัดว่า Pyth's unary qจะตรวจสอบรายการที่มีค่าไม่ซ้ำกันทั้งหมดเมื่อประมาณ 10 วันที่ผ่านมา เห็นได้ชัดว่าการตรวจสอบข้อบกพร่อง Pyth ช่วยเพิ่มคะแนนกอล์ฟ

กรองรายการ [2..input-1)บนหากชุดตัวเลขเฉพาะของอินพุตในฐานนั้นคือความยาว 1

ชุดทดสอบ

คำอธิบาย:

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 ไบต์

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

ฉันต้องใช้การแปลงฐานด้วยมือเนื่องจากตัวรูบินของรูบี้ขึ้นไปที่ฐาน 36 ...

ส่งคืนnilสำหรับไม่พบ

->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ไบต์

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

ไม่มีการเรียกซ้ำเพียงลองใช้ฐานทั้งหมดและแสดงชุดของฐานข้อมูลที่ใช้งานได้

มันดึงดูดการเข้ารหัสbและdในจำนวนเดียว แต่มันใช้นิพจน์ที่ใช้วงเล็บจำนวนมากเกินไปในการแยกมันออกมา 77 ไบต์:

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 ไบต์:

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

ส่งออกผลลัพธ์แรกbที่ใช้งานได้หรือ0หากไม่มี

ตัวแทนหน่วยxของdตัวเลขของcฐานมีค่าb x==c*(b**d-1)/(b-1)อย่างเท่าเทียมกัน, x*(b-1)==c*(b**d-1).

ค่าcต้องเป็นx%bตัวเลขหลักสุดท้าย ฉันไม่เห็นวิธีที่จะคิดdเลขคณิตดังนั้นรหัสพยายามเป็นไปได้ทั้งหมดเพื่อดูว่าพวกเขาทำงาน

ที่บันทึกไว้ 5 ไบต์โดยการคัดลอกเคล็ดลับเดนนิสของการให้ผลผลิต falsey เมื่อbต้นน้ำโดยการโมดูโลเอาท์พุทx-1 x-1ไบต์อื่นที่ถูกบันทึกจากเดนนิสเตือนฉันว่าการยกกำลังอย่างลึกลับมีความสำคัญมากกว่านั้น~ไบต์อีกบันทึกไว้จากเดนนิสเตือนผมว่าการยกกำลังลึกลับที่มีความสำคัญสูงกว่า

วิธีการแก้ปัญหาที่มีความยาวเท่ากันกับแทนinany

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 ไบต์

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

ฉันอยากจะลบพื้นที่ที่น่ารำคาญ แต่ในฐานะผู้มาใหม่ถึงทับทิมฉันยังคงไม่คุ้นเคยกับนิสัยใจคอของมัน


การเล่นโวหารที่ผิดในกรณีนี้คือb?ชื่อวิธีการที่ถูกต้องดังนั้นคุณจึงไม่สามารถกำจัดพื้นที่ได้
Jordan

4

Emojicodeขนาด 214 ไบต์

(77 ตัวอักษร):

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

พิมพ์ผลลัพธ์ในฐาน 9

ฉันตั้งใจจะทำโค้ดกอล์ฟด้วยอิโมจิโคเดะเมื่อสองสามสัปดาห์ก่อน แต่เมื่อไม่นานมานี้ภาษาก็มีความเสถียรพอที่จะใช้งานได้จริง เป็นโบนัสคำถามนี้ทำให้การใช้ฟังก์ชัน emojicode หนึ่งชิ้นนั้นดีจริง ๆ ที่: คิดเป็นจำนวนเต็มในฐานอื่น ๆ

Ungolfed (👴เป็นความคิดเห็นบรรทัดใน emojicode)

🐇🐹🍇         👴 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 ไบต์

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

ลองบนIdeone

ความคิด

Repdigit xใด ๆของฐานb> 1และตัวเลขd <bเป็นไปตามเงื่อนไขต่อไปนี้

condition

ตั้งแต่d <bแผนที่(b, d) ↦ cb + dเป็นแบบฉีด

นอกจากนี้ตั้งแต่B, x> 1เรามีค <xดังนั้นCB + D <CB + B = (C + 1) ข≤ XB

ซึ่งหมายความว่าจะหาค่าที่เหมาะสมสำหรับCและDสำหรับให้ฐานเราสามารถย้ำผ่านทุกฉันใน[0, ... , BX)และตรวจสอบว่า(ข - 1) x == (i% ข) (ขฉัน / b - 1)

รหัส

แลมบ์ดาชื่อfทดสอบว่า(b - 1) xอยู่ในชุด{(i% b) (b i / b - 1) | 0 ≤ฉัน <BX}เริ่มต้นด้วยค่าข = 2

  • ถ้าการทดสอบประสบความสำเร็จเรากลับข

  • อื่นที่เราเรียกfอีกครั้งแบบเดียวกับที่xและเพิ่มขึ้นทีละ1

เนื่องจากbอาจถึงx - 1ในที่สุดเราจึงใช้ผลลัพธ์สุดท้ายโมดูโลx - 1เพื่อส่งกลับ0ในกรณีนี้ โปรดทราบว่าสิ่งนี้จะไม่เกิดขึ้นหากb = 2เป็นไปตามเงื่อนไขเนื่องจากจะถูกส่งคืนโดยไม่เรียกใช้ซ้ำ อย่างไรก็ตามคำถามรับประกันได้ว่าb = 2 <x - 1ในกรณีนี้


3

Perl 6, 45 43 42 ไบต์

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

อธิบาย (เรียงลำดับ)

สำหรับการอ้างอิงตัวแปร$^xใน{ ... }นั้นเหมือนกับการทำ-> $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 *)ให้รายการกลับของตัวเลข / 'หลัก' สำหรับ$nในฐาน$b

Polymod (ของจริง): วิธี polymod นั้นเกือบจะเหมือนdivmodฟังก์ชันpython รุ่นที่ทรงพลังกว่า $n.polymod(*@args)หาร $ n โดยแต่ละค่าใน * @ args เพิ่มส่วนที่เหลือ ( $n mod $x) ลงในรายการที่ส่งคืนและใช้ผลหารสำหรับการหารถัดไป ฉันรู้สึกว่าฉันอธิบายได้ไม่ดีดังนั้นนี่เป็นตัวอย่าง (เขียนใน Perl 6 แต่สะอาดพอที่ฉันหวังว่าจะเข้าใจได้มากที่สุด):

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
ที่จริงแล้วเนื่องจากคุณได้รับอนุญาตให้ส่งออกค่าที่ถูกต้อง" ใด ๆ หรือทั้งหมด " คุณสามารถใช้grepวิธีการแทนfirstวิธีการ
แบรดกิลเบิร์ต b2gills

โอ้จับได้ดีฉันพลาดไป
ฮ็อตคีย์

3

Dyalog APLขนาด 28 ไบต์

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

{... ... }ฟังก์ชั่นที่ไม่ระบุชื่อที่จะถูกนำไปใช้x(แสดง)
b←1+⍳⍵-3จำนวนเต็มจาก 2 - ⍵-2 เก็บไว้เป็นb
⍵{... สำหรับองค์ประกอบในข (แต่ละ) ใช้ฟังก์ชั่น{... }กับ x เป็นอาร์กิวเมนต์ซ้าย
⍵⊥⍣¯1⊢⍺แปลง x ไปยังฐานที่
1=≢∪ 1 เท่ากับนับ ของตัวเลขที่ไม่ซ้ำกัน?
b/⍨องค์ประกอบของ b ที่เป็นจริง (ว่ามีเพียงหนึ่งหลักที่ไม่ซ้ำกัน)

ตัวอย่างกรณี

หากไม่มีฐานอยู่เอาต์พุตจะว่างเปล่า (ซึ่งเป็นเท็จ) ดังที่โปรแกรมนี้แสดงให้เห็น:

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

พิมพ์นี้ 'เท็จ'


2

Pyth, 26 19 ไบต์

hMfql{eT1m,djQdr2tQ

ลองที่นี่!

จะเพิ่มคำอธิบายหลังจากที่ฉันเล่นกอล์ฟนี้ ดูคำตอบนี้สำหรับการใช้งานและคำอธิบายที่สั้นลง


1
ขอบคุณที่เตือนฉันว่าฉันลืมฐานเพิ่มเติม90และ91ในตัวอย่างของฉัน!
AdmBorkBork

2

MATL , 15 14 ไบต์

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

ใช้ได้กับภาษา / คอมไพเลอร์รุ่นปัจจุบัน (14.0.0)

หากไม่มีฐานอยู่เอาต์พุตจะว่างเปล่า (ซึ่งเป็นเท็จ)

ลองออนไลน์!

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

Mathematica, 55 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อไม่ซับซ้อนเกินไป เพียงกรองฐานตาม repdigit-ness


2

Python 2, 75 ไบต์

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

พอร์ตของคำตอบทับทิมของฉัน พิมพ์ฐานที่ถูกต้องทั้งหมดถ้ามีอยู่


2

จูเลีย 45 ไบต์

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

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่รับจำนวนเต็มและส่งกลับอาร์เรย์จำนวนเต็ม หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร มันจะส่งกลับฐานที่ใช้งานได้ทั้งหมดหรืออาร์เรย์ที่ว่างเปล่า ไม่มีปัญหากับฐานขนาดใหญ่

ก่อนอื่นเราสร้างช่วงรวม [2, n - 2] โดยที่nคืออินพุต จากนั้นเราจะfilterแสดงรายการเฉพาะจำนวนเต็มbซึ่งnในฐานbมีตัวเลขที่ไม่ซ้ำกันน้อยกว่า 2 หลัก การทำเช่นนี้สำหรับแต่ละจำนวนเต็มอยู่ในช่วงที่เราได้รับตัวเลขของnในฐานเป็นอาร์เรย์ใช้digitsรับรายการที่ไม่ซ้ำใช้และได้รับดัชนีขององค์ประกอบสุดท้าย (เช่นความยาว) endofโดยใช้


1

Brachylogขนาด 12 ไบต์

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

ลองออนไลน์! (เป็นเครื่องกำเนิดไฟฟ้า!)

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

เป็นการดีที่นี่อาจมีลักษณะคล้ายḃ↙.=&>>กันอาจเสียสละการทำงานของเครื่องกำเนิดไฟฟ้าในรูปแบบนั้นหรือคล้ายกัน (เพราะในที่สุดมันจะตีเอกภาพ) แต่ ณ ตอนนี้ 12 ไบต์นั้นสั้นที่สุดที่ฉันรู้ว่าจะรับได้อย่างไร

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

1

ทับทิม , 46 43 ไบต์

ใช้ตัวเลขจำนวนเต็มฟังก์ชันนำมาใช้ใน Ruby 2.4 เพื่อหลีกเลี่ยงการหารด้วยตนเอง

-3 ไบต์ขอบคุณ @Jordan

->n{(2..n-2).find{|i|!n.digits(i).uniq[1]}}

ลองออนไลน์!


@Jordan ah ใช่ฉันลืมเคล็ดลับ haha
Value Ink

0

05AB1E , 7ไบต์

ÍL¦ʒвÙg

ส่งออกค่าที่เป็นไปได้ทั้งหมดหรือรายการที่ว่างเปล่าเป็นค่า falsey (แม้ว่าผลลัพธ์ทางเทคนิคที่ถูกต้องจะเป็นเท็จเช่นกันเนื่องจากมีเพียงความ1จริงใน 05AB1E และทุกอย่างอื่นเป็นเท็จ)

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Í        # 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)

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