Sayıların sadeleştirilmesi


16

TV ekranında bir saniyeliğine görünen 6 veya 7 haneli telefon numarasını nasıl hatırlayamıyorsunuz ?! Aşağıda açıklanan özel tekniği kullanarak, yürüyen bir telefon defterine dönüşeceksiniz!

Açıkçası, sayıyı 402hatırlamak 110010010sayıdan 337377daha kolaydır ve sayı hatırlamak sayıdan daha kolaydır 957472. Bu, ezberlenen sayının bir yandan mümkün olduğunca az basamak içermesi ve diğer yandan sayının mümkün olduğunca çok sayıda yinelenen sayı içermesi anlamına gelir.

Hatırlamanın zorluğu için bir kriter olarak, sayıdaki rakam sayısının ve sayıdaki farklı rakamların toplamını alırız. Ezberlenmiş bir sayı başka bir sayı sistemine yazılabilir, belki o zaman hatırlanması daha kolay olacaktır. Örneğin 65535, onaltılık gösterimdeki sayı benzer FFFF.

Görev

Karmaşıklık ölçütünü en aza indirmek için sayı sisteminin tabanını seçmek için bir program yazmanız gerekir. Sayı sisteminin tabanı 2 ila 36 arasında seçilmelidir, daha sonra sayılar 0-9ve İngilizce harfler A-Zsayıyı temsil etmek için kullanılabilir.

Giriş

Giriş, 1 ile 999999999 arasında bir ondalık sayı içerir.

Çıktı

Çıktı, ezber karmaşıklığı kriterini en aza indiren sayı sisteminin tabanını (2'den 36'ya) ve seçilen sayı sistemindeki sayıyı bir boşlukla ayrılmış olarak içermelidir. Birkaç baz kriter için aynı değeri veriyorsa, aralarında en küçük olanı seçin.

notlar

  • Harfler büyük ( A-Z) olmalıdır .

Test Durumları

Giriş çıkış

1              2 1

2              3 2

65535       16 FFFF

123          12 A3


16
Büyük zorluk, ancak daha fazla test vakasına ihtiyacı var.
Grimmy

7
Ayrıca, çıktı biçimi biraz fazla katıdır, örneğin taban ve dize gibi iki öğeden oluşan bir diziye izin vermek veya ters sırada veya başka bir karakterle ayrılmış olarak izin vermek isteyebilirsiniz. Ayrıca, rakamların toplamını rakam sayısına eklediğinizi varsayıyorum, ancak bunu netleştirmek isteyebilirsiniz.
Outgolfer Erik

8
a-zBunun yerine kullanabilir miyim A-Z?
Neil

5
Bunun yerine karşılık gelen sayıları kullanabilir miyiz A-Z?
flawr

8
@VerNick Bir dahaki sefere benzer bir meydan okuma yazdığınızda, bu isteklerin her ikisine de izin vermenizi önermiyorum, çünkü bu sadece cesaret kırılmış gereksiz bir komplikasyondur: örneğin buraya bakınız .
flawr

Yanıtlar:



5

Piton 2 , 150 149 127 144 bayt

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'

Çevrimiçi deneyin!


Python 3 , 136 bayt

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

Çevrimiçi deneyin!


Python 3.8 (ön sürüm) , 131 bayt

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

Çevrimiçi deneyin!


c bir taban 10 sayısını herhangi bir tabana (2-36) dönüştürür ve ilk (anonim) işlevi en küçük sonucu bulur.


5

05AB1E , 16 14 bayt

Kevin Cruijssen sayesinde -1 bayt

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

Çevrimiçi deneyin!

Veya sonuna R) »ekleyin belirtilen çıktı biçimine tam olarak uyması , ancak diğer yanıtların çoğu rahatsız olmadı.

Açıklama:

₆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 bayt ₆L©B®øyerine kullanarak₆LεBy‚}
Kevin Cruijssen

1
@KevinCruijssen Teşekkürler! Kullanarak başka bir -1 ā, her zaman bunu unutmuş gibi görünüyor.
Grimmy

Lol, gerçekten yapıyorum .. Bugün bu meydan okuma ile hatırladım , herhangi bir şekilde yardımcı olduğunu değil, haha ​​xD
Kevin Cruijssen

@recursive cevabı okumuş görünmüyorsunuz. Sıkı çıktı gereksinimlerine uygun bir sürümü bağlarım ve neden ana sürümü yapmadığımı açıklarım.
Grimmy

@ Ücretli olarak suçlu. Sizi rahatsız ettiğimiz için özür dileriz.
özyinelemeli

4

JavaScript (ES6),  87  85101 bayt

Düzenleme: Katı çıktı biçimine uymak için +16 yararsız bayt

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)

Çevrimiçi deneyin!


Ah, o kısmı kaçırdım
TFeld

4

Japt v2.0a0 -gS, 24 23 bayt

Güzel değil, ama işi yapıyor. Çıktı büyük harf olan tamamen gereksiz gereksinim için +2 bayt.

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

Dene

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

Evet, iyi çalışıyor, ancak harfler büyük olmalıdır.
Ver Nick, Reinstate Monica'ya

1
@VerNick, neden? Bu meydan okumaya kesinlikle hiçbir şey katmıyor.
Shaggy

... sanırım bir sonraki şey "bir boşlukla ayrılmış" olacak. Çıktı biçimi bu meydan okuma üzerinde çok sıkı yapılmış gibi görünüyor ve yorumlardan değişecek gibi görünmüyor.
Jonathan Allan

@JonathanAllan, neyse ki ben bir bayrak değişikliği ile "düzeltebilirim".
Shaggy

3

PHP ,124 119 bayt

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

Çevrimiçi deneyin!

Çıktıyı büyük tutmak için PHP'deki +12 bayt hakkında bir utanç ... ama ... neyse.


3

Zsh , 85 bayt

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

For döngüsü içindeki bu ifade sayısı için, kullanım ...&&...&&...değeri daha kısadır {...;...;...;}.

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)

Çevrimiçi deneyin!

[base]#[num]Bunun yerine , formda yazdırılan 81 baytlık bir çözüm aşağıdadır:

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

Çevrimiçi deneyin!



2

Kömür , 38 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

Nθ

Tamsayıyı girin.

≔EE³⁴↨θ⁺²ι

Taban 2'den taban 36'ya dönüştürün ...

L⁺ιΦι⁼λ⌕ικη

... tekilleştirin, birleştirin ve uzunluğunu alın.

≔⁺²⌕η⌊ηη

Minimum karmaşıklık endeksini alın ve tabanı almak için 2 ekleyin.

Iη ↥⍘θη

Tabanı ve bu tabana dönüştürülen tamsayıyı büyük harflerle yazdırın.



2

Jöle , 25 bayt

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

Çevrimiçi deneyin!

Argüman olarak bir tamsayıyı alan ve istenen formatta bir Jelly dizesi döndüren monadik bir bağlantı. İki öğeli bir liste kabul edilebilir çıktıysa (çoğu zorluğa göre), 2 bayt tasarruf edebilir. Taban 1, giriş olarak 1 kenar durumu için kabul edilebilirse, 2 bayt daha tasarruf edebilir.



1

Perl 5 , 161 bayt

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)):''}

Çevrimiçi deneyin!



1

Perl 5 -Minteger -MList::Util=uniq,first -ap , 123111 bayt

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

Çevrimiçi deneyin!


1

Wolfram Dili (Mathematica) , 109111 bayt

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

+2: sabit. @Roman yakalamak için teşekkürler

OrderingBy TIO henüz güncellenmemiş gibi görünen Mathematica 12.0'da tanıtıldı.


"Birkaç baz kriter için aynı değeri veriyorsa, aralarından en küçük olanı seçin.": OrderingByBu gereksinime uymuyor.
Roman

Belki böyle bir şey MinimalBy, böyle ?
Roma

@ Roman değil mi?
Anlayabildiğim kadarıyla

2
Argüman ile 123çözümünüz 36 3Fgerekli yerine yazdırılır 12 A3. Gönderen OrderingBy[123~IntegerDigits~Range@36, Tr[1^#] + Tr[1^Union@#] &]ben cevap almak {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}, böylece hiçbir yeniden sipariş eşdeğer girişlerin normalden varsayım burada göz ardı görünüyor. My $Version"Mac OS X x86 (64 bit) için 12.0.0 (7 Nisan 2019)".
Roman

Ah, haklısın. Bunu farketmediğim için kötüyüm.
attinat

1

C (clang) , 165 bayt

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

Çevrimiçi deneyin!

n // girdi

, i = 2 // taban 2'den 36'ya yineleyici

, j // mevcut karmaşıklık

, p = 99 // en iyi karmaşıklık

, r // sonuç = yineleyici

, m // n'nin geçici kopyası

, x; // m% i

char * g // geçerli dize ptr

, * _ // en iyi str ptr

B [74] [37]; // tampon

/ * [37 + 37] = [elde edilen dizeler + kullanılmış karakterler için test] * /

T (n) {

(; g = b [i], // ptr taşı

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

   ++i){//for every base

için (j = 0, m = n; m; m / = i, // rakamı çıkar

   *--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; // karaktere göre baytı artır

// ve 0 ise, kullanılan yeni karakter için j'yi 2: 1 ve basamak sayısı için 1 artırırsa

// başka artım yalnızca rakam sayısı + hareket işaretçisini

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

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

}

Printf ( "% ı,% s", r, _); // çıkış

}


1
163 bayt birden fazla kez çağrılabilir.
ceilingcat

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.