ลดความซับซ้อนของตัวเลข


16

คุณจำหมายเลขโทรศัพท์ 6 หรือ 7 หลักที่ปรากฏบนหน้าจอทีวีได้ไม่กี่วินาที! ด้วยเทคนิคพิเศษที่อธิบายไว้ด้านล่างคุณจะกลายเป็นสมุดโทรศัพท์ที่กำลังเดิน!

เห็นได้ชัดว่าตัวเลข402จะง่ายต่อการจำกว่าจำนวน110010010และตัวเลขที่จะง่ายต่อการจำกว่าจำนวน337377 957472ซึ่งหมายความว่าหมายเลขที่จดจำไว้ในอีกด้านหนึ่งควรมีตัวเลขน้อยที่สุดเท่าที่จะเป็นไปได้และในทางกลับกันเป็นที่พึงปรารถนาว่าหมายเลขนั้นจะมีตัวเลขซ้ำจำนวนมากที่สุดเท่าที่จะทำได้

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

งาน

คุณต้องเขียนโปรแกรมเพื่อเลือกฐานของระบบตัวเลขเพื่อลดความซับซ้อนของเกณฑ์ ฐานของระบบตัวเลขจะต้องเลือกในช่วงตั้งแต่ 2 ถึง 36 จากนั้นจะสามารถใช้ตัวเลข0-9และตัวอักษรภาษาอังกฤษA-Zเพื่อแสดงตัวเลขได้

อินพุต

อินพุตมีจำนวนเต็มฐานสิบตั้งแต่ 1 ถึง 999999999

เอาท์พุต

เอาท์พุทจะต้องมีฐานของระบบตัวเลข (จาก 2 ถึง 36) การลดเกณฑ์ของความซับซ้อนในการท่องจำให้น้อยที่สุดและจำนวนในระบบตัวเลขที่เลือกคั่นด้วยช่องว่างหนึ่งช่อง หากหลายฐานให้ค่าเดียวกันสำหรับเกณฑ์ให้เลือกค่าที่น้อยที่สุด

หมายเหตุ

  • ตัวอักษรต้องเป็นตัวพิมพ์ใหญ่ ( A-Z)

กรณีทดสอบ

อินพุตเอาต์พุต

1              2 1

2              3 2

65535       16 FFFF

123          12 A3


16
ความท้าทายที่ยิ่งใหญ่ แต่มันต้องการกรณีทดสอบเพิ่มเติม
Grimmy

7
นอกจากนี้รูปแบบเอาต์พุตค่อนข้างเข้มงวดเกินไปคุณอาจต้องการอนุญาตเช่นอาร์เรย์ของสององค์ประกอบฐานและสตริงหรืออนุญาตให้เรียงลำดับแบบย้อนกลับหรือคั่นด้วยอักขระอื่น นอกจากนี้ฉันสมมติว่าคุณเพิ่มผลรวมของตัวเลขไปยังจำนวนหลัก แต่คุณอาจต้องการชี้แจงให้ชัดเจน
Erik the Outgolfer

8
ฉันสามารถใช้a-zแทนได้A-Zหรือไม่
Neil

5
เราสามารถใช้ตัวเลขที่สอดคล้องกันแทนได้A-Zหรือไม่?
ข้อบกพร่อง

8
เวลา @VerNick ถัดไปที่คุณเขียนเป็นความท้าทายที่คล้ายกันผมจะแนะนำการส่งคำขอทั้งสองนี้เช่นที่พวกเขาเป็นเพียงภาวะแทรกซ้อนที่ไม่จำเป็นซึ่งมีกำลังใจ: เห็นเช่นที่นี่
ข้อผิดพลาด

คำตอบ:


6

Perl 6 , 55 54 ไบต์

-1 ไบต์ขอบคุณ Jo King

{~map({$^b,.base($b)},2..36).min:{@$_+.Set}o*[1].comb}

ลองออนไลน์!


1
คุณสามารถแทนที่@$_ด้วย@_และยังใช้งานได้
SirBogman

2
@SirBogman นี่เพิ่งเกิดขึ้นกับกรณีทดสอบน้อยมาก
nwellnhof

นั่นทำให้รู้สึก มันไม่ถูกต้องนัก
SirBogman

5

Python 2 , 150 149 127 144 ไบต์

lambda n:min((len(c(n,b))+len(set(c(n,b))),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n/b,b,chr(n%b+48+7*(n%b>9))+s)or s or'0'

ลองออนไลน์!


Python 3 , 136 ไบต์

lambda n:min((len((*c(n,b),*{*c(n,b)})),b,c(n,b))for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

ลองออนไลน์!


Python 3.8 (เผยแพร่ล่วงหน้า) , 131 ไบต์

lambda n:min((len((*(x:=c(n,b)),*{*x})),b,x)for b in range(2,37))[1:]
c=lambda n,b,s='':n and c(n//b,b,chr(n%b+48+7*(n%b>9))+s)or s

ลองออนไลน์!


c แปลงหมายเลขฐาน 10 เป็นฐานใด ๆ (2-36) และฟังก์ชันแรก (ไม่ระบุชื่อ) ค้นหาผลลัพธ์ที่เล็กที่สุด


5

05AB1E , 16 14 ไบต์

-1 ไบต์ต้องขอบคุณ Kevin Cruijssen

₆LBāøΣнDÙìg}1è

ลองออนไลน์!

หรือ เพิ่ม R) »ท้ายที่สุดเพื่อให้สอดคล้องกับรูปแบบเอาต์พุตที่ระบุ แต่คำตอบอื่น ๆ ส่วนใหญ่ไม่รบกวน

คำอธิบาย:

₆L          # range 1..36
  B         # convert the input to each of those bases
   āø       # enumerate (pair each element with its 1-based index)
Σ     }     # sort by
     g      # length
 н          # of the first element
    ì       # concatenated to
  DÙ        # itself, uniquified
1è          # take the second entry (first will always be base 1)

1
-1 byte โดยใช้₆L©B®øแทน₆LεBy‚}
Kevin Cruijssen

1
@KevinCruijssen ขอบคุณ! อีก -1 โดยใช้āดูเหมือนว่าคุณมักจะลืมเกี่ยวกับที่หนึ่ง
Grimmy

ฮ่า ๆ ๆ ฉันทำ .. ฉันจำได้ว่าความท้าทายนี้เมื่อเร็ว ๆ นี้วันนี้ไม่ใช่ว่ามันช่วย แต่อย่างใดฮ่าฮ่า xD
Kevin Cruijssen

@ recursive ดูเหมือนคุณจะไม่ได้อ่านคำตอบ ฉันลิงก์เวอร์ชันที่สอดคล้องกับข้อกำหนดเอาต์พุตที่เข้มงวดและอธิบายว่าทำไมฉันจึงไม่ทำเวอร์ชันหลัก
Grimmy

@Grimy มีความผิดในข้อหา ขอโทษที่รบกวนคุณ.
เรียกซ้ำ

4

JavaScript (ES6),  87 85  101 ไบต์

แก้ไข: +16 ไบต์ไร้ประโยชน์เพื่อให้สอดคล้องกับรูปแบบผลลัพธ์ที่เข้มงวด

n=>(g=m=>--b>2?g(m<(v=new Set(s=n.toString(b)).size+s.length)?m:(o=b+' '+s.toUpperCase(),v)):o)(b=37)

ลองออนไลน์!


อาฉันคิดถึงส่วนนั้น
TFeld

4

Japt v2.0a0 -gS, 24 23 ไบต์

ไม่สวย แต่ทำงานได้ดี +2 ไบต์สำหรับความต้องการที่ไม่จำเป็นโดยสมบูรณ์ซึ่งเอาต์พุตเป็นตัวพิมพ์ใหญ่

37o2@sX u ¸iXÃñÈÌiXÌâ)l

ลองมัน

37o2@sX u ¸iXÃñÈÌiXÌâ)l     :Implicit input of integer
37o2                        :Range [2,37)
    @                       :Map each X
     sX                     :  Convert the input to a base-X string
        u                   :  Uppercase
          ¸                 :  Split on spaces (there are none, so this returns a singleton array)
           iX               :  Prepend X
             Ã              :End map
              ñ             :Sort by
               È            :Pass each X through the following function
                Ì           :  Last element of X
                 i          :  Prepend
                  XÌâ       :    Last element of X, deduplicated
                     )      :  End prepend
                      l     :  Length
                            :Implicit output of the first sub-array, joined with spaces

ใช่มันใช้งานได้ดี แต่ตัวอักษรต้องเป็นตัวพิมพ์ใหญ่
Ver Nick พูดว่า Reinstate Monica

1
@ VerNick ทำไม นั่นไม่ได้เพิ่มความท้าทายอะไรเลย
Shaggy

... ฉันเดาว่าสิ่งต่อไปจะ "คั่นด้วยช่องว่างเดียว" ดูเหมือนว่ารูปแบบผลลัพธ์นั้นเข้มงวดมากกับความท้าทายนี้และจากความคิดเห็นที่ดูเหมือนจะไม่เปลี่ยนแปลง
Jonathan Allan

@JanathanAllan โชคดีที่ฉันสามารถ "แก้ไข" สิ่งนั้นด้วยการเปลี่ยนสถานะ
ขนดก

3

PHP ,124 119 ไบต์

for($i=36;$b=strtoupper(base_convert($argn,10,--$i));$o[strlen($b.count_chars($b,3))]="$i $b");krsort($o);echo end($o);

ลองออนไลน์!

ความอัปยศเกี่ยวกับ+12ไบต์ใน PHP เป็นตัวพิมพ์ใหญ่ ... แต่ ... อย่างไรก็ตาม


3

Zsh , 85 ไบต์

for b ({36..2})x=$[[#$b]$1]&&x=${x#*\#}&&a[$#x+${#${(us::)x}}]=$b\ $x
a=($a)
<<<$a[1]

สำหรับหมายเลขนี้งบภายในห่วงใช้จะสั้นกว่า...&&...&&...{...;...;...;}

for b ({36..2})                   # order decreasing: smaller bases overwrite larger ones
    x=$[[#$b]$1] && \             # set x to [base]#[num] 
    x=${x#*\#} && \               # strip leading [base]#
    a[$#x+${#${(us::)x}}]=$b\ $x  # use score as index to store "[base] [number]"
#            ${(us::) }           # (s::)plit into characters, take (u)nique
a=($a)                            # remove empty elements from array
<<<$a[1]                          # print out the first element (smallest score)

ลองออนไลน์!

นี่คือโซลูชันขนาด 81- ไบต์ที่พิมพ์ในรูปแบบ[base]#[num]แทน:

for b ({36..2})x=$[[#$b]$1]&&y=${x#*\#}&&a[$#y+${#${(us::)y}}]=$x
a=($a)
<<<$a[1]

ลองออนไลน์!



2

ถ่านขนาด 38 ไบต์

Nθ≔EE³⁴↨θ⁺²ιL⁺ιΦι⁼λ⌕ικη≔⁺²⌕η⌊ηηIη ↥⍘θη

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ

ใส่จำนวนเต็ม

≔EE³⁴↨θ⁺²ι

แปลงจากฐาน 2 เป็นฐาน 36 ...

L⁺ιΦι⁼λ⌕ικη

... deduplicate, concatenate และใช้ความยาว

≔⁺²⌕η⌊ηη

ใช้ดัชนีของความซับซ้อนขั้นต่ำและเพิ่ม 2 เพื่อให้ได้ฐาน

Iη ↥⍘θη

พิมพ์ฐานและจำนวนเต็มแปลงเป็นฐานนั้นเป็นตัวพิมพ์ใหญ่


2

Stax , 19 ไบต์

Ç╛;ⁿY3█↕(╖S♪*ò▌?½╦l

เรียกใช้และแก้ไขข้อบกพร่อง

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

โปรแกรมโบนัส: ผลลัพธ์สำหรับ [1..1000]


2

เยลลี่ 25 ไบต์

bⱮ36µQL+LN)Mḟ1Ḣ,ị‘ịØBʋ¥⁸K

ลองออนไลน์!

ลิงก์ monadic ที่ใช้จำนวนเต็มเป็นอาร์กิวเมนต์และส่งคืนสตริง Jelly ของรูปแบบที่ต้องการ หากรายการสองรายการเป็นเอาท์พุทที่ยอมรับได้ (ตามความท้าทายมากที่สุด) สามารถบันทึก 2 ไบต์ ถ้าฐาน 1 เป็นที่ยอมรับสำหรับเคสขอบของ 1 เป็นอินพุตสามารถบันทึกได้อีก 2 ไบต์






1

ภาษา Wolfram (Mathematica) , 109 111 ไบต์

Print[a=OrderingBy[#~IntegerDigits~Range@36,Tr[1^#]+Tr[1^Union@#]&,1][[1]]," ",ToUpperCase[#~IntegerString~a]]&

+2: แก้ไขแล้ว ขอบคุณสำหรับการจับ @Roman

OrderingBy เปิดตัวใน Mathematica 12.0 ซึ่ง TIO ยังไม่ได้อัปเดต


"หากหลายฐานให้ค่าเดียวกันสำหรับเกณฑ์ให้เลือกค่าที่น้อยที่สุดในกลุ่ม": OrderingByไม่เป็นไปตามข้อกำหนดนี้
Roman

บางทีสิ่งที่มีMinimalBy, ชอบ ?
Roman

@ Roman ไม่ได้เหรอ? เท่าที่ฉันสามารถบอกได้มันจะรักษาลำดับสัมพัทธ์ของดัชนีสองตัวที่มีค่าเท่ากัน ..
attinat

2
ด้วยการโต้แย้ง123, การแก้ปัญหาของคุณพิมพ์แทนการที่จำเป็น36 3F 12 A3จากOrderingBy[123~IntegerDigits~Range@36, Tr[1^#] + Tr[1^Union@#] &]ฉันได้รับคำตอบ{36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 6, 5, 11, 10, 9, 8, 7, 4, 3, 2, 1}ดังนั้นข้อสันนิษฐานทั่วไปของการไม่มีรายการเทียบเท่าที่เรียงลำดับใหม่ดูเหมือนจะถูกละเว้นที่นี่ ฉัน$Versionคือ "12.0.0 สำหรับ Mac OS X x86 (64 บิต) (7 เมษายน 2019)"
โรมัน

อ่าคุณพูดถูก ฉันไม่ดีที่ไม่สังเกตเห็นว่า
attinat

1

C (เสียงดังกราว) , 165 ไบต์

n,i=2,j,p=99,r,m,x;char*g,*_,b[74][37];t(n){for(;g=b[i],i<37;r=j<p?_=g,p=j,i:r,++i)for(j=0,m=n;m;m/=i,*--g=x+=x>9?87:48)j+=b[i+36][x=m%i]++?1:2;printf("%i,%s",r,_);}

ลองออนไลน์!

n // การป้อนข้อมูล

, i = 2 // iterator จากฐาน 2 ถึง 36

, j // ความซับซ้อนในปัจจุบัน

, p = 99 // ความซับซ้อนที่ดีที่สุด

, r // result = iterator

, m // temp สำเนาของ n

, x; // m% i

ถ่าน * g // สตริงปัจจุบัน PTR

, * _ // best str ptr

ข [74] [37]; // บัฟเฟอร์

/ * [37 + 37] = [สตริงที่ได้รับ + ​​ทดสอบสำหรับอักขระที่ใช้] * /

T (n) {

สำหรับ (; g = b [i], // move ptr

   i<37 ; 
   r=j<p?_=g,p=j,i:r, // save best solution

   ++i){//for every base

สำหรับ (j = 0, m = n; m; m / = i, // แยกตัวเลข

   *--g=x+=x>9?87:48)
   // move ptr backward for printf use and transform to ascii value

J + b = [i + 36] [x = m% ผม] ++ 1: 2; // ไบต์ที่เพิ่มขึ้นเทียบกับอักขระ

// และถ้ามันคือ 0 เพิ่มขึ้น j โดย 2: 1 สำหรับตัวละครใหม่ที่ใช้และ 1 สำหรับจำนวนหลัก

// อื่น ๆ รวมเฉพาะตัวเลขเท่านั้นที่นับ + ตัวชี้ย้าย

// printf ("% s -", ​​g); // test

// printf ("r% ip% ij% i \ n", r, p, j); // ทดสอบ

}

printf ( "% i,% s", R, _); // เอาท์พุท

}


1
163 ไบต์สามารถเรียกได้มากกว่าหนึ่งครั้ง
ceilingcat

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