Kilka zasad, ale nie dwa razy ta sama cyfra

15

Wejście

Niepusta tablica dodatnich liczb całkowitych.

Zadanie

Konwertuj każdą liczbę całkowitą na binarną, ósemkową, dziesiętną lub szesnastkową w taki sposób, że każda cyfra (od 0 do F ) jest używana maksymalnie raz.

Wynik

Lista baz, które zostały użyte do rozwiązania zagadki.

Szczegółowy przykład

Oczekiwany wynik dla [16, 17] to [ósemkowy, dziesiętny] .

Oto dlaczego:

  • Nie możemy po prostu użyć dziesiętnego dla obu liczb, ponieważ oba zawierają 1 .
  • 16 nie może być przekształcony w binarny, ponieważ jego reprezentację w tej podstawy ( 10000 ) zawiera kilka 0 „s.
  • 17 nie może być przekształcony albo binarny, ponieważ jego reprezentację w tej podstawy ( 10001 ) zawiera kilka 0 „S kilka 1 ” S.
  • 17 nie można przekonwertować na szesnastkowy, ponieważ jego reprezentacja w tej podstawie ( 11 ) składa się z dwóch 1 .
  • Rozważmy wszystkie pozostałe możliwości:

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

    Jedynym możliwym rozwiązaniem jest konwersja 16 na liczbę ósemkową ( 20 ) i zachowanie 17 na liczbach dziesiętnych ( 17 ). W ten sposób cyfry 0 , 1 , 2 i 7 są używane dokładnie raz.

Wyjaśnienia i zasady

  • Dane wejściowe gwarantują unikalne rozwiązanie. Twój kod nie powinien obsługiwać tablic, które dają kilka rozwiązań lub nie zawierają żadnego rozwiązania.
  • Możesz wyprowadzać bazy w dowolnym rozsądnym formacie, takim jak [„bin”, „oct”, „dec”, „hex”] , ['b', 'o', 'd', 'h'] , "BODH ” , [2,8,10,16] , [0,1,2,3] itd. Ale należy to jasno wyjaśnić w swojej odpowiedzi.
  • Kolejność zasad na wyjściu musi być zgodna z kolejnością liczb całkowitych wejściowych.
  • Jeśli to pomoże, możesz założyć, że dane wejściowe są sortowane od najniższej do najwyższej lub od najwyższej do najniższej.
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

Przypadki testowe

Nie musisz generować wyników konwersji wymienionych poniżej. Są one czysto informacyjne.

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

Lista surowych danych wejściowych jest dostępna tutaj .

Arnauld
źródło
czy powinniśmy dbać o jakiś aspekt wydajności? (np. jeśli tablica ma długość 1000 lub coś w tym stylu)
DanielIndie,
3
@DanielIndie Nie, nie musisz. Poza tym łamigłówka złożona z 1000 wpisów zawierałaby wiele zduplikowanych cyfr, bez względu na zastosowane zasady, więc nie może być poprawna. (Gwarantujemy, że tak się nie stanie zgodnie z pierwszą zasadą).
Arnauld
tak, masz rację ... głupi ja ... :)
DanielIndie
1
Naprawdę nie mogę się doczekać rozwiązania Japt, ponieważ wypróbowałem je i nie mogłem znaleźć dobrego.
Nit
2
@Scrooble Nope. :) Niezła próba!
Arnauld,

Odpowiedzi:

4

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

  • dzięki @Arnauld za przypomnienie, że mogę zwrócić [0,1,2,3] -> czyli [2,8,10,16] oszczędza 8 bajtów i za genialny pomysł (który pomaga zmniejszyć o 23+ bajty)
  • dzięki @Kevin Cruijssen za zmniejszenie o 1 bajt
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

Wypróbuj online!

Wyjaśnienie:

[c,...a]- @ Sztuczka Arnaulda za zabranie jednego przedmiotu na raz c?***:" "-> jeśli c jest niezdefiniowany, udało nam się dotrzeć do wyniku końcowego - [] - gdybym wstawił „”, to znalezisko nie uznałoby tego za uzasadnione. ([] + 5 = „5” JS FTW) za [1,4,5,8].findkażdym razem, gdy znajdziemy prawidłową podstawę (wynik będzie z tej tablicy (1,4,5,8) -> (2,8,10,16) jej legit. teraz jak działa find -> jeśli coś znajdzie, zwraca element (1-8), a następnie dodaję rozwiązanie wewnętrzne. jeśli nie znajdzie, to zwraca niezdefiniowane + T jest teraz fałszywe -> NaN, który w połączenie z rodzicem zostanie uznane za fałszywe

!/(.).*\1/.test(n=t+b) sprawdź, czy ciąg ma duplikaty, jeśli tak:

f(a,n)) po prostu przejdź do następnej liczby (a jest teraz tablicą.slice (1)) z nowym ciągiem (n)

przypisujemy wynik do T (temp) wyniku, ponieważ find zatrzymuje się, gdy znajdzie, a więc wiemy, że ostatnim wynikiem będzie f (), który jest wynikiem B

DanielIndie
źródło
1
t="",B=""do t="",B=turatuje bajt.
Kevin Cruijssen
@KevinCruijssen aktualizuje rozwiązanie, dzięki :) (i ty do Arnaulda)
DanielIndie
@Arnauld Podjąłem twój genialny pomysł i zrobiłem coś podobnego. spójrz teraz na rozwiązanie
DanielIndie
@Arnauld czysta awesomeness
DanielIndie
1
Chłodny! Ogolmy jeszcze 2 bajty (i nie trzeba trim()już).
Arnauld,
3

Perl 5 -alp , 55 bajtów

Używa %xszesnastkowego, %ddziesiętnego, %oósemkowego i %bbinarnego

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

Wypróbuj online!

Ton Hospel
źródło
3

Rubin, 72 71 bajtów

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

Format wyjściowy to pewnego rodzaju potworność odwrotnego wyrażenia S:

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

Zamiast tego oddzielenie ukośnika kosztowałoby 3 bajty więcej (dodawanie *?/).

Ten format pochodzi ze struktury pętli, nieco krótszej niż bardziej idiomatyczna repeated_combination(a.size), która generuje tablicę tablic znaków, a następnie redukuje ją w stosunku do funkcji cross-product.

Edycja: Zapisano 1 bajt dzięki Lynn.

histocrat
źródło
2

Pyth, 21 20 bajtów

f{Is.bjYNTQ^[8T2y8)l

Zwraca listę wszystkich możliwych list baz (która zawsze ma długość 1).
Wypróbuj tutaj

Wyjaśnienie

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.

źródło
2

Galaretka , 17 16 bajtów

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

Wypróbuj online!

Zwróć listę zasad.

 == Wyjaśnienie ==
⁴⁽% ʠḃṗL³bF⁼Q $ ƲÐf Główny link.
 ⁽% ʠ Liczba.
    ḃ przekształć go w bazę bijective ...
⁴ 16. Wynikiem jest [2,8,10,16].
     ṗL Moc kartezjańska według długości wejściowej.
             Filterf Filtruj, zachowaj te, które spełniają ...
       ³ wejście
        b przekonwertować na tę bazę
         F po spłaszczeniu (dołącz wszystkie cyfry \
                      różne liczby razem)
          ⁼Q $ równa się jednoznacznie.
użytkownik202729
źródło
2

Python 2 , 128 bajtów

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

Wypróbuj online!

Lynn
źródło
2

05AB1E , 17 bajtów

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

Wypróbuj online!

Kaldo
źródło
Nie znam 05AB1E, więc może powinienem poczekać, aż dodasz wyjaśnienie, zanim o to zapytam, ale dlaczego wynik dla 8postaci '8'i pozostałych trzech jest liczbą całkowitą? Wygląda jednak na to, że +1 działa dobrze, włączając w to ostatnie testy.
Kevin Cruijssen
2
@KevinCruijssen Pochodzi z „2žv8T”. Liczby w kodzie źródłowym są wypychane jako znaki w 05AB1E, natomiast žv (16) i T (10) są wbudowanymi, które wypychają ich odpowiednie liczby na stos. Zwykle pozostaje to niezauważone, ponieważ niejawne wyświetlanie ostatniego elementu na stosie przez 05AB1E jest konwertowane na liczby, ale ponieważ w tym przypadku wyświetlany wynik jest tablicą elementów, elementy te pozostają nietknięte, stąd cytaty. Polecenia ï można na przykład użyć po), aby rzutować dwa elementy char na ints.
Kaldo
@KevinCruijssen Przykład mojego wyjaśnienia: tio.run/##MzBNTDJM/f/fyPbQDtv//wE Kod: push 2, print, wrap to a array, print.
Kaldo
2

Python 2 , 121 117 113 111 bajtów

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

Wypróbuj online!

Czubek kapelusza Lynn dla format, których zapomniałem!

Chas Brown
źródło
1

Łuska , 19 bajtów

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

Wypróbuj online!

Zwraca listy baz

Wyjaśnienie

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
źródło