Beberapa basis tetapi tidak dua kali angka yang sama

15

Memasukkan

Array integer positif yang tidak kosong.

Tugas

Konversi setiap bilangan bulat menjadi biner, oktal, desimal, atau heksadesimal sedemikian rupa sehingga setiap digit ( 0 ke F ) digunakan paling banyak satu kali.

Keluaran

Daftar pangkalan yang digunakan untuk memecahkan teka-teki.

Contoh terperinci

Output yang diharapkan untuk [16, 17] adalah [oktal, desimal] .

Inilah alasannya:

  • Kami tidak dapat menggunakan desimal untuk kedua angka, karena keduanya mengandung angka 1 .
  • 16 tidak dapat dikonversi ke biner, karena perwakilannya di basis ini ( 10000 ) berisi beberapa 0 's.
  • 17 juga tidak dapat dikonversi ke biner, karena perwakilannya dalam basis ini ( 10001 ) mengandung beberapa 0 dan beberapa 1 .
  • 17 tidak dapat dikonversi menjadi heksadesimal, karena perwakilannya dalam basis ini ( 11 ) terdiri dari dua 1 .
  • Mari kita pertimbangkan semua kemungkinan yang tersisa:

                   +---------+---------+--------+
                   | 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  |
    +--------------+---------+---------+--------+
    

    Satu-satunya solusi yang mungkin adalah mengkonversi 16 dalam oktal ( 20 ) dan untuk menjaga 17 dalam desimal ( 17 ). Dengan cara ini, angka 0 , 1 , 2 dan 7 digunakan tepat sekali.

Klarifikasi dan aturan

  • Input dijamin untuk mengarah ke solusi yang unik. Kode Anda seharusnya tidak mendukung array yang memberikan beberapa solusi atau tidak ada solusi sama sekali.
  • Anda dapat mengeluarkan basis dalam format yang masuk akal, seperti ["bin", "oct", "dec", "hex"] , ['b', 'o', 'd', 'd', 'h'] , "BODH " , [2,8,10,16] , [0,1,2,3] dll. Tetapi itu harus dijelaskan dengan jelas dalam jawaban Anda.
  • Urutan basis dalam output harus sesuai dengan urutan bilangan bulat input.
  • Jika itu membantu, Anda dapat mengasumsikan bahwa input diurutkan dari terendah ke tertinggi, atau dari tertinggi ke terendah.
  • Ini adalah , jadi jawaban tersingkat dalam byte menang!

Uji kasus

Anda tidak harus menampilkan hasil konversi yang tercantum di bawah ini. Mereka murni informasi.

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

Daftar input mentah tersedia di sini .

Arnauld
sumber
haruskah kita memperhatikan beberapa aspek efisiensi? (seperti jika panjang array 1000 atau sesuatu seperti itu)
DanielIndie
3
@DanielIndie Tidak, Anda tidak perlu. Selain itu, teka-teki 1000 entri akan mencakup banyak digit duplikat, tidak peduli basis yang digunakan, sehingga tidak mungkin menjadi valid. (Ini dijamin tidak akan terjadi sesuai aturan pertama.)
Arnauld
ya, Anda benar ... bodoh saya ... :)
DanielIndie
1
Benar-benar menantikan solusi Japt, karena saya mencobanya dan tidak dapat menemukan yang bagus.
Nit
2
@Scrooble Tidak. :) Selamat mencoba!
Arnauld

Jawaban:

4

JavaScript (Node.js) , 192,155,154,152,151,145,136,113,99,92 90 byte

  • terima kasih kepada @Arnauld untuk mengingatkan saya bahwa saya dapat mengembalikan [0,1,2,3] -> yaitu [2,8,10,16] menghemat 8 byte, dan untuk ide cemerlang (yang membantu mengurangi sebesar 23+ byte)
  • terima kasih kepada @Kevin Cruijssen untuk mengurangi 1 byte
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

Cobalah online!

Penjelasan:

[c,...a]- Trik @Arnauld untuk mengambil satu item dalam satu waktu c?***:" "-> jika c tidak terdefinisi, kami berhasil mencapai hasil akhir- [] - jika saya akan meletakkan "" daripada yang ditemukan tidak akan dianggap sah. ([] + 5 = "5" JS FTW) [1,4,5,8].find setiap kali kami menemukan basis yang benar (output akan dari array ini (1,4,5,8) -> (2,8,10,16) legit. sekarang bagaimana cara kerjanya -> jika ia menemukan sesuatu ia mengembalikan elemen (1-8) dan kemudian saya menambahkan hasil dari solusi dalam.jika tidak menemukan maka ia mengembalikan undefined + T sekarang false -> NaN yang pada panggilan orang tua akan dianggap salah

!/(.).*\1/.test(n=t+b) tentukan apakah string memiliki duplikat, jika demikian:

f(a,n)) langsung saja ke nomor berikutnya (a sekarang array.slice (1)) dengan string baru (n)

kami menetapkan hasil ke T (temp) dari hasil karena menemukan berhenti ketika ditemukan dan jadi kami tahu bahwa hasil terakhir adalah f () yang merupakan hasil B

DanielIndie
sumber
1
t="",B=""untuk t="",B=takan menghemat byte.
Kevin Cruijssen
@KevinCruijssen memperbarui solusinya, terima kasih :) (dan Anda ke Arnauld)
DanielIndie
@Arnauld saya mengambil ide cemerlang Anda dan melakukan sesuatu yang serupa. lihat solusinya sekarang
DanielIndie
@Arnauld keangkeran murni
DanielIndie
1
Keren! Mari kita memotong 2 byte lagi (dan tidak perlu trim()lagi).
Arnauld
3

Perl 5 -alp , 55 byte

Penggunaan %xuntuk hex, %duntuk desimal, %ountuk oktal dan %buntuk biner

#!/usr/bin/perl -alp
($_)=grep{sprintf($_,@F)!~/(.).*\1/}glob"%{d,o,b,x}"x@F

Cobalah online!

Ton Hospel
sumber
3

Ruby, 72 71 byte

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

Format output adalah semacam monstrositas S-ekspresi terbalik:

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

Memisahkan slash sebagai gantinya akan membutuhkan 3 byte lebih (menambahkan *?/ ).

Format ini berasal dari struktur loop, sedikit lebih pendek daripada yang lebih idiomatis repeated_combination(a.size) , yang menghasilkan array array karakter dan kemudian menguranginya di atas fungsi lintas-produk.

Sunting: Disimpan 1 byte berkat Lynn.

histokrat
sumber
2

Pyth, 21 20 byte

f{Is.bjYNTQ^[8T2y8)l

Mengembalikan daftar semua daftar pangkalan yang mungkin (yang selalu memiliki panjang 1).
Coba di sini

Penjelasan

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.

sumber
2

Jelly , 17 16 byte

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

Cobalah online!

Kembalikan daftar pangkalan.

 == Penjelasan ==
⁴⁽% ʠḃṗL³bF⁼Q $ linkf Tautan utama.
 ⁽% ʠ Angka.
    ḃ ubah menjadi basis bijective ...
⁴ 16. Hasilnya [2,8,10,16].
     ṗL Daya kartesius dengan panjang input.
             Jika Filter, simpan yang memenuhi ...
       ³ input
        b konversikan ke basis itu
         F saat meratakan (gabungkan semua digit \
                      nomor yang berbeda bersama-sama)
          ⁼Q $ sama dengan dirinya sendiri yang unik.
pengguna202729
sumber
2

Python 2 , 128 byte

from itertools import*
a=input()
for b in product(*['bdxo']*len(a)):
 s=''.join(map(format,a,b))
 if len(s)==len(set(s)):print b

Cobalah online!

Lynn
sumber
2

05AB1E , 17 byte

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

Cobalah online!

Kaldo
sumber
Saya tidak tahu 05AB1E, jadi mungkin saya harus menunggu sampai Anda telah menambahkan penjelasan sebelum saya bertanya, tapi mengapa hasilnya untuk 8karakter '8', dan tiga lainnya bilangan bulat? +1, tampaknya berfungsi dengan baik, termasuk kasus uji yang lebih lama.
Kevin Cruijssen
2
@KevinCruijssen Itu berasal dari "2žv8T". Angka dalam kode sumber didorong sebagai karakter di 05AB1E, sedangkan žv (16) dan T (10) adalah built-in yang mendorong angka masing-masing pada tumpukan. Ini biasanya tidak diketahui karena tampilan implisit 05AB1E dari elemen terakhir dalam stack dikonversi ke angka, tetapi karena dalam kasus ini hasil yang ditampilkan adalah array elemen, elemen-elemen tersebut tidak tersentuh, oleh karena itu tanda kutip. Perintah ï misalnya dapat digunakan setelah) untuk melemparkan dua elemen char ke ints.
Kaldo
@KevinCruijssen Contoh penjelasan saya: tio.run/##MzBNTDJM/f/fyPbQDtv//wE Kode: push 2, cetak, bungkus ke dalam array, cetak.
Kaldo
2

Python 2 , 121 117 113 111 byte

def f(a,d='',s=''):
 if a:
	for c in'bodx':t=format(a[0],c)+s;len(t)-len(set(t))or f(a[1:],d+c,t)
 else:print d

Cobalah online!

Tip dari topi untuk Lynn untuk format, yang saya sudah lupa!

Chas Brown
sumber
1

Sekam , 19 byte

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

Cobalah online!

Mengembalikan daftar pangkalan

Penjelasan

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
Fyr
sumber