Uproszczenie liczb


16

Jak nie pamiętasz 6 lub 7-cyfrowego numeru telefonu, który pojawił się na ekranie telewizora przez sekundę ?! Korzystając ze specjalnej techniki opisanej poniżej, zmienisz się w chodzącą książkę telefoniczną!

Oczywiście liczba 402jest łatwiejsza do zapamiętania niż liczba 110010010, a liczba 337377łatwiejsza do zapamiętania niż liczba 957472. Oznacza to, że zapamiętany numer z jednej strony powinien zawierać jak najmniej cyfr, a z drugiej strony pożądane jest, aby liczba zawierała jak najwięcej powtarzających się liczb.

Jako kryterium trudności w zapamiętywaniu bierzemy sumę liczby cyfr w liczbie i liczby różnych cyfr w liczbie. Zapamiętany numer można zapisać w innym systemie liczbowym, być może wtedy łatwiej będzie go zapamiętać. Na przykład 65535wygląda liczba w zapisie szesnastkowym FFFF.

Zadanie

Musisz napisać program do wybierania podstawy systemu liczb, aby zminimalizować kryterium złożoności. Podstawa systemu liczbowego musi być wybrana w zakresie od 2 do 36, następnie liczby 0-9i litery angielskie A-Zmogą być użyte do przedstawienia liczby.

Wejście

Dane wejściowe zawierają dziesiętną liczbę całkowitą od 1 do 999999999.

Wynik

Dane wyjściowe muszą zawierać podstawę układu liczbowego (od 2 do 36), minimalizując kryterium złożoności zapamiętywania, oraz liczbę w wybranym systemie liczbowym, oddzielone jedną spacją. Jeśli kilka zasad daje tę samą wartość kryterium, wybierz najmniejszą z nich.

Notatki

  • Litery muszą być wielkie ( A-Z).

Przypadki testowe

Wejście wyjście

1              2 1

2              3 2

65535       16 FFFF

123          12 A3


16
Wielkie wyzwanie, ale potrzebuje więcej przypadków testowych.
Grimmy,

7
Również format wyjściowy jest nieco zbyt ścisły, możesz chcieć np. Zezwolić na tablicę dwóch elementów, podstawy i łańcucha, lub pozwolić na odwrotną kolejność lub oddzielenie innym znakiem. Zakładam również, że dodajesz sumę cyfr do liczby cyfr, ale możesz to wyjaśnić.
Erik the Outgolfer,

8
Czy mogę użyć a-zzamiast A-Z?
Neil,

5
Czy możemy po prostu użyć odpowiednich liczb zamiast A-Z?
flawr

8
@ VerNick Następnym razem, gdy napiszesz podobne wyzwanie, sugerowałbym zezwolenie na oba te żądania, ponieważ są to tylko niepotrzebne komplikacje, które są odradzane: patrz np . Tutaj .
flawr

Odpowiedzi:



5

Python 2 , 150 149 127 144 bajtów

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'

Wypróbuj online!


Python 3 , 136 bajtów

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

Wypróbuj online!


Python 3.8 (wersja wstępna) , 131 bajtów

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

Wypróbuj online!


c konwertuje liczbę podstawową 10 na dowolną bazę (2-36), a pierwsza (anonimowa) funkcja znajduje najmniejszy wynik.


5

05AB1E , 16 14 bajtów

-1 bajt dzięki Kevin Cruijssen

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

Wypróbuj online!

Lub dodaj R) »na końcu, aby był zgodny z określonym formatem wyjściowym, ale większość innych odpowiedzi nie przeszkadzała.

Wyjaśnienie:

₆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 bajt przy użyciu ₆L©B®øzamiast₆LεBy‚}
Kevin Cruijssen

1
@KevinCruijssen Thanks! Kolejne -1 przy użyciu āwydaje się, że zawsze o tym zapominasz.
Grimmy,

Lol, rzeczywiście to pamiętam. Pamiętałem to dziś z tym wyzwaniem , ale nie pomogło w żaden sposób, haha ​​xD
Kevin Cruijssen

@recursive wydaje się, że nie czytałeś odpowiedzi. Łączę wersję zgodną ze ścisłymi wymaganiami wynikowymi i wyjaśniam, dlaczego nie uczyniłem jej główną wersją.
Grimmy,

@Grimy winny jak oskarżony. Przepraszam, że przeszkadzam.
rekurencyjny

4

JavaScript (ES6),  87 85  101 bajtów

Edycja: +16 bezużytecznych bajtów, aby zachować ścisły format wyjściowy

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)

Wypróbuj online!


Ach, tęskniłem za tą częścią
TFeld

4

Japt v2.0a0 -gS, 24 23 bajty

Nie ładnie, ale to działa. +2 bajty dla całkowicie niepotrzebnego wymogu, aby dane wyjściowe były pisane wielkimi literami.

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

Spróbuj

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

Tak, działa dobrze, ale litery muszą być wielkie.
Ver Nick mówi Przywróć Monikę

1
@ VerNick, dlaczego? To absolutnie nic nie dodaje do wyzwania.
Shaggy

... Myślę, że następną rzeczą będzie „oddzielone jedną spacją”. Wygląda na to, że format wyjściowy został bardzo rygorystyczny w stosunku do tego wyzwania, a na podstawie komentarzy nie wygląda na to, aby się zmienił.
Jonathan Allan,

@JonathanAllan, na szczęście mogę to naprawić za pomocą zmiany flagi.
Shaggy

3

PHP ,124 119 bajtów

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

Wypróbuj online!

Wstyd z powodu +12 bajtów w PHP, aby wielkie litery wyjściowe ... ale ... tak czy inaczej.


3

Zsh , 85 bajtów

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

Dla tej liczby instrukcji wewnątrz pętli for użycie ...&&...&&...jest krótsze niż{...;...;...;} .

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)

Wypróbuj online!

Oto 81-bajtowe rozwiązanie, które [base]#[num]zamiast tego drukuje w formularzu :

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

Wypróbuj online!



2

Węgiel drzewny , 38 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Nθ

Wprowadź liczbę całkowitą.

≔EE³⁴↨θ⁺²ι

Konwertuj go z bazy 2 na bazę 36 ...

L⁺ιΦι⁼λ⌕ικη

... deduplikować, połączyć i wziąć na siebie.

≔⁺²⌕η⌊ηη

Weź indeks minimalnej złożoności i dodaj 2, aby uzyskać bazę.

Iη ↥⍘θη

Wydrukuj bazę i liczbę całkowitą przekonwertowaną na tę bazę dużymi literami.



2

Galaretka , 25 bajtów

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

Wypróbuj online!

Monadyczny link przyjmujący za argument liczbę całkowitą i zwracający ciąg galaretki o pożądanym formacie. Jeśli dwupunktowa lista jest akceptowalnym wyjściem (jak na większość wyzwań), może zaoszczędzić 2 bajty. Gdyby podstawa 1 była akceptowalna dla przypadku zbocza 1 jako dane wejściowe, mogłaby zaoszczędzić kolejne 2 bajty.



1

Perl 5 , 161 bajtów

sub f{$X=99;for$b(2..36){$_=c($_[0],$b);$x=uniq(/./g)+y///c;($X,$B,$C)=($x,$b,$_)if$x<$X}$B,$C}
sub c{my($n,$b)=@_;$n?c(int$n/$b,$b).chr(48+$n%$b+7*($n%$b>9)):''}

Wypróbuj online!



1

Perl 5 -Minteger -MList::Util=uniq,first -ap , 123 112 bajtów

$"=$,;map{@r=();$t="@F";do{unshift@r,(0..9,A..Z)[$t%$_]}while$t/=$_;$a[@r+uniq@r]||="$_ @r"}2..36;$_=first{$_}@a

Wypróbuj online!


1

Wolfram Language (Mathematica) , 109 111 bajtów

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

+2: naprawiono. Dzięki za złapanie @Roman

OrderingBy został wprowadzony w Mathematica 12.0, do którego TIO nie wydaje się jeszcze zaktualizowane.


„Jeśli kilka zasad podaje tę samą wartość dla kryterium, wybierz najmniejszą z nich.”: OrderingByNie spełnia tego wymagania.
Rzym,

Może coś z tym MinimalBy, tak ?
Rzym.

@Roman, prawda? O ile mogę powiedzieć, zachowuje względną kolejność dwóch indeksów, które mają tę samą wartość ..
attinat

2
Z argumentem 123rozwiązanie drukuje się 36 3Fzamiast wymaganego 12 A3. Od OrderingBy[123~IntegerDigits~Range@36, Tr[1^#] + Tr[1^Union@#] &]I uzyskać odpowiedź {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}, tak jak zwykle założenie bez ponownego zamawiania równoważnych wpisów wydaje się być ignorowane tutaj. My $Versionto „12.0.0 dla Mac OS X x86 (64-bit) (7 kwietnia 2019)”.
Rzym.

Ach, masz rację. Moje złe, że tego nie zauważyłem.
attinat

1

C (brzęk) , 165 bajtów

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,_);}

Wypróbuj online!

n // wejście

, i = 2 // iterator od podstawy 2 do 36

, j // aktualna złożoność

, p = 99 // najlepsza złożoność

, r // wynik = iterator

, m // temp kopia n

, x; // m% i

char * g // aktualny ciąg ptr

, * _ // best str ptr

, b [74] [37]; // bufor

/ * [37 + 37] = [uzyskane ciągi znaków + test na użyte znaki] * /

t (n) {

for (; g = b [i], // move ptr

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

   ++i){//for every base

dla (j = 0, m = n; m; m / = i, // wyodrębnij cyfrę

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

j + = b [i + 36] [x = m% i] ++? 1: 2; // bajt przyrostowy względem znaku

// a jeśli było 0 przyrostów o 2: 1 dla nowego użytego znaku i 1 dla liczby cyfr

// else wprowadź tylko cyfry + przesuń wskaźnik

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

// printf ("r% ip% ij% i \ n", r, p, j); // test

}

printf ("% i,% s", r, _); // wyjście

}


1
163 bajty można wywołać więcej niż jeden raz.
ceilingcat

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.