Konwertuj liczbę na bazę, w której jej reprezentacja ma najwięcej „4”

30

Zainspirowany tym . Istnieje liczba podana jako liczba całkowita, ciąg znaków lub tablica cyfr (do wyboru). Znajdź bazę, w której reprezentacja liczby będzie miała najwięcej „4”, i zwróć tę bazę.

Wynik liczbowy
624 5
444 10
 68 16

ograniczenia:

  • Zwrócona baza nie powinna być większa niż wartość wejściowa.
  • liczby mniejsze lub równe abs (4) nie powinny być uważane za prawidłowe dane wejściowe, więc niezdefiniowane zwroty są dopuszczalne
Punkt stały
źródło
Może to być albo golf golfowy, albo wyzwanie kodowe . Czy mógłbyś szczegółowo opisać wymagania, zwycięskie kryteria i być może podać jeden lub więcej przykładów danych wejściowych i pożądanych rezultatów?
codeporn
Jaka jest najwyższa akceptowalna baza?
Steven Rumbalski
Zakładam, że 36, ponieważ później trudno jest reprezentować
SeanC
2
@SeanCheshire: W rzeczywistości nie musisz wyświetlać numeru. Możesz łatwo przedstawić liczbę w dowolnej bazie jako tablicę, na przykład [1,15,3,64,43]dla pewnej liczby w bazie 80. Podajesz tylko numer bazowy, więc możesz technicznie przetestować każdą bazę od 2do n.
mellamokb
1
Jaka jest poprawna odpowiedź dla 1, 2i 3, które mają taką samą liczbę „4” (0) w każdej bazie? Ponadto wiele liczb ma tę samą liczbę „4” w wielu bazach (np.4 W dowolnej bazie> 5, 44w dowolnej bazie> 45, 14w bazie 9 lub dowolnej bazie> 15 itd.). Czy poprawna odpowiedź powinna być najmniejszą bazą z największą liczbą „4”?
mellamokb

Odpowiedzi:

24

APL ( 31 19)

Teraz przetestuj wszystkie możliwe zasady.

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

Wyjaśnienie:

  • ⍳K←⎕: odczytaj dane wejściowe użytkownika, zapisz w K. Zrób listę od 1 do K, które są podstawą do wypróbowania.
  • {... : dla każdego z nich uruchom następującą funkcję
  • K⊤⍨K⍴⍵: zakoduj K w tej bazie, podając listę cyfr (jako liczb) na bazę. Używaj cyfr K (duże przeszacowanie, ale to nie ma znaczenia, ponieważ nieużywane i tak będą zerowe).
  • 4=: sprawdź, które z nich są równe 4
  • +/: zsumuj je, teraz wiemy, ile czwórek na bazę
  • ⊃⍒: podaj indeksy listy, jeśli byłyby posortowane w dół, więc indeks największej z nich znajduje się z przodu. Weź pierwszą pozycję z tej listy.
marinus
źródło
2
Uwielbiam twoje rozwiązania APL.
MrZander
25
Zabawne, jak to wyrażenie APL zawiera wyrażenie, które robi większość ludzi podczas jego czytania:
epidemia
5

GolfScript, 30 znaków

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

Działa z każdą bazą - przetestuj kod online .

Komentarz: To rozwiązanie zostało oparte na oryginalnej wersji pytania. W ten sposób może zwrócić bazę większą niż wejście, np. Dla wejścia 4 poprawnie zwraca podstawę 5 - co nie jest już ważne w nowych regułach.

Howard
źródło
5

GolfScript (23 znaki)

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

lub

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

lub

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

Zauważ, że pobiera to dane ze standardowego wejścia: dla sprawiedliwego porównania z wersją Howarda GolfScript odejmij jeden znak.


Howard zwraca uwagę, że reguły się zmieniły i nie jest zbyt logiczne, aby wykluczyły je 4jako możliwe dane wejściowe, gdy mają prawidłowe dane wyjściowe (dowolna liczba całkowita większa niż 4). Do pokrycia tej sprawy również potrzebne są dodatkowe 2 znaki, które można dodawać na różne sposoby:

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

lub

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

będąc kilkoma oczywistymi.

Peter Taylor
źródło
Miły. Ale daje błędną odpowiedź na wejście „4”.
Howard
Właśnie zobaczyłem, że całkowicie zmienili zasady i usunęli wszelkie specjalne przypadki po tym, jak przesłałem. W ten sposób Twoje rozwiązanie jest zgodne z nowymi zasadami.
Howard
@Howard, zasady mogą powiedzieć, że ta sprawa nie musi być załatwiona, ale dla zachowania kompletności dodam kilka wariantów.
Peter Taylor
Niemniej jednak nie mogę dać +1 więcej niż raz ;-)
Howard
@Jak możesz dodać nagrodę, jeśli naprawdę chcesz;)
Peter Taylor
4

Python 2.x, 77 znaków

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

Działa do podstawy 98 i liczb o długości maksymalnie 98 cyfr.

Keith Randall
źródło
4

J, 38 znaków

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

Stosowanie:

   p 624
5
   p 444
10
   p 68
16
Gareth
źródło
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

stosowanie:

  • okno bezpośrednie: ?k(num)
  • Formuła Excel: =k(A1)
SeanC
źródło
naprawiono dla wszystkich zasad i zredukowano test do zliczania 4s
SeanC
FWIW, możesz usunąć spację:For w=5To a
Inżynier Toast
3

Mathematica 59

Kod

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

Nadajmy powyższej funkcji nazwę.

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

Wyjaśnienie

  1. Count[IntegerDigits[n,k],4]: Policz liczbę czwórek w podstawowej k reprezentacji n .
  2. Sort podstawy od najmniejszej do większości 4s.
  3. Zwraca podstawę z ostatniego elementu na liście, czyli bazę, która miała reprezentację z największą liczbą 4.

Niektóre numery specjalne

Teraz zastosujmy whatBase do następujących numerów specjalnych.

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}

Jeśli przekonwertujesz każdy numer na odpowiednią bazę, zobaczysz, co jest w nich specjalnego.

DavidC
źródło
Myślę, że musisz dodać 7 bajtów dla pełnej definicji funkcji, jeśli chcesz ntam użyć . Poza tym MaximalBynaprawdę pomaga, powala do 49 bajtów: MaximalBy[Range[a=#],a~IntegerDigits~#~Count~4&]&(po prostu zignoruj ​​wiadomości próbujące użyć base-1)
LegionMammal978
Również obecny nie zaczyna się od n = 152, gdzie daje 36 zamiast 37.
LegionMammal978
Chociaż twój kod działa, nie rozumiem, skąd on wie, z jakich zasad korzystać. Czy nie trzeba mówić, aby sprawdzał bazy od 2 do 36 (lub od 1 do 36)?
DavidC
Baza 36 nigdy nie jest określona w problemie i dlatego twierdzę, że twoja nie działa dla n = 152 = 4 · 37 + 4. Mój kod sprawdza wszystkie bazy od 1 do n , ponieważ zasady n + 1 i kolejne będą zawierać tylko pojedyncze cyfra n .
LegionMammal978,
Dziękuję za jasne wyjaśnienie.
DavidC
3

Japt -h, 10 bajtów

444w bazie 10jest, [4,4,4]która zawiera liczbę i cyfrę 43 razy, ale 444w bazie 100jest, [4,44]która zawiera również cyfrę 43 razy, ale tylko jako liczba raz. Biorąc pod uwagę oczekiwany wynik w wyzwaniu dla 444przypadku testowego, sądzę, że powinniśmy liczyć liczbę 4:

õ ñ@ìX è¥4

Spróbuj

Ale jeśli liczenia cyfrę 4 następnie:

õ ñ@ìX ¬è4

Spróbuj

õ              :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
Kudłaty
źródło
2

C - (114 znaków)

W całej swojej golfowej chwale:

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

I nieco nie golfisty:

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
}

Dla zabawy oto wynik dla liczb [0,127](są to największe podstawy pod samym numerem wejściowym).

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, 9, 37, 38, 39, 10, 41, 42, 43, 11, 5, 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, 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

Gordon Bailey
źródło
1
@AttilaO. Miałem nadzieję, że ktoś to zauważy :)
Gordon Bailey,
2

R - 148 137 znaków

(tak daleko od reszty zawodów, ale nadal)

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}

Zasadniczo przekształć dane wejściowe z bazy 10 na wszystkie bazy z 4 na n (używając modulo %% i liczb całkowitych %/%) i wybierz indeks pierwszego, który ma najwięcej 4s.

f(624)
[1] 5
f(444)
[1] 10
plannapus
źródło
2

Tłumaczenie J rozwiązania APL @marinus:

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.)

Dla zainteresowania, oto kilka wartości:

(,.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

Wyprowadza najmniejszą bazę, która daje czwartą transformację. Dla kilku ostatnich wartości w tabeli reprezentacje wyglądają jak „4n” (np. 31 w podstawie 7 to „43”).

James Wood
źródło
2

Galaretka , 6 bajtów

bⱮċ€4M

Wypróbuj online!

Wysyła „wszystkie” zasady do N, co daje najwięcej 4. Jeśli chcesz maksymalną lub minimalną bazę, dodaj (maks.) Lub (min).

Jak to działa

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

05AB1E , 10 9 bajtów

LBε4¢}Zk>

-1 bajt dzięki @Cowabunghole .

Jeśli wiele zasad ma taką samą liczbę 4s, wygeneruje najmniejszą (tzn. 16Spowoduje6 , ale 12będzie również możliwą mocą wyjściową).

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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
Kevin Cruijssen
źródło
Nie udało się zamienić Qƶàz k>? tzn. znaleźć indeks maksymalny oparty na 0 i zwiększyć go?
Cowabunghole,
@Cowabunghole Ah, rzeczywiście masz rację. Nie jestem pewien, jak mi tego brakowało. Dzięki!
Kevin Cruijssen,
1

C # z Linq 273

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]);}}

lub

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]);

    }
}

Jestem pewien, że liczbę zmiennych można zmniejszyć, a if można przekonwertować na? No cóż...

m0s
źródło
1

C # ( 482 ~ 423 bajtów)

Pierwsza próba rozwiązania „golfowego”. Użyłem w zasadzie tego samego algorytmu, co VBA powyżej. Prawdopodobnie mógłbym zapisać niektóre bajty wstawiające funkcję konwersji lub skracające nazwę. Jak powiedziałem, jest to pierwsza próba, więc proszę, bądź delikatny.

Z białymi znakami:

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);
    }
}
theB
źródło
4
Nie sądzę, że namespacejest to wymagane. Wszystkie nazwy powinny być pojedynczymi znakami, w tym Programi cBase. I tak, powinieneś inline cBase. Połącz również deklarację i inicjalizację, tj int c=0,m=0.
mellamokb
2
Wygląda też na to, że połączyłeś kod testowy z kodem funkcji, który wykonuje logikę. Specyfikacja wymaga wprowadzenia liczby / łańcucha cyfr oraz wyjścia liczby całkowitej. Byłoby sprawiedliwe po prostu stworzyć funkcję, która pobiera intparametr i zwraca intparametr, nawet bez Mainmetody, i wywołuje liczenie znaków swój wynik.
mellamokb
@mellamokbtheWise - Nauczyłem się czegoś nowego. Zawsze zakładałem, że przestrzeń nazw jest wymagana. Również dobry chwyt na tablicy testowej, która oszczędza mi trochę znaków, a teraz właściwie odpowiadam na wyzwanie.
theB
1

Burleska - 28 bajtów

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)

Wypróbuj online.

mroman
źródło
proszę bardzo. (zobacz edycję lub kliknij tio.run / ##SyotykktLixN/... )
mroman
1

k , 18 bajtów

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

Wypróbuj online!

{                } /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
zgrep
źródło
1

Łuska , 9 bajtów

S€►#4ṠMBḣ

Wypróbuj online!

 €           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.
Niepowiązany ciąg
źródło