มีหลายฐาน แต่ไม่ใช่เลขสองหลักเดียวกัน


15

อินพุต

อาร์เรย์ที่ไม่ว่างของจำนวนเต็มบวก

งาน

แปลงแต่ละจำนวนเต็มเป็นเลขฐานสองฐานแปดทศนิยมหรือฐานสิบหกในลักษณะที่แต่ละหลัก ( 0ถึงF ) ถูกใช้อย่างมากที่สุดครั้งเดียว

เอาท์พุต

รายการของฐานที่ใช้เพื่อไขปริศนา

ตัวอย่างรายละเอียด

ผลลัพธ์ที่คาดหวังสำหรับ[16, 17]คือ[ฐานแปด, ทศนิยม] [ฐานแปดทศนิยม]

นี่คือเหตุผล:

  • เราไม่สามารถใช้ทศนิยมสำหรับทั้งสองหมายเลขได้ง่ายเนื่องจากตัวเลขทั้งสองมี1 1
  • 16ไม่สามารถแปลงเป็นไบนารีได้เนื่องจากการเป็นตัวแทนในฐานนี้ ( 10,000 ) มีหลาย0 's
  • 17ไม่สามารถแปลงเป็นไบนารีได้เช่นกันเนื่องจากการแสดงในฐานนี้ ( 1,0001 ) มีหลาย0และ1หลาย ' s
  • 17ไม่สามารถแปลงเป็นเลขฐานสิบหกเพราะเป็นตัวแทนในฐานนี้ ( 11 ) ประกอบด้วยสอง1 's
  • ลองพิจารณาความเป็นไปได้ที่เหลืออยู่ทั้งหมด:

                   +---------+---------+--------+
                   | oct(16) | dec(16) | hex(16)|
                   | = 20    | = 16    | = 10   |
    +--------------+---------+---------+--------+
    | oct(17) = 21 | 20,21   | 16,21   | 10,21  |
    | dec(17) = 17 | 20,17   | 16,17   | 10,17  |
    +--------------+---------+---------+--------+
    

    ทางออกที่เป็นไปได้เพียงอย่างเดียวคือการแปลง16ในฐานแปด ( 20 ) และเพื่อให้17ในทศนิยม ( 17 ) ด้วยวิธีนี้ตัวเลข0 , 1 , 2และ7จะถูกใช้เพียงครั้งเดียว

คำอธิบายและกฎ

  • อินพุตรับประกันว่าจะนำไปสู่โซลูชันที่ไม่ซ้ำกัน รหัสของคุณไม่ควรสนับสนุนอาร์เรย์ที่มีวิธีแก้ไขปัญหาหลายวิธีหรือไม่มีวิธีแก้ปัญหาเลย
  • คุณสามารถส่งออกฐานในรูปแบบที่สมเหตุสมผลเช่น["bin", "oct", "dec", "hex"] , ['b', 'o', 'd', 'h'] , "BODH " , [2,8,10,16] , [0,1,2,3]เป็นต้น แต่ควรอธิบายอย่างชัดเจนในคำตอบของคุณ
  • คำสั่งของฐานในการส่งออกจะต้องตรงกับคำสั่งของจำนวนเต็มเข้า
  • หากเป็นเช่นนั้นคุณอาจสมมติว่าอินพุตถูกเรียงลำดับจากต่ำสุดไปสูงสุดหรือจากสูงสุดไปต่ำสุด
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!

กรณีทดสอบ

คุณไม่จำเป็นต้องแสดงผลลัพธ์การแปลงด้านล่าง พวกเขาให้ข้อมูลอย่างหมดจด

Input                                  | Output          | Conversion result
---------------------------------------+-----------------+------------------------
[ 119 ]                                | O               | 167
[ 170 ]                                | D               | 170
[ 64222 ]                              | H               | FADE
[ 16, 17 ]                             | O/D             | 20/17
[ 14, 64, 96 ]                         | H/H/D           | E/40/96
[ 34, 37, 94 ]                         | O/D/H           | 42/37/5E
[ 2, 68, 82 ]                          | B/D/H           | 10/68/52
[ 22, 43, 96 ]                         | O/O/O           | 26/53/140
[ 3639, 19086, 57162 ]                 | H/D/H           | E37/19086/DF4A
[ 190, 229, 771 ]                      | O/H/O           | 276/E5/1403
[ 2, 44, 69, 99 ]                      | B/H/H/H         | 10/2C/45/63
[ 75, 207, 218, 357, 385 ]             | H/H/H/D/O       | 4B/CF/DA/357/601
[ 12, 28, 46, 78, 154, 188, 222, 240 ] | D/O/O/D/H/H/H/H | 12/34/56/78/9A/BC/DE/F0

รายการป้อนข้อมูลดิบสามารถใช้ได้ที่นี่


เราควรใส่ใจประสิทธิภาพด้านใดบ้าง? (เช่นถ้าอาร์เรย์มีความยาว 1,000 หรือประมาณนั้น)
DanielIndie

3
@DanielIndie ไม่คุณไม่จำเป็นต้องทำ นอกจากนี้การไขปริศนาของ 1,000 รายการจะมีตัวเลขที่ซ้ำกันจำนวนมากไม่ว่าจะใช้ฐานใดก็ตามดังนั้นจึงไม่สามารถเป็นรหัสที่ถูกต้องได้ (สิ่งนี้รับประกันได้ว่าจะไม่เกิดขึ้นตามกฎข้อแรก)
Arnauld

ใช่คุณพูดถูก ... โง่ฉัน ... :)
DanielIndie

1
รอคอยการแก้ปัญหา Japt จริงๆเพราะฉันลองแล้วไม่สามารถหาทางออกที่ดีได้
นิตย์

2
@Scoboble Nope :) พยายามได้ดี!
Arnauld

คำตอบ:


4

JavaScript (Node.js) , 192,155,154,152,151,145,136,116,113,99,92 90 ไบต์

  • ขอบคุณ @Arnauld ที่เตือนฉันว่าฉันสามารถส่งคืน [0,1,2,3] -> ซึ่ง [2,8,10,16] บันทึกได้ 8 ไบต์และสำหรับความคิดที่ยอดเยี่ยม (ซึ่งช่วยลด 23+ bytes)
  • ขอบคุณ @Kevin Cruijssen สำหรับการลดขนาด 1 ไบต์
f=([c,...a],t="")=>c?[1,4,5,8].find(b=>T=!/(.).*\1/.test(n=t+c.toString(b*2))&&f(a,n))+T:a

ลองออนไลน์!

คำอธิบาย:

[c,...a]- @Arnauld เคล็ดลับในการรับไอเท็มครั้งละ c?***:" "-> ถ้า c ไม่ได้กำหนดเราจัดการเพื่อให้ได้ผลลัพธ์สุดท้าย - [] - ถ้าฉันจะใส่ "" มากกว่าการค้นหาจะไม่ถือว่าถูกต้องตามกฎหมาย ([] + 5 = "5" JS FTW) [1,4,5,8].findทุกครั้งที่เราหาฐานที่ถูกต้อง (ผลลัพธ์จะเป็นของอาร์เรย์นี้ (1,4,5,8) -> (2,8,10,16) มันถูกต้อง ตอนนี้วิธีการทำงานของการค้นหา -> หากพบสิ่งที่มันส่งกลับองค์ประกอบ (1-8) และกว่าที่ฉันเพิ่มผลลัพธ์ของการแก้ปัญหาภายในถ้ามันไม่พบก็จะส่งกลับ undefined + T เป็นเท็จ -> NaN ซึ่งใน การเรียกผู้ปกครองจะถือว่าเป็นเท็จ

!/(.).*\1/.test(n=t+b) ตรวจสอบว่าสายมีซ้ำกันถ้าเป็นเช่นนั้น:

f(a,n)) เพียงไปที่ตัวเลขถัดไป (a คือตอนนี้ array.slice (1)) กับสตริงใหม่ (n)

เรากำหนดผลลัพธ์ให้กับ T (ชั่วคราว) ของผลลัพธ์เพราะค้นหาหยุดเมื่อพบและเรารู้ว่าผลลัพธ์สุดท้ายจะเป็น f () ซึ่งเป็นผลลัพธ์ B


1
t="",B=""เพื่อt="",B=tจะบันทึกไบต์
Kevin Cruijssen

@KevinCruijssen อัปเดตวิธีแก้ปัญหาขอบคุณ :) (และคุณเป็น Arnauld)
DanielIndie

@Arnauld ฉันเอาความคิดที่ยอดเยี่ยมของคุณและทำสิ่งที่คล้ายกัน ดูวิธีแก้ปัญหาตอนนี้
DanielIndie

@Arnauld บริสุทธิ์สุดยอด
DanielIndie

1
เย็น! ลองกำจัดอีก 2 ไบต์ (และไม่จำเป็นต้องใช้trim()อีกต่อไป)
Arnauld


3

Ruby, 72 71 ไบต์

->a{a.map{%w[b o d x]}.inject(&:product).find{|c|/(.).*\1/!~[p,c]*?%%a}}

รูปแบบผลลัพธ์เป็นสิ่งน่าประหลาดใจแบบย้อนกลับ S-expression บางประเภท:

f[[12, 28, 46, 78, 154, 188, 222, 240]]
=> [[[[[[["d", "o"], "o"], "d"], "x"], "x"], "x"], "x"]

Slash - แยกมันแทนจะมีราคา 3 ไบต์เพิ่มเติม (ผนวก*?/)

รูปแบบนี้มาจากโครงสร้างวนรอบซึ่งสั้นกว่าความหมายที่สั้นกว่าเล็กน้อยrepeated_combination(a.size)ซึ่งสร้างอาร์เรย์ของอักขระหลายตัวและลดลงผ่านฟังก์ชันข้ามผลิตภัณฑ์

แก้ไข: บันทึก 1 ไบต์ต้องขอบคุณ Lynn


2

Pyth, 21 20 ไบต์

f{Is.bjYNTQ^[8T2y8)l

ส่งคืนรายการของรายการฐานที่เป็นไปได้ทั้งหมด (ซึ่งมักมีความยาว 1)
ลองที่นี่

คำอธิบาย

f{Is.bjYNTQ^[8T2y8)l
           ^[8T2y8)lQ  Get the tuples of bases of the same length as the input.
f                      Filter to get those...
    .bjYNTQ            ... where converting bases elementwise...
   s                   ... and joining together...
 {I                    ... has no repeats.


2

เยลลี่ , 17 16 ไบต์

⁴⁽%ʠḃṗL³bF⁼Q$ƲÐf

ลองออนไลน์!

ส่งคืนรายการฐาน

 == คำอธิบาย ==
⁴⁽% ʠḃṗL³bF⁼Q $ ƲÐfลิงก์หลัก
 ⁽% ʠจำนวน
    ḃแปลงเป็นฐานข้อมูลแบบ bijective ...
⁴ 16. ผลลัพธ์คือ [2,8,10,16]
     CartL พลังคาร์ทีเซียนโดยความยาวอินพุต
             Filterf Filter รักษาผู้ที่พอใจ ...
       input อินพุต
        b แปลงเป็นฐานนั้น
         F เมื่อแบน (รวมตัวเลขทั้งหมดของ \
                      ตัวเลขต่างกัน)
          $Q $ เท่ากับตัวตนที่ไม่ซ้ำกัน


2

05AB1E , 17 ไบต์

2žv8T)sgãʒIsв˜DÙQ

ลองออนไลน์!


ฉันไม่รู้ 05AB1E ดังนั้นบางทีฉันควรรอจนกว่าคุณจะเพิ่มคำอธิบายก่อนถามคำถามนี้ แต่ทำไมผลลัพธ์8ของตัวละคร'8'และอีกสามตัวเป็นจำนวนเต็ม? +1 แม้ว่าดูเหมือนว่าจะทำงานได้ดีรวมถึงกรณีทดสอบที่ยาวนานกว่า
Kevin Cruijssen

2
@KevinCruijssen นั่นมาจาก "2žv8T" ตัวเลขในซอร์สโค้ดถูกผลักออกมาเป็นอักขระใน 05AB1E ในขณะที่žv (16) และ T (10) เป็นบิวด์อินที่พุชหมายเลขตามลำดับบนสแต็ก สิ่งนี้มักจะไม่มีใครสังเกตเห็นเพราะการแสดงองค์ประกอบสุดท้ายของ 05AB1E โดยนัยในสแต็คจะแปลงเป็นตัวเลข แต่เนื่องจากในกรณีนี้ผลลัพธ์ที่แสดงเป็นอาร์เรย์ขององค์ประกอบองค์ประกอบเหล่านั้นจะไม่ถูกแตะต้องดังนั้นราคา ตัวอย่างเช่นคำสั่งïสามารถใช้งานได้หลังจาก) ในการแปลงองค์ประกอบถ่านสองตัวเป็น int
Kaldo

@KevinCruijssen ตัวอย่างคำอธิบายของฉัน: tio.run/##MzBNTDJM/f/fyPbQDtv//wE รหัส: กด 2, พิมพ์, ห่อเป็นอาร์เรย์พิมพ์
Kaldo


1

Husk , 19 ไบต์

fȯS=UΣz`B¹πmDd1458L

ลองออนไลน์!

ส่งคืนรายการฐาน

คำอธิบาย

fȯS=UΣz`B¹πmDd1458L  Implicit input
                  L  Length of input
          π          Cartesian power of
             d1458     The digits of 1458  [1,4,5,8]
           mD          Double the digits   [2,8,10,16]
fȯ                   Filter by
      z`B¹             Zip with input by converting to its base
     Σ                 Concatenate
  S=U                  Equal to itself with unique elements
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.