Birkaç baz, ancak aynı basamağın iki katı değil


15

Giriş

Boş olmayan bir pozitif tamsayı dizisi.

Görev

Her tamsayıyı, her basamak ( 0 ila F ) en çok bir kez kullanılacak şekilde ikili, sekizli, ondalık veya onaltılık biçime dönüştürün .

Çıktı

Bulmacayı çözmek için kullanılan üslerin listesi.

Ayrıntılı örnek

Beklenen çıkış [16, 17] olup [sekizlik, ondalık] .

İşte nedeni:

  • Her iki sayı için de ondalık değeri kullanamayız, çünkü her ikisinde de 1 bulunur .
  • 16 ikilik biçime dönüştürülemez, çünkü bu tabandaki ( 10000 ) temsili birkaç 0 ' içerir .
  • 17 , ikilik biçime dönüştürülemez, çünkü bu tabandaki ( 10001 ) temsili birkaç 0 ve birkaç 1 içerir .
  • 17 , onaltılı sayıya dönüştürülemez, çünkü bu tabandaki ( 11 ) temsili iki 1 's'den oluşur .
  • Kalan tüm olasılıkları ele alalım:

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

    Mümkün olan tek çözüm 16'yı sekizlik ( 20 ) olarak dönüştürmek ve 17'yi ondalık ( 17 ) olarak tutmaktır . Bu şekilde, 0 , 1 , 2 ve 7 rakamları tam olarak bir kez kullanılır.

Açıklamalar ve kurallar

  • Girişin benzersiz bir çözüme ulaşması garanti edilir. Kodunuzun birkaç çözüm veren veya hiç çözüm içermeyen dizileri desteklemesi gerekmez.
  • Bazları ["bin", "oct", "dec", "hex"] , ['b', 'o', 'd', 'h'] , "BODH gibi makul bir formatta çıktı alabilirsiniz " , [2,8,10,16] , [0,1,2,3] vb. Ancak cevabınızda açıkça açıklanmalıdır.
  • Çıkıştaki tabanların sırası, giriş tamsayılarının sırası ile eşleşmelidir.
  • Bu yardımcı olursa, girdinin en düşükten en yükseğe veya en yüksekten en düşüğe doğru sıralandığını varsayabilirsiniz.
  • Bu , bu yüzden bayt en kısa cevap kazanır!

Test senaryoları

Aşağıda listelenen dönüşüm sonuçlarının çıktısını almanıza gerek yoktur. Tamamen bilgilendiricidirler.

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

Ham giriş listesine buradan ulaşabilirsiniz .


verimliliğin bir yönünü önemsemeli miyiz? (dizi uzunluğu 1000 ise veya bunun gibi bir
şeyse

3
@DanielIndie Hayır, zorunda değilsin. Ayrıca, 1000 girişlik bir bulmaca, kullanılan bazlar ne olursa olsun, çok sayıda yinelenen rakam içerecektir, bu yüzden geçerli bir tane olamaz. (Bu, birinci kurala göre gerçekleşmeyeceği garantilidir.)
Arnauld

evet, haklısın ... aptal bana ... :)
DanielIndie

1
Gerçekten bir Japt çözümü bekliyorum, çünkü denedim ve iyi bir çözüm bulamadım.
Nit

2
@Çok Halat. :) İyi deneme!
Arnauld

Yanıtlar:


4

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

  • @Arnauld sayesinde bana [0,1,2,3] -> geri dönebileceğimi hatırlattığım için [2,8,10,16] 8 bayt kazandırır ve parlak fikir için (23+ azaltmaya yardımcı olur) bayt)
  • @Kevin Cruijssen'e 1 bayt azalttığı için teşekkürler
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

Çevrimiçi deneyin!

Açıklama:

[c,...a]- @Ardauld bir kerede bir öğe almak için hile c?***:" "-> c undefined ise sonuç elde etmeyi başardık- [] - Eğer bulursanız "" koyarsam bu yasal olarak kabul edilmezdi. ([] + 5 = "5" JS FTW) [1,4,5,8].finddoğru tabanı her bulduğumuzda (çıktı bu diziden (1,4,5,8) -> (2,8,10,16) okunaklı olacaktır. şimdi bulmak nasıl çalışır -> bir şey bulursa eleman (1-8) döndürür ve ben daha sonra iç çözümün sonucunu eklemek. eğer bulamazsa tanımsız döndürür + T şimdi yanlış -> NaN hangi ebeveyn çağrısı yanlış kabul edilecektir

!/(.).*\1/.test(n=t+b) dizenin yinelenen olup olmadığını belirleyin, varsa:

f(a,n)) bir sonraki sayıyı (a şimdi array.slice (1)) yeni dizeyle (n)

sonucu sonucun T (temp) değerine atarız, çünkü bulduğu zaman bulma durur ve bu nedenle son sonucun sonuç B (f () olacağını biliyoruz.


1
t="",B=""t="",B=tbayt tasarruf etmek .
Kevin Cruijssen

@KevinCruijssen çözümü günceller, teşekkürler :) (ve sen Arnauld'a)
DanielIndie

@ Parlak fikrini aldım ve benzer bir şey yaptım. şimdi çözüme bakın
DanielIndie

@Arnauld pure awesomeness
DanielIndie

1
Güzel! 2 bayt daha tıraş edelim (ve artık gerek trim()yok).
Arnauld

3

Perl 5 -alp , 55 bayt

Kullanımları %xonaltılık için, %dondalık için, %osekizlik ve %bikili için

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

Çevrimiçi deneyin!


3

Yakut, 72 71 bayt

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

Çıktı biçimi bir çeşit ters S-ifadesi canavarlığıdır:

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

Bunun yerine eğik çizgi ile ayırmak 3 bayta mal olur (eklenir *?/).

Bu biçim döngü yapısından gelir, daha deyimden biraz daha kısa repeated_combination(a.size) , bir dizi karakter dizisi oluşturan ve daha sonra çapraz ürün işlevi üzerinde azaltan .

Düzenleme: Lynn sayesinde 1 bayt kaydedildi.


2

Pyth, 21 20 bayt

f{Is.bjYNTQ^[8T2y8)l

Her zaman uzunluğu 1 olan olası tüm taban listelerinin listesini döndürür.
Burada deneyin

açıklama

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

Jöle , 17 16 bayt

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

Çevrimiçi deneyin!

Bazların bir listesini döndürün.

 == Açıklama ==
Link% ʠḃṗL³bF⁼Q $ ƲÐf Ana bağlantı.
 ⁽% ʠ Bir sayı.
    ij bijektif tabana dönüştürmek ...
⁴ 16. Sonuç [2,8,10,16].
     lengthL Giriş uzunluğuna göre kartezyen güç.
             FilterFiltre, tatmin edici olanları saklayın ...
       ³ giriş
        b bu tabana dönüştür
         Düzleştirdiğinizde F (\
                      farklı sayılar birlikte)
          ⁼Q $ kendine özgü.


2

05AB1E , 17 bayt

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

Çevrimiçi deneyin!


05AB1E bilmiyorum, bu yüzden belki bunu sormadan önce bir açıklama ekleyene kadar beklemeliyim, ama neden 8karakter sonucu '8'diğer üçü de bir tamsayı? +1, ancak son test vakaları da dahil olmak üzere iyi çalışıyor gibi görünüyor.
Kevin Cruijssen

2
@KevinCruijssen Bu "2žv8T" den geliyor. Kaynak kodundaki sayılar 05AB1E'de karakterler olarak itilirken, žv (16) ve T (10) ilgili sayıları yığına iten yerleşiktir. Bu genellikle fark edilmez, çünkü 05AB1E'nin yığındaki son öğenin örtülü olarak gösterilmesi sayılara dönüşür, ancak bu durumda görüntülenen sonuç bir öğe dizisi olduğundan, bu öğelere dokunulmaz, dolayısıyla tırnaklar bırakılır. Ï komutu, örneğin) sonra iki karakter öğesini ints'e dökmek için kullanılabilir.
Kaldo

@KevinCruijssen Benim açıklamama örnek: tio.run/##MzBNTDJM/f/fyPbQDtv//wE Kod: push 2, print, bir diziye sarın, yazdırın.
Kaldo


1

Kabuk , 19 bayt

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

Çevrimiçi deneyin!

Baz listelerini döndürür

açıklama

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.