CUDDLE hesaplama


19

Göre sayı 69 Wikipedia sayfasında , söz konusu notun olduğu 69 2 = 4761 ve 69 3 = 328.509 hep birlikte ondalık basamak kullanın. 69 sayısı aslında bu özelliği karşılayan en düşük sayıdır.

Benzer bir nedenle, 32.043 dikkat çekicidir: 32.043 2 = 1.026.753.849 tüm ondalık basamakları kullanır.

Bu şekilde ilginç sayılar hakkında konuşmaya devam edersek, biraz gösterime ihtiyacımız olacak.

En tamsayıları için n , güçler n 2 , ..., n k yeterince büyük değerleri için bir kez en az (lider sıfır hariç) tüm on ondalık basamak kullanacak k . Varsa, biz en düşük tür arayacağım k kucaklaşmak ( kümülatif Ondalık Rakamlar, Az Üs ait) n .

Görev

Giriş olarak tek bir negatif olmayan tamsayıyı n kabul eden ve onun CUDDLE değerini hesaplayan ve döndüren bir program veya işlev yazın .

Eğer n bir yok sarılıp , sonunda kodunuzu alıkoymalarla sürece, bir hata veya boş bir dize içeren bir şey ama pozitif bir tamsayı, döndürebilir.

Test senaryoları

Sol sütun girilir, sağ sütun girilir.

0 
1 
2          15
3          10
4          10
5          11
6          12
7           7
8           5
9           6
10 
11          7
12          6
13          6
14          7
15          9
16          5
17          7
18          4
19          5
20         15
26          8
60         12
69          3
128         3
150         9
200        15
32043       2
1234567890  3

Ek kurallar

  • Kodunuz 255'e kadar tüm girişler için çalışmalıdır .

    Bunun oldukça büyük rakamlarla uğraşmayı içerdiğini unutmayın. 20 15 zaten 2 64'ten daha büyük .

  • Sonucu yazdırırsanız, ardından bir satır besleme gelebilir.

  • Standart kuralları geçerlidir.


14
CUDDLE'dan 69'a nasıl gittiğimizi merak ediyordum ve güçle ilgili olması biraz rahatsız edici;)
Aaron

Numarada CUDDLE yoksa, program durursa ... sorun olmaz mı? (örn. tamsayı sayacı taştığında)
Kapı tokmağı

Ayrıca, ilk ek kural için: anlamına mı geliyor bu senin dilin tamsayı tipi eğer olabilir numaralar> 255, kodunuz saklamak zorunluluk onlar için çalışma?
Kapı Tokmağı

@Doorknob Sonunda gerçekten durduğu sürece iyi. Girişe 255 üst limit koydum. Yine de hesaplamalarda bazı oldukça büyük sayılar var ...
Dennis

1
Test senaryosunu ekledim, 26->8çünkü kodumda yaptığım n^1yanlış yanıtı (of 6) yanlış yanıtı veren en küçük örnek .
xnor

Yanıtlar:


4

Pyth, 16 bayt

hf<9l{=+k^QTtS15

Çevrimiçi deneyin: Gösteri veya Test Paketi

Diğer çözümler gibi, 15'i üst limit olarak kullanıyorum. Bunun aynı zamanda maksimum KÜTÜPHANE olduğuna inanıyorum . 10.000.000'a kadar tüm sayıları test ettim ve CUDDLE değeri 15'ten büyük olan bir sayı yok .

CUDDLE > = 10 olan sayılar zaten oldukça nadirdir. CUDDLE değeri 15 olan tek sayılar sayılardır 2*10^k. CUDDLE değeri 14 veya 13 olan numaralar yoktur , CUDDLE 12 yalnızca sayılar için 6*10^k, CUDDLE 11 yalnızca içindir 5*10^k.

Bu yüzden bu kod herhangi bir doğal sayı için mükemmel çalışıyor düşünüyorum.

Çözüm yoksa bir hata mesajı yazdırır.

Açıklama:

hf<9l{=+k^QTtS15   implicit: Q = input number
                             k = empty string
            tS15   the list [2, 3, 4, ..., 15]
 f                 filter this list for elements T, which satisfy:
         ^QT          compute Q^T
       +k             k + ^ (converts to string implicitly)
      = k             save the result in k
    l{  k             length of set of k (number of different chars)
  <9                  test if 9 is smaller than ^
h                  print the first number in the filtered list
                   (throws error if empty)

8

Python 2, 56

f=lambda n,i=2,s='L':len(set(s))>10or-~f(n,i+1,s+`n**i`)

Özyinelemeli bir çözüm. Üstellerini kadar sayar ibaşlayarak 2ve yetkilerinin hanesini biriken n**idizeye s. Ne zaman son haneye sahip, döndürür True, eşittir 1, aksi takdirde recurses ve ekler 1. Bu döndüğünden daha kısa çıktı i.

CUDDLE içermeyen bir sayıdaki işlevin çağrılması ile sona erer Internal error: RangeError: Maximum call stack size exceeded. Bu sayıya kadar olan sayılar 255hiçbir zaman 15'ten fazla yinelemeye ihtiyaç duymaz.

Python 2'nin Lbüyük sayılara bir ekleme alışkanlığı nedeniyle , aslında rakam dizesini başlatıyoruz Lve ayarlanan boyutun en az 11 olup olmadığını kontrol ediyoruz str. Python 3.5 set açma ile 2 karakter daha kaydederek Python 2'ye göre bir karakter tasarrufu sağlar:

f=lambda n,i=2,s='':len({*s})>9or-~f(n,i+1,s+str(n**i))

4

Yakut, 67 65 karakter

->n{s='';[*2..99].index{|i|(s+="#{n**i}").chars.uniq.size==10}+2}

Tüm test senaryoları için neredeyse anında çalışır, hatta 255'ten fazla olanlar için.

CUDDLE içermeyen sayılar için hatalar.

Açıklama:

-> n {                         # define function with short lambda syntax
  s = ''                       # the string we are storing the numbers in
  [*2..99]                     # for all numbers from 2 to 99...
    .index {|i|                # find index of the number `i` for which...
      (s+="#{n**i}")           # after appending pow(n,i) to s...
        .chars.uniq.size==10}  # num of uniq chars in s is 10 (each digit)
  + 2                          # add 2, because our index starts from 2
}

3

CJam, 28 bayt

LliG,2>f#{s+_&_}%:,A#)_)s\g*

Çevrimiçi deneyin

Bu, CUDDLE'ın (varsa) giriş aralığı için asla 15'ten büyük olmadığı gerçeğine dayanır, ilk önce @xnor.

Muhtemelen çözüm bulunmayan dava için çıktı üretmenin daha iyi bir yolu vardır. Bir şey düşünürsem güncellenirim.

Açıklama:

L     Push empty string, will be used for accumulating digits.
li    Get input and convert to integer.
G,    Build list of exponents [0 .. 15].
2>    Slice off first two values, to produce [2 .. 15].
f#    Apply power operator with all exponents to input.
{     Start loop over powers.
  s     Convert to string. We care about the digits here.
  +     Concatenate with previously found digits.
  _&    Uniquify using set intersection of digit list with itself.
  _     Copy for continued accumulation in next loop iteration.
}%    End of loop over powers. We'll have an extra copy of the last value here,
      but it does no harm so we just keep it.
:,    Apply length operator to accumulated digit lists.
A#    Find 10 in the list. The search result will correspond to the first power
      that resulted in 10 different accumulated digits. If not found, the result
      will be -1. Note that 0 corresponds to power 2, since that was the first
      power we used. So we need to add 2 to get the result, and check for -1.
)     Increment value. 0 now corresponds to no solution.
_     Copy this value. Will be used as multiplier to create empty string if 0.
)     Increment again, to get the +2 needed for the result.
s     Convert to string.
\     Swap once-incremented value to top, which is 0 for no solution, non-zero
      otherwise.
g     Signum to get 0/1 for no solution vs. solution.
*     Multiply with result string, to get empty string for no solution.

2

Mathematica, 103 bayt

f=(d=DigitCount;x=1;y=d[0];For[n=0,!IntegerQ@Log10[#]&&MemberQ[y,0],++n,x*=#;y+=d[x]];Print[#,"\t",n])&

Görünüşe göre sadece 10'luk güçler KÜÇÜK'lere sahip olmayacak, bu yüzden atlanacaklar. İşlev, görünen basamakların bir listesini tutar ve içinde artık sıfır olmadığında durur.

Çıktı:

1    0
2    15
3    10
4    10
5    11
6    12
7    7
8    5
9    6
10    0
11    7
12    6
13    6

Eğlenceli bir gerçek: Uzun Olarak log_10(n)herhangi bir pozitif tam sayı göz önüne alındığında, akıldışıdır kvardır mböyle ondalık temsil olduğu n^mile başlar k. Bu, 10 (ve 0) 'ın güçlerini atlamanın iyi olduğu anlamına gelir :)
Sp3000

2

JavaScript (ES6) 188

53 bitlik tamsayılarla sınırlı bir dil için fena değil.

Aşağıdaki snippet'i ok işlevleri ve forma operatörü (AFAIK Firefox) dahil EcmaScripts 6'yı uygulayan bir tarayıcıda çalıştırmayı test edin

f=n=>{for(p=1,d=[],v=n=[...n+''].reverse();++p<20;){v.map((a,i)=>n.map((b,j)=>r[j+=i]=a*b+~~r[j]),r=[],c=0),r=r.map(r=>(r+=c,c=r/10|0,d[r%=10]=r));v=c?[...r,c]:r;if(d.join``[9])return p;}}

// Less golfed
U=n=>{
// Arbitrary precision multiplication
  M=(A,B,R=[],c=0)=>
  (
    A.map((a,i)=>B.map((b,j)=>R[j+=i]=a*b+~~R[j])),
    R=R.map(r=>(r+=c,c=r/10|0,r%10)),
    c?[...R,c]:R
  );
  v=n=[...n+''].reverse();
  for(p=1,d=[];++p<20;)
  {
    v=M(n,v)
    
    v.map(c=>d[c]=c)
    if (d.join``[9])return p
  }  
}

// TEST
for(i=o='';++i<300;)o+=i+' : '+f(i)+'\n'
O.innerHTML=o
  
  
<pre id=O></pre>


2

PowerShell, 94 bayt

param($n,$s='')
2..99|%{$s+=[bigint]::Pow($n,$_);if(($s-split''|sort -U).Count-eq11){$_;break}}

(As a single line)

Bu konuda çok zekice bir şey yok, ancak boru tesisatı , açıkça bir hashtable'a öğeler eklemeden sort -U[nique]Python'un set()bu tür kullanım için işlevselliğini sağlamanın düzgün bir yoludur .

param($n,$s='')                              # Take command line parameter.
2..99 |%{                                    # Loop from 2 to 99, inclusive.
    $s+=[bigint]::Pow($n,$_)                 # $n^Loopvar, concatenate to string.
    if (($s-split''|sort -U).Count-eq11) {   # Convert to unique-characters-array; count.
        $_;break                             # Print current loopvar and quit.
    }
}                                            # Otherwise, finish (silently).

Örneğin

PS C:\> .\CUDDLE-of-n.ps1 10

PS C:\> .\CUDDLE-of-n.ps1 12
6

PS C:\> .\CUDDLE-of-n.ps1 255
5

1

bayraklar için gawk 4, 73 + 5 = 78 bayt

{for(n=$0;a-1023&&++i<15;j=0)for($0*=n;j++<NF;)a=or(a,2^$j)}$0=i<15?++i:_

Her basamakta 0bis 9bu giriş güçlere ile karşılaştığında, bu temsil bitini ayarlar 2^digitiçinde ailk 10 basamak bulunan (kadar a == 1023 == 2^10-1) ya da daha fazla 15 iterasyon olmuş.

Boş bir alan ayırıcısı ve büyük sayılar için -M bayrağı ile çağrılmalıdır.

echo 17 | awk -M '{for(n=$0;a-1023&&++i<15;j=0)for($0*=n;j++<NF;)a=or(a,2^$j)}$0=i<15?++i:_' FS=

Bununla uğraşırken farklı CUDDLE'lar için aşağıdaki dizileri buldum:

1 68781 69513 71433 72621 75759 76047 76182 77346 78072 78453 80361 80445 81222 81945 83919 84648 85353 85743 85803 86073 87639 88623 89079 89145 89355 89523 90144 90153 90198 91209 9.99 9.99 9.99 9.99 9.99 990
3: 69128203302327366398467 542 591 593 598 633 643 669 690747759903 923 943 1016 1018 1027 1028 1043 1012 1112 1182 1194 1199 1233 1278 1280 1282 1328 1336 1364 1396 1419 1459 1463 1467 1472 1475 1484 1499 1499 1450 1509 1519 1563 1569 1599 1602 1603 1618 1631 1633 1634 1659 1669 1687 1701 1712 1721 1737 1746 1767 1774 1778 1780 1791 1804 1837 1844 1869 1889 1895 1899 1903 1919 1921 1936 1956 1958 1960 1962 1973 1984 1985 1991 1994 1996 2003 2017 2019 2030 2033 2053 2075 2123 2126 2134 2157 2158 2159 2168 2175 2183
4: 18 54 59 67 71 84 93 95 97108 1151151391441441441441541541561561541541541541717181718181818184184184192142 21421521522222223 227228222234234242242248266 266267 270272273279281285287 294 298 299 29630131231531632332632933233333342323335335343563612363364363683693793883913393963937403 41241343414416394234 426 4313434394444444444448451 452 453 454 455 4574594639466 46947547 477 479482448484848489494349496503507508509515517523
5: 8 16 19 27 28 38 44 47 55 57 61 77 79 80 82 83 86 87 91 92 103 106 113 116 117 118 121 1231251212121123133361401401421421421414143142152151515152161616166166 17317517718318618618181891901919191919191919198206207 218224226229 2302312362402432462492532552572582592611263 268269271 275276277278 280282283284286288289 292 2933043093223283313333434344345 346 347 348 349352357359367371 3723733743775380381338438738940240740840941141741842224
6: 9 12 13 22 23 24 33 36 37 39 42 43 45 46 49 51 53 58 62 66 72 73 75 78 81 88 90 94 98105107109111111111111121212120130130133134134153153153163163163163 168 170194194194192122122729222222523322323238384247252254256262264274291 295 296301308 317 319 321324325 330333333337351355358 360 370376378382383385393839393939 401404405406 415 4204144144254394304304334 434 438 446 450460472746 478488490498502504506 5105135145195305394485566 5786206286 6346436
7: 7 11 14 17 29 31 32 35 41 48 52 56 63 64 70 74 85 89 96 99 102 104 110 111 135 171 188 20120220520520525425251 290297303305307 310313318320335 350363392 410 465 475 480483485501 511 518 520525560 582 584 595 601 630 640 682 700736740 786 798 850890 952 956 965975 9829909991002 1005 1011 1020 1040 1054 1100 1110 1171 1219 1313 1331 1350 1379 1414 1447 1468 1601 1707 1710 1735 1748 2001 2010 2020 2050 2080 2450 2510 2534 2641 2745 2900 2914 2955 2970 3030 3050 3070 3100 3130 3136 3180 3193 3200
8: 21 25 26 30 34 65 76124209 210 250 260 300 340505 650 1004 1240 2002 2090 2100 2500 2600 2975 3000 3400 3944 4376 5050 6500 6885 7399 10040 12400 15483 20002 20020 20900 21000 25000 26000 29750 30000 34000 43760 50500 65000 68850 73990 
9: 15 681011015011010 1500 10001 10010 10100 15000 
10: 3 4 40400 4000 40000 
11: 5 50500 5000 50000 
12: 6 60600 6000 60000 
15: 2 20200 2000 20000
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.