Zeroless Base ที่เล็กที่สุด


28

ป.ร. ให้ไว้เป็นจำนวนเต็มบวกnออกฐานที่เล็กที่สุดb >= 2ที่ตัวแทนของnฐานที่ไม่มีเลขศูนย์ชั้นนำไม่ได้มีb 0คุณอาจสันนิษฐานว่าb <= 256สำหรับอินพุตทั้งหมด

กรณีทดสอบ

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
อะไรคือค่าของสิบ, สิบเอ็ดและอื่น ๆ ในฐานที่สูงกว่าที่คุณใช้? พวกเขามีศูนย์หรือไม่
สตีเฟ่น

19
@Stephen ค่าที่เลือกไว้สำหรับตัวเลขดังกล่าวข้างต้นไม่ได้เรื่องเพราะพวกเขาไม่ได้9 0
Mego

9
นี่คือ OEIS A106370
Engineer Toast

1
@Titus นั่นเป็นจุดที่ดี ฉันจะ จำกัด ฐานของบางสิ่งบางอย่างที่สมเหตุสมผล
Mego

1
@Mego: ลอง 232792560 มันคือ lcm ของ 2,3, ... , 20 ดังนั้นในทุก ๆ ฐาน <= 20 มันมี 0 เป็นเลขนัยสำคัญน้อยที่สุด
Nate Eldredge

คำตอบ:


15

Pyth , 6 ไบต์

f*FjQT

ตรวจสอบกรณีทดสอบทั้งหมด

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

f * FjQT ~ โปรแกรมเต็มรูปแบบ

f ~ จำนวนเต็มบวกแรกที่เงื่อนไขเป็นจริง
   jQT ~ อินพุตถูกแปลงเป็นฐานขององค์ประกอบปัจจุบัน
 * F ~ ผลิตภัณฑ์ หากรายการมี 0 แสดงว่าเป็น 0 มิฉะนั้นจะเป็นค่าบวก
          0 -> ผิดพลาด; > 0 -> ความจริง
        ~ เอาท์พุทผลลัพธ์โดยปริยาย

แม้ว่า Pyth's จะfทำงานบน1, 2, 3, 4, ...(เริ่มต้นที่ 1) แต่ Pyth จะใช้ตัวเลขในฐาน 1 (unary) เป็นจำนวนศูนย์ดังนั้นฐาน 1 จะถูกละเว้น


การดูถูกความจริงที่ว่าการเป็นตัวแทนของ Pyth นั้นเป็นศูนย์
Erik the Outgolfer

@EriktheOutgolfer ขอบคุณ! ฉันจะเพิ่มคำอธิบายเกี่ยวกับสิ่งนั้น
Mr. Xcoder

Pyth ไม่ใช่ภาษาเดียวที่มีค่าเป็นตัวแทนใช้เลขศูนย์เป็นตัวบอกใบ้ : P
Mego

0 -> Falsy; > 0 -> Truthyที่คุณเขียน เป็นความตั้งใจที่0มีทั้งTruthyและFalsyในสถานการณ์ที่?
Brian J

@BrianJ มี>เครื่องหมายหน้าสอง0ซึ่งหมายความว่าทุกอย่างที่สูงกว่า 0 เป็นความจริง
Mr. Xcoder

11

C,  52  50 ไบต์

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

ลองออนไลน์!

C (gcc),  47  45 ไบต์

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

ลองออนไลน์!


สองไบต์บันทึกขอบคุณคำแนะนำของ @ Nevay สำหรับคำตอบของ @Kevin Cruijssen!


2
รุ่นหลังใช้งานได้โดยโชคสุ่มเท่านั้นถึงแม้ว่าคุณจะยืนยันในคอมไพเลอร์ที่เฉพาะเจาะจง และแน่นอนว่าไม่มีทั้งรุ่นจริงๆ C.
AnT

3
@AnT มันเป็น C .. มันจะให้คำเตือนจำนวนมาก แต่มันจะรวบรวม ตราบใดที่คุณพบคอมไพเลอร์ที่เหมาะกับโค้ดของคุณคุณก็สบายดี
Felipe Nardi Batista

1
@ Blacksilver k%iเป็นการตรวจสอบแบบไตรภาคที่นี่ เป็นตัวแปรที่อ่านได้มากขึ้นจะเป็นหรือแม้กระทั่งได้ชัดเจนมากขึ้น:k=(k%i?k:n*++i); if(k%i){k=k;}else{k=n*++i;}
Kevin Cruijssen

1
นอกจากนี้คุณยังสามารถกอล์ฟทั้ง 2 ไบต์: และ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;}เครดิตทั้งหมดไปที่@Nevayซึ่งโพสต์คำแนะนำนี้ไว้บนJava 8 ที่ตอบแล้วที่ได้รับการตอบแล้ว
Kevin Cruijssen

1
@Felipe Nardi Batista: ฉันตระหนักถึงความจริงที่ว่ากฎ CodeGolf พูดว่า "ตราบใดที่มันรวบรวม" และอื่น ๆ อย่างไรก็ตามความจริงที่ว่า "คอมไพล์" ไม่ได้พิสูจน์ว่าเป็นซีนี่คือซีนี่ไม่ใช่ซีประกาศทั่วไปi, k;และf(n)มีอยู่ในรุ่นโบราณของ C (K&R) แต่ในยุคที่returnจำเป็นต้องใช้วงเล็บกลมรอบ ๆ ข้อโต้แย้ง. หากคุณต้องการใช้ K&R ด้วยi,k;คุณต้องใช้return(i);เช่นกัน ข้างต้นอาจเป็น gnuc แต่ไม่ใช่ C.
AnT

8

Haskell , 56 52 48 ไบต์

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

ลองออนไลน์!

ค่อนข้างธรรมดา แต่ไม่สามารถคิดวิธีที่ดีในการทำให้สั้นลง

แก้ไข: ขอบคุณ Laikoni ที่ช่วยฉัน 4 ไบต์! !!0ไม่ทราบว่าทำไมฉันไม่เคยคิดว่า ฉันอาจจะพยายามลบวงเล็บพวกนั้น แต่ฉันมีความทรงจำที่คลุมเครือของข้อผิดพลาดแปลก ๆ เมื่อคุณพยายามใช้||และ&&ร่วมกัน บางทีฉันอาจสับสนกับผู้ประกอบการที่เท่าเทียมกัน

แก้ไข 2: ขอบคุณ @Lynn สำหรับการโกนอีก 4 ไบต์! ไม่ทราบว่าฉันไม่เคยรู้untilมาก่อน


1
คุณเอาชนะฉันได้ภายในหนึ่งนาทีด้วยวิธีการแก้ปัญหาเดียวกันเกือบทั้งหมด :) !!0สั้นกว่าheadและฉันคิดว่าคุณสามารถใส่เครื่องหมายวงเล็บลงไป#ได้
Laikoni

2
under under อาชญากรuntil :: (a → Bool) → (a → a) → a → aบันทึกสี่ไบต์:f n=until(#n)(+1)2
ลินน์







3

Java 8, 61 56 54 ไบต์

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

ลองที่นี่

คำอธิบาย:

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

ฉันมีความรู้สึกว่าสามารถเล่นกอล์ฟได้โดยใช้วิธีการทางคณิตศาสตร์ แน่นอนมันสามารถมีพอร์ตของ @Steadybox' คำตอบ Cและจากนั้นแข็งแรงเล่นกอล์ฟ 2 ไบต์ขอบคุณที่@Nevay

เก่า (คำตอบ 61 ไบต์ ):

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

ลองที่นี่

คำอธิบาย:

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 ไบต์:n->{int b=2,t=n;for(;t>0;)t=t%b++<1?n:t/--b;return b;}
Nevay

2

Japtet , 8 ไบต์

@ìX e}a2

ลองออนไลน์!

คำอธิบาย

@    }a2

ส่งคืนหมายเลขแรก ( X) เพื่อผ่านฟังก์ชั่นเริ่มต้นที่2

ìX

แปลงหมายเลขอินพุตให้เป็นอาร์เรย์ของXตัวเลขฐาน

e

ตรวจสอบว่าตัวเลขทั้งหมดเป็นจริงหรือไม่


จะไม่นี้ล้มเหลวถ้าอาร์เรย์มีหลาย ๆ10?
Shaggy

@Shaggy ความเข้าใจของฉันคือตามความคิดเห็นของ OPs ว่าตัวเลขสำหรับฐานข้างต้น 9 ไม่นับเป็นศูนย์
Justin Mariner

อ่าฉันเห็นแล้ว มีปัญหากับการใช้ถ้อยคำท้าทายดังนั้น (หรือฉันแค่เหนื่อยเกินไป!)
Shaggy

2

JavaScript (ES6), 43 41 37 ไบต์

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

กรณีทดสอบ



2

Python 2 , 57 ไบต์

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

ลองออนไลน์!

-1 ขอบคุณไปยังเฟลิ Nardi บาติสตา
-2 ต้องขอขอบคุณLynn (และตอนนี้นี่เป็นวิธีแก้ปัญหาของเธอ: D)


59 bytesโดยเปลี่ยนa,b=a+c,dเป็นa+=c;b=d
Felipe Nardi Batista

ฉันคิดว่าคุณสามารถแทนที่while m>1ด้วยwhile m(แล้วเราจะผูก!)
ลินน์

@ ลินน์นั่นเป็นเหตุผลที่ฉันให้ความเห็นเกี่ยวกับวิธีการแก้ปัญหาของคุณมันจะเหมือนกันทุกประการ
Erik the Outgolfer


1
@Lynn ฉันรู้แล้ว: p ไม่เช่นนั้นฉันขอให้คุณลบของคุณด้วย
Erik the Outgolfer

2

APL (Dyalog) , 20 19 ไบต์

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

ลองออนไลน์!

ตามปกติขอบคุณ @ Adámที่ช่วยในการแชทและรับรหัสเพื่อทำงานใน TIO นอกจากนี้ยังประหยัด 1 ไบต์

นี่คือ tradfn (ตราด itional unctio n ) ร่างกาย ในการใช้งานคุณต้องกำหนดชื่อ (ซึ่งอยู่ในฟิลด์ส่วนหัวของ TIO) ล้อมรอบด้วยs (หนึ่งหน้าชื่อและอีกหนึ่งชื่อในฟิลด์ท้ายกระดาษของ TIO) จากนั้นเรียกใช้ชื่อโดยใช้ชื่อ เนื่องจากมันใช้รูปสี่เหลี่ยม ( ) เพื่อรับอินพุตของผู้ใช้มันจึงถูกเรียกว่าf \n inputแทนที่จะเป็นแบบปกติf input

อย่างไร?

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)

ฟังก์ชันจะคืนค่าฐานผลลัพธ์


1
มีสนามเล่นกอล์ฟเคล็ดลับ: เนื่องจากn←⎕จะมีจำนวนที่เรียบง่ายและคุณจะต้อง1เป็นอาร์กิวเมนต์เริ่มต้นกับส่วนที่เหลือของรหัสคุณก็สามารถนับจำนวนขององค์ประกอบในn(ซึ่งเป็นที่ 1) โดยการแทนที่ด้วย1⊣ ลองออนไลน์!
Adám


1

R , 79 71 66 63 65 ไบต์

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

ลองออนไลน์!

คำตอบนี้ขึ้นอยู่กับการจัดเรียงใหม่ของ Giuseppe ในวงเดียว

บันทึก 8 ไบต์ขอบคุณ JDL และ 6 ไบต์ขอบคุณ Giuseppe


1
คุณสามารถย่อยbสำหรับTซึ่งเริ่มต้นจากการกำหนดให้เป็นลบความจำเป็นในการTRUE == 1 b=1ในทำนองเดียวกันคุณสามารถย่อยFสำหรับk( Fเป็นFALSE)
JDL

ฉันรู้ว่าคุณทำอะไรที่นั่น. นั่นเป็นประโยชน์ที่ควรทราบ!
NofP

1
66 bytes ใช้m%/%T(การหารจำนวนเต็ม) แทน(m-m%%T)/T
Giuseppe

65 ไบต์ มันก็ยุ่งนิด แต่ผมสงสัยว่าได้รับการกำจัดของลูปซ้อนกันจะประหยัดบางสิ่งบางอย่าง ; ฉันแค่คิดว่ามันจะมากกว่า 1 ไบต์ :(
จูเซปเป้

1

MATL , 13 12 ไบต์

`G@Q_YAA~}@Q

ลองออนไลน์!

-1 ไบต์ขอบคุณ Luis Mendo โปรแกรมนี้ไม่ได้จัดการทดสอบที่มีขนาดใหญ่กว่า 2 ^ 53 ( flintmaxจำนวนเต็มที่ต่อเนื่องสูงสุดที่แสดงโดยชนิดจุดลอย) เนื่องจากประเภทข้อมูลเริ่มต้นอยู่doubleใน MATL อย่างไรก็ตามมันควรจะสามารถค้นหาฐาน zeroless ใดก็ได้ด้านล่างหมายเลขนั้น

`            % 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 ฉันควรเริ่มอ่านเอกสารให้ดีขึ้น ขอบคุณ
Sanchises

ดูเหมือนจะไม่ได้ผลสำหรับกรณีทดสอบที่ใหญ่กว่า แต่ฉันไม่รู้พอเกี่ยวกับ MATL / Matlab เพื่อทราบว่าเกิดจากข้อ จำกัด จำนวนเต็มหรือไม่
Mego

@ ฉันกล่าวว่าฉันได้ทดสอบรุ่น 13 ไบต์ซึ่งควรจะเทียบเท่ากับรุ่นปัจจุบันจนถึง 1e6 บน MATLAB R2017a การตั้งค่าการทดสอบใดที่ทำให้เกิดปัญหากับคุณ
Sanchises

กรณีทดสอบ 2 ครั้งล่าสุดทำให้เกิดข้อผิดพลาด
Mego

@Mego อ่าฉันไม่เคยเห็นตัวอย่างเหล่านั้นมาก่อน นี่คือเนื่องจากการใช้งานของ MATLs YAโดยใช้คู่ภายในดังนั้นมันสามารถจัดการอินพุตได้ถึงจำนวนเต็มที่ต่อเนื่องสูงสุดแทนคู่ (ดูflintmax) นี่เป็นคำตอบที่ไม่ถูกต้องหรือไม่? โดยหลักการแล้วอัลกอริทึมใช้งานกับฐานโดยพลการฉันได้ทำงานกับคำสั่งอื่นอย่างชัดเจนซึ่งจะทำเฉพาะกับฐาน 36 เท่านั้น
Sanchises

0

PHP, 59 + 1 ไบต์

ใช้ builtins , ฐานสูงสุด 36:

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

ไม่มีบิลด์, 63 60 + 1 ไบต์ , ฐานใด ๆ :

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

ทำงานเป็นท่อที่มี-nRหรือลองพวกเขาออนไลน์



0

J, 26 ไบต์

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

Would love to know if this can be improved.

คำกริยาหลักคือวลี dyadic:

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

ซึ่งได้รับอินพุตทางด้านซ้ายและค่าคงที่ 2 ทางด้านขวา วลีกริยาหลักนั้นใช้ J's Do..While สร้างเพิ่มอาร์กิวเมนต์ y ที่เหมาะสมตราบใดที่ 0 เป็นองค์ประกอบของe.อาร์กิวเมนต์ดั้งเดิมในฐาน y

ลองออนไลน์!



0

ทางช้างเผือก 38 ไบต์

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

การใช้งาน: ./mw base.mwg -i 3


คำอธิบาย

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.

ฉันแน่ใจว่าสิ่งนี้สามารถสั้นลงได้โดยใช้ while-loop แทน for for loop แต่ฉันไม่สามารถทำให้มันใช้งานได้



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