Sayıyı, temsilinin en fazla “4” sn olduğu bir tabana dönüştürün


30

Esinlenen bu . Tamsayı, dize veya rakam dizisi (sizin seçiminiz) olarak verilen bir sayı vardır. Sayının gösteriminin en çok "4" sn sahip olacağı tabanı bulun ve bu tabanı döndürün.

Sayı Sonucu
624 5
444 10
 68 16

kısıtlamalar:

  • Dönen taban girişten büyük olmamalıdır.
  • abs (4) ' e eşit veya daha küçük sayılar geçerli girdi olarak kabul edilmemelidir, bu nedenle tanımsız getiriler kabul edilebilir

Bu, kod golf veya kod mücadelesi olabilir . İhtiyaçları, kazanma kriterlerini detaylandırabilir, belki bir veya daha fazla girdi ve istenen çıktı örneği verebilir misiniz?
codeporn

Kabul edilebilir en yüksek baz nedir?
Steven Rumbalski


2
@SeanCheshire: Numarayı gerçekten görüntülemek zorunda değilsiniz. Herhangi bir kaidedeki bir [1,15,3,64,43]sayıyı, kaide içindeki bazı sayılar gibi, bir dizi olarak kolayca temsil edebilirsiniz 80. Yalnızca temel numarayı yazdırıyorsunuzdur, böylece her bir kaideyi teknik olarak test 2edebilirsiniz n.
mellamokb

1
Ne için doğru cevaptır 1, 2ve 3aynı sayıda olan "4" Her tabanında s (0)? Ayrıca, birçok sayı, birçok 4bazda aynı sayıdaki "4" lere sahiptir (örneğin, herhangi bir bazda> 5, 44herhangi bir bazda> 45, 14baz 9'da veya herhangi bir bazda> 15, vb.). Doğru cevap, en fazla "4" s sayısına sahip en küçük taban mı olmalı?
mellamokb

Yanıtlar:


24

APL ( 31 19)

Şimdi tüm olası tabanları test ediyor.

⊃⍒{+/4=K⊤⍨K⍴⍵}¨⍳K←⎕

Açıklama:

  • ⍳K←⎕: kullanıcı girişini oku, K'da kaydet. Denenecek baz olan 1'den K'ya bir liste yap.
  • {... : bunların her biri için aşağıdaki işlevi çalıştırın
  • K⊤⍨K⍴⍵: K'yi kodlayın, bu kaide kodlayın, her kaide bir rakam (sayı olarak) listesi verin. K rakamlarını kullanın (çok fazla abartılmış, ancak önemli değil çünkü kullanılmayanların hepsi sıfır olacaktır).
  • 4=: hangisinin 4'e eşit olduğunu görün
  • +/: Bunları toplayın, şimdi baz başına kaç tane dörde biliyoruz
  • ⊃⍒: eğer listenin indekslerini aşağı doğru sıraladıysanız verin, yani en büyüğünün indeksi ön tarafta. Bu listenin ilk maddesini al.

2
APL çözümlerinizi çok seviyorum.
MrZander

25
Komik, bu APL ifadesinin çoğu insanın okurken verdiği ifadeyi içermesi:
epidemian

5

GolfScript, 30 karakter

.,{[2+.2$\base{4=},,\]}%$)~p];

Herhangi bir taban için çalışıyor - kodu çevrimiçi olarak test edin .

Yorum: Bu çözüm, sorunun orijinal sürümüne dayanıyordu. Böylece girdiden daha büyük bir taban döndürebilir, örneğin girdi 4 için doğru yeni taban kurallarıyla artık geçerli olmayan taban 5'i döndürür.


5

GolfScript (23 karakter)

~:^,2>{^\base[4]/,~}$0=

veya

~:^,2>{^\base[4]/,}$-1=

veya

~:^,2>{^\base[4]/,}$)\;

Bunun stdin'den girdi aldığına dikkat edin: Howard'ın GolfScript sürümüyle adil bir karşılaştırma yapmak için bir karakter çıkarın.


Howard kuralların değiştiğini ve 4geçerli bir çıktı (4'ten büyük herhangi bir tam sayı) olduğunda olası bir girdi olarak dışladıklarının çok mantıklı olmadığını belirtiyor . Bu davayı ele almak için, her türlü şekilde eklenebilen 2 karakter daha gerekir:

~:^)),2>{^\base[4]/,}$)\;

veya

~:^,{))^\base[4]/,}$)))\;

bariz olanlardan bir çift olmak.


Güzel. Ancak "4" girişi için yanlış cevap veriyor.
Howard,

Sadece kuralları tamamen değiştirdiklerini ve gönderimimi yaptıktan sonra özel durumları kaldırdıklarını gördüm. Böylece çözümünüz yeni kurallara uygundur.
Howard,

@Hardard, kurallar, bu davanın ele alınması gerekmediğini söyleyebilir, ancak bütünlük için bazı değişkenler ekleyeceğim.
Peter Taylor

Yine de, bir kereden fazla +1 yapamam ;-)
Howard,

@Howard, eğer gerçekten istersen bir lütuf ekleyebilirsin;)
Peter Taylor

4

Python 2.x, 77 karakter

F=lambda x:max((sum(x/b**d%b==4for d in range(99)),b)for b in range(5,99))[1]

98 tabanına kadar çalışır ve en fazla 98 rakam uzunluğundadır.


4

J, 38 karakter

f=.[:(i.>./)[:+/[:|:4=(10#"0(i.37))#:]

Kullanımı:

   p 624
5
   p 444
10
   p 68
16

4

VBA, 121

Function k(a)
For w=5 To a
Z=0:q=a:Do:c=q Mod w:Z=Z-(c=4):q=Int(q/w):Loop Until q=0
If Z>x Then x=Z:k=w
Next
End Function

kullanımı:

  • doğrudan pencere: ?k(num)
  • Excel formülü: =k(A1)

tüm üsler için sabitlendi ve testi 4'lü
düşürdü

FWIW, bir alanı kaldırabilirsiniz:For w=5To a
Mühendis Toast

3

Mathematica 59

kod

Sort[{Count[IntegerDigits[n, #], 4], #} & /@ Range[5, 36]][[-1, 2]]

Yukarıdaki işleve bir ad verelim.

whichBase[n_] := Sort[{Count[IntegerDigits[n, #], 4], #} & /@ Range[2, 36]][[-1, 2]]

açıklama

  1. Count[IntegerDigits[n,k],4]: Temel olarak ayak sayısını k temsili n .
  2. Sort en azdan en çok 4'e kadar olan bazlar.
  3. Listedeki son maddeden, yani en fazla 4'lü gösterime sahip olan bazdan tabanı döndür.

Bazı özel numaralar

Şimdi hangi temelini aşağıdaki özel numaralara uygulayalım.

numbers= {1953124, 8062156, 26902404, 76695844, 193710244, 444444444, 
943179076, 1876283764, 3534833124, 6357245164, 10983816964, 
18325193796, 29646969124, 46672774204, 71708377284, 107789473684, 
158856009316, 229956041484, 327482302084, 459444789604, 635782877604, 
868720588636, 1173168843844, 1567178659764, 2072449425124, 
2714896551724, 3525282954756, 4539918979204, 5801435550244, 
7359635486844, 9272428079044, 11606852190676}

{5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}

Her sayıyı karşılık gelen tabana dönüştürürseniz, onlar için özel olanı görürsünüz.


nOrada kullanmak istiyorsanız tam bir fonksiyon tanımı için 7 bayt eklemek zorunda kalacağınızı düşünüyorum . Ayrıca, MaximalBygerçekten yardımcı olur, 49 bayta düşürür: MaximalBy[Range[a=#],a~IntegerDigits~#~Count~4&]&(yalnızca base-1'i kullanmaya çalıştığındaki mesajları yoksay)
LegionMammal978

Ayrıca, mevcut olan n = 152 ile
başlayamaz

Her ne kadar kodunuz çalışıyor olsa da, hangi bazların kullanılacağını nasıl bildiğini anlamıyorum. 2'den 36'ya (ya da 1'den 36'ya kadar) üsleri incelemenin söylenmesi gerekmez mi?
DavidC

Taban 36 sorunun belirtilen asla ve en neden seninkini için başarısız olduğunu iddia n = 152 = 4 · 37 + 4. Kodum çekleri tüm 1'den bazlar n üsleri beri, n ileriye + 1 ve tek tek içerecektir basamaklı n .
LegionMammal978

Net bir açıklama için teşekkürler.
DavidC

3

Japt -h, 10 bayt

444tabanında 10bir [4,4,4]dizi ihtiva eden ve basamak 43 kez, ancak 444tabanında 100olduğu [4,44]da hane içeren 4ama sadece bir kez bir sayı olarak, 3 kez. 444Test senaryosunun meydan okumasında beklenen çıktı göz önüne alındığında, 4 sayısını saymamız gerektiğini tahmin ediyorum:

õ ñ@ìX è¥4

Dene

Ama eğer edilmektedir ardından haneyi 4 sayma:

õ ñ@ìX ¬è4

Dene

õ              :Range [1,...,input]
  ñ@           :Sort by passing each X through a function
    ìX         :  Convert the input to a base X digit array
               :(VERSION 1)
       è       :  Count the elements
        ¥4     :    Equal to 4
               :(VERSION 2)
       ¬       :  Join to a string
        è4     :  Count the occurrences of "4"
               :Implicitly output the last element in the sorted array

2

C - (114 karakter)

Hepsinde golf zafer!

x,k,c,d,n;main(v){scanf("%d",&v);for(k=5;v/k;++k){x=v;c=0;while(x)c+=x%k==4,x/=k;c>=d?n=k,d=c:0;}printf("%d",n);}

Ve biraz ungolfed:

x,k,c,d,n; // declare a bunch of ints, initialized to 0
main(v){   // declare one more, without using an extra comma
    scanf("%d",&v); // get the input (v)
    for(k=5;v/k;++k){ // loop over each base (k) greater than or equal to (/)
                      // our input (v)
        x=v;          // temp value (x) set to input (v)
        c=0;          // number of 4s in the current base (c) re-initialized
        while(x)       // loop over our temp until it's used up
            c+=x%k==4, // if the next digit (x%k) is 4 (==4) increment the
                       // current count (c+=)
            x/=k;      // remove the current digit
        c>=d?n=k,d=c:0; // if the number of 4s in this base (c) is greater
                       // than the current maximum number of 4s (d), then
                       // save the new best base (n), and new maximum
                       // number of 4s
    }
    printf("%d",n);   // output the result
}

Sadece eğlence için işte sayılar için çıktı [0,127](bunlar giriş numarasının altındaki en büyük tabanlardır).

0, 0, 0, 0, 0, 5, 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 5, 21, 22, 23, 6, 25, 26, 27, 7, 29, 30, 31, 8, 33, 34, 35, 35, 9, 37, 38, 39, 10, 41, 42, 43, 11, 5'e ait. 46, 47, 12, 49, 50, 51, 13, 53, 54, 55, 14, 57, 58, 59, 15, 61, 62, 63, 16, 65, 66, 67, 17, 69, 5 sayılı belgelere sahiptir. 71, 18, 73, 74, 75, 19, 7, 78, 79, 20, 81, 82, 83, 21, 85, 86, 87, 22, 89, 90, 91, 23, 93, 94, 5 ... 24, 97, 98, 99, 25, 101, 102, 103, 26, 5, 106, 107, 27, 109, 5, 111, 28, 113, 114, 5, 29, 9, 5, 5, 5 ... 121, 122, 123


1
@AttilaO. Birinin dikkatini çekeceğini umuyordum :)
Gordon Bailey

2

R - 148 137 karakter

(yani, rekabetin geri kalanından çok uzak ama yine de)

f=function(n){s=sapply;which.max(s(lapply(strsplit(s(4:n,function(x){q=n;r="";while(q){r=paste(q%%x,r);q=q%/%x};r})," "),`==`,4),sum))+3}

Temel olarak girdiyi taban 10'dan 4'e n (tümü %%ve tamsayı bölme kullanarak) 'dan tüm üslere dönüştürün %/%ve en çok 4 olana sahip olanın dizinini seçin.

f(624)
[1] 5
f(444)
[1] 10

2

@ Marinus 'APL çözümünün J çevirisi:

NB. Expression form (22 characters, not including "n" - the "argument"):
{.\:(+/@(4=$#:[)"0 i.)n
NB. Function form (24 characters, not including "f=:"):
f=:{.@\:@(+/@(4=$#:[)"0 i.)

Sadece ilgi çekmek için işte bazı değerler:

(,.f"0)9+i.24
 9  5
10  6
11  7
12  8
13  9
14  5
15 11
16  6
17 13
18  7
19  5
20  5
21  5
22  5
23  5
24  5
25  6
26  6
27  6
28  6
29  5
30  7
31  7
32  7

En sert dönüşümü sağlayan en küçük tabanı üretir. Tablodaki son birkaç değer için, gösterimler “4n” gibi görünmektedir (örneğin, taban 7'deki 31, “43” dir).


2

Jöle , 6 bayt

bⱮċ€4M

Çevrimiçi deneyin!

En fazla 4'ü veren N'ye kadar "all" bazlarını çıkarır. Maksimum veya minimum baz istiyorsanız, sırasıyla (maks) veya (min) ekleyin .

Nasıl çalışır

bⱮċ€4M    Main link (monad). Input: integer N.
bⱮ        Convert N to each base of 1..N
  ċ€4     Count 4's in each representation
     M    Take maximal indices

2

05AB1E , 10 9 bayt

LBε4¢}Zk>

@Cowabunghole sayesinde -1 bayt .

Eğer birden fazla baz aynı miktarda 4 s'ye sahipse, en küçük olanı 16çıkartacaktır (yani sonuç olarak ortaya çıkar 6, ancak 12aynı zamanda olası bir çıktı olur).

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

L           # Create a list in the range [1, (implicit) input]
            #  i.e. 624 → [1,2,3,...,622,623,634]
 B          # Convert the (implicit) input integer to Base-N for each N in this list
            #  i.e. 624 and [1,2,3,...,622,623,624]
            #   → ["1","1001110000","212010",...,"12","11","10"]
  ε  }      # Map this list to:
   4¢       #  Count the number of 4s in the number
            #   → [0,0,0,0,4,0,0,0,0,1,0,2,...,0,0,0]
      Z     # Take the max (without popping the list)
            #  i.e. [0,0,0,0,4,0,0,0,0,1,0,2,...,0,0,0] → 4
       k    # Get the index of this max in the list
            #  i.e. [0,0,0,0,4,0,0,0,0,1,0,2,...,0,0,0] and 4 → 4
         >  # Increase it by to convert the 0-index to our base (and output implicitly)
            #  i.e. 4 → 5

Değiştirmek Could Qƶàile k>? yani maksimum 0 tabanlı indeksi bulmak ve arttırmak?
Cowabunghole

@Cowabunghole Ah, gerçekten haklısın. Bunu nasıl özlediğimden emin değilim. Teşekkürler!
Kevin Cruijssen,

1

Linq 273 ile C #

using System;using System.Linq;class P{static void Main(){int r,z,k=int.Parse(Console.ReadLine());if(k<=4) return;Console.WriteLine(Enumerable.Range(4, k).Select(x =>{r = 0;z = k;while (z > 0){if(z % x==4){r++;}z/=x;}return new[]{r, x};}).OrderBy(n => n[0]).Last()[1]);}}

veya

using System;
using System.Linq;

class P
{
    static void Main()
    {
        int r, z, k = int.Parse(Console.ReadLine());
        if (k <= 4) return;
        Console.WriteLine(
            Enumerable.Range(4, k).Select(x =>
                {
                    r = 0;
                    z = k;
                    while (z > 0)
                    {
                        if (z % x == 4)
                        {
                            r++;
                        }
                        z /= x;
                    }
                    return new[] { r, x };
                }).OrderBy(n => n[0]).Last()[1]);

    }
}

Değişkenlerin sayısının azaltılabildiğinden ve if'ler dönüştürüleceğinden emin olun. Oh iyi...


1

C # ( 482 ~ 423 Bayt)

'Golf' çözümünde ilk girişim. Temelde yukarıdaki VBA ile aynı algoritmayı kullandım. Muhtemelen bazı byte'ları dönüşüm fonksiyonuna ya da ismi kısaltmaya kaydederim Dediğim gibi bu ilk girişimi, bu yüzden lütfen nazik ol.

Boşluk ile:

using System;
class Program
{
    static void Main(string[] args)
    {
        int n = int.Parse(args[0]);
        int c=0, m=0;
        string r="";
        int t = 0;
        for (int i = 5; i < 37; i++)
        {
            while (n > 0)
            {
                r = (char)((int)(n % i) + 48 + (7 * ((int)(n % i) > 9 ? 1 : 0))) + r;
                n = (int)(n / i);
            }
            t = r.Length - r.Replace("4", "").Length;
            if (t > c) { c = t; m = i; }
        }
        Console.WriteLine("Base: " + m);
    }
}

4
Bunun namespacegerekli olduğunu sanmıyorum . Tüm isimler Programve dahil olmak üzere tek bir karakter olmalıdır cBase. Ve evet, satır içi olmalıdır cBase. Ayrıca, bildirimi ve ilklendirmeyi birleştirin, yani int c=0,m=0.
mellamokb

2
Ayrıca, test kodunuzu mantığı uygulayan fonksiyon koduyla birleştirmişsiniz gibi görünüyor. Spesifikasyon bir sayı / rakam dizisi girişi ve bir tamsayı çıktısı gerektirir. intParametreyi alan ve intbile parametresini döndürmeyen bir işlev oluşturmak ve parametre Mainsayınızı puan olarak adlandırmak adil olur .
mellamokb

@mellamokbtheWise - Yeni bir şey öğrendim. Her zaman isim alanının gerekli olduğunu varsaydım. Ayrıca, test dizisinde iyi bir yakalama, bu bana biraz para kazandırır ve şimdi gerçekten zorluğa cevap veriyorum.
theB

1

Burlesque - 28 bayt

Jbcjro{dg}Z]J{4CN}Cmsb[~Fi?i
Jbcjro                        create a list 1..input and convert input
                              to an infinite list.                      
      {dg}Z]                  convert number to base (zipWith operation)
            J                 duplicate
             {4CN}Cm          create comparison function 
              4CN             count the number of fours.
                    sb        sort by 
                      [~      take the last element (which is going to be
                              the base-n representation where count of fours
                              is highest)
                        Fi    Find the index of this last element in the original
                              unsorted list
                          ?i  increment (because base 1 is index 0)

Çevrimiçi deneyin.


işte burda. (düzenlemeye bakın veya tio.run/##SyotykktLixN/… 'e tıklayın )
mroman

1

k , 18 bayt

{*>+/'4=x{y\x}'!x}

Çevrimiçi deneyin!

{                } /function(x)
        x     '!x  /for every y in 0, 1, ..., (x-1):
         {y\x}     /    do x in base y
      4=           /see which digits equal four
   +/'             /sum, to get number of 4s per base
 *>                /get index (which equals base) of largest number of 4s


1

Kabuğu , 9 bayt

S€►#4ṠMBḣ

Çevrimiçi deneyin!

 €           The 1-based index in
      MB     the list of the input's representations in every base
     Ṡ  ḣ    from 1 to itself
S ►          of its element which has the largest
   #         number of
    4        fours.
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.