Konversi angka ke basis di mana perwakilannya memiliki paling "4"


30

Terinspirasi oleh ini . Ada angka, yang diberikan sebagai integer, string, atau array digit (pilihan Anda). Temukan basis di mana representasi nomor akan memiliki paling "4" dan kembalikan basis itu.

Hasil Angka
624 5
444 10
 68 16

batasan:

  • Basis yang dikembalikan tidak boleh lebih besar dari input.
  • angka kurang dari atau sama dengan abs (4) tidak boleh dianggap sebagai input yang valid, sehingga pengembalian yang tidak terdefinisi dapat diterima

Ini bisa berupa kode-golf atau kode-tantangan . Bisakah Anda merinci persyaratan, kriteria yang menang dan mungkin memberikan satu atau lebih contoh input dan output yang diinginkan?
codeporn

Apa basis tertinggi yang dapat diterima?
Steven Rumbalski

Saya akan berasumsi 36, karena sulit untuk mewakili setelah itu
SeanC

2
@SeanCheshire: Anda sebenarnya tidak harus menampilkan nomornya. Anda dapat dengan mudah mewakili angka dalam basis apa pun sebagai array, seperti [1,15,3,64,43]untuk beberapa nomor di basis 80. Anda hanya mengeluarkan nomor basis, sehingga secara teknis Anda dapat menguji setiap basis dari 2hingga n.
mellamokb

1
Apa jawaban yang benar untuk 1,, 2dan 3, yang memiliki angka "4" (0) yang sama di setiap basis? Juga, banyak angka memiliki angka yang sama "4" dalam banyak basis (misalnya, 4dalam basis apa pun> 5, 44dalam basis apa pun> 45, 14dalam basis 9, atau basis apa pun> 15, dll). Haruskah jawaban yang benar menjadi basis terkecil dengan jumlah "4" terbesar?
mellamokb

Jawaban:


24

APL ( 31 19)

Sekarang tes semua basis yang mungkin.

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

Penjelasan:

  • ⍳K←⎕: baca input pengguna, simpan di K. Buat daftar dari 1 hingga K, yang merupakan basis untuk dicoba.
  • {... : untuk masing-masing ini, jalankan fungsi berikut
  • K⊤⍨K⍴⍵: menyandikan K ke dalam basis itu memberikan daftar digit (sebagai angka) per basis. Gunakan digit K (perkiraan terlalu tinggi, tetapi tidak masalah karena yang tidak digunakan semuanya akan menjadi nol).
  • 4=: lihat yang ini sama dengan 4
  • +/: jumlah ini, sekarang kita tahu berapa merangkak per basis
  • ⊃⍒: berikan indeks daftar jika itu diurutkan ke bawah, sehingga indeks yang terbesar ada di depan. Ambil item pertama dari daftar ini.

2
Saya suka solusi APL Anda.
MrZander

25
Lucu bagaimana ekspresi APL itu mengandung ekspresi yang dibuat kebanyakan orang saat membacanya:
epidemi

5

GolfScript, 30 karakter

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

Bekerja untuk pangkalan apa pun - uji kodenya secara online .

Komentar: Solusi ini didasarkan pada versi asli pertanyaan. Dengan demikian dapat mengembalikan basis yang lebih besar dari input, misalnya untuk input 4 itu dengan benar mengembalikan basis 5 - yang tidak lagi valid oleh aturan baru.


5

GolfScript (23 karakter)

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

atau

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

atau

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

Perhatikan bahwa ini mengambil input dari stdin: untuk perbandingan yang adil dengan versi GolfScript Howard kurangi satu char.


Howard menunjukkan bahwa aturan telah berubah, dan itu tidak terlalu logis bahwa mereka sekarang mengecualikan 4sebagai input yang mungkin ketika memiliki output yang valid (bilangan bulat apa pun lebih besar dari 4). Untuk menutupi kasus itu juga membutuhkan 2 karakter tambahan, yang dapat ditambahkan dengan segala macam cara:

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

atau

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

menjadi beberapa yang jelas.


Bagus. Tetapi memberikan jawaban yang salah untuk input "4".
Howard

Saya baru saja melihat bahwa mereka mengubah aturan sepenuhnya dan menghapus semua kasus khusus setelah saya melakukan pengajuan saya. Dengan demikian solusi Anda sesuai dengan aturan baru.
Howard

@Howard, aturan mungkin mengatakan bahwa kasus itu tidak perlu ditangani, tetapi untuk kepentingan kelengkapan saya akan menambahkan beberapa varian.
Peter Taylor

Meskipun demikian, saya tidak dapat memberi +1 lebih dari sekali ;-)
Howard

@ Howard, Anda dapat menambahkan hadiah jika Anda benar-benar ingin;)
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]

Berfungsi hingga basis 98 dan angka paling banyak 98 digit.


4

J, 38 karakter

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

Pemakaian:

   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

pemakaian:

  • jendela langsung: ?k(num)
  • Rumus Excel: =k(A1)

diperbaiki untuk semua pangkalan, dan pengurangan uji untuk hanya menghitung 4s
SeanC

FWIW, Anda dapat menghapus spasi:For w=5To a
Engineer Toast

3

Mathematica 59

Kode

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

Mari kita beri nama fungsi di atas.

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

Penjelasan

  1. Count[IntegerDigits[n,k],4]: Hitung jumlah merangkak dalam representasi dasar k dari n .
  2. Sort basis dari paling sedikit ke paling 4s.
  3. Kembalikan basis dari item terakhir dalam daftar, yaitu basis yang memiliki representasi dengan 4 paling banyak.

Beberapa nomor khusus

Sekarang mari kita terapkan basis mana ke nomor khusus berikut.

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}

Jika Anda mengonversi masing-masing nomor ke basis yang sesuai, Anda akan melihat apa yang spesial dari mereka.


Saya pikir Anda harus menambahkan 7 byte untuk definisi fungsi yang lengkap jika Anda ingin menggunakannya di nsana. Juga, MaximalBysangat membantu, mengetuknya menjadi 49 byte: MaximalBy[Range[a=#],a~IntegerDigits~#~Count~4&]&(abaikan saja pesan yang mencoba menggunakan basis-1)
LegionMammal978

Juga, yang saat ini gagal dimulai pada n = 152, di mana ia memberi 36 bukannya 37.
LegionMammal978

Meskipun kode Anda berfungsi, saya tidak mengerti bagaimana ia tahu basis mana yang digunakan. Tidakkah harus disuruh memeriksa pangkalan 2 sampai 36 (atau 1 hingga 36)?
DavidC

Basis 36 tidak pernah ditentukan dalam masalah, dan itu sebabnya saya mengklaim bahwa Anda gagal untuk n = 152 = 4 · 37 + 4. Kode saya memeriksa semua basis dari 1 ke n , karena basis n + 1 dan seterusnya hanya akan berisi tunggal digit n .
LegionMammal978

Terima kasih atas penjelasan yang jelas.
DavidC

3

Japt -h, 10 byte

444di base 10adalah [4,4,4]yang berisi angka dan digit 43 kali tetapi 444di base 100adalah [4,44]yang juga berisi digit 43 kali, tetapi hanya sebagai angka satu kali. Mengingat hasil yang diharapkan dalam tantangan untuk 444kasus uji, saya kira kita seharusnya menghitung angka 4:

õ ñ@ìX è¥4

Cobalah

Tetapi jika kita sedang menghitung angka 4 maka:

õ ñ@ìX ¬è4

Cobalah

õ              :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)

Dalam semua kemuliaan golfy:

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

Dan agak 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
}

Hanya untuk bersenang-senang di sini adalah output untuk angka-angka [0,127](ini adalah pangkalan terbesar di bawah nomor input itu sendiri).

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, 5, 121, 122, 123


1
@ AttilaO. Saya berharap seseorang akan memperhatikan :)
Gordon Bailey

2

R - 148 137 karakter

(Jadi, jauh dari sisa kompetisi tetapi masih)

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}

Pada dasarnya mengubah input dari basis 10 ke semua basis dari 4 ke n (menggunakan modulo %%dan divisi integer %/%) dan pilih indeks yang pertama memiliki paling banyak 4s.

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

2

Terjemahan J dari solusi 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.)

Hanya untuk bunga, berikut adalah beberapa nilai:

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

Ini menghasilkan basis terkecil yang memberikan transformasi empat. Untuk beberapa nilai terakhir dalam tabel, representasi terlihat seperti "4n" (mis. 31 dalam basis 7 adalah "43").


2

Jelly , 6 byte

bⱮċ€4M

Cobalah online!

Output "semua" mendasarkan hingga N yang memberikan 4 paling banyak. Jika Anda ingin basis maksimal atau minimal, tambahkan (maks) atau (minimal) masing-masing.

Bagaimana itu bekerja

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 byte

LBε4¢}Zk>

-1 byte berkat @Cowabunghole .

Jika banyak basis memiliki jumlah yang sama dari 4s, itu akan menghasilkan yang terkecil (yaitu 16akan menghasilkan 6, tetapi 12juga akan menjadi output yang mungkin).

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Tidak bisakah Anda ganti Qƶàdengan k>? yaitu menemukan indeks berbasis 0 dari max dan menambahkannya?
Cowabunghole

@Cowabunghole Ah, Anda memang benar. Tidak yakin bagaimana saya melewatkan itu. Terima kasih!
Kevin Cruijssen

1

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

atau

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

    }
}

Cukup yakin jumlah variabel dapat dikurangi dan jika bisa dikonversi menjadi? Baiklah...


1

C # ( 482 ~ 423 Bytes)

Upaya pertama pada solusi 'golf'. Saya menggunakan algoritma yang pada dasarnya sama dengan VBA di atas. Saya mungkin bisa menyimpan beberapa byte yang menggarisbawahi fungsi konversi, atau memperpendek nama. Seperti yang saya katakan ini adalah upaya pertama, jadi harap bersikap lembut.

Dengan spasi putih:

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
Saya pikir itu namespacetidak diperlukan. Semua nama harus karakter tunggal, termasuk Programdan cBase. Dan ya, Anda harus sebaris cBase. Juga, gabungkan deklarasi dan inisialisasi, yaitu int c=0,m=0,.
mellamokb

2
Selain itu, sepertinya Anda telah menggabungkan kode pengujian Anda dengan kode fungsi yang menjalankan logika. Spek membutuhkan input angka / string digit, dan output integer. Akan adil untuk hanya membuat fungsi yang mengambil intparameter, dan mengembalikan intparameter, bahkan tanpa Mainmetode, dan memanggil karakter untuk menghitung skor Anda.
mellamokb

@mellamokbtheWise - Saya belajar sesuatu yang baru. Saya selalu menganggap namespace diperlukan. Juga, tangkapan yang bagus pada test array, yang menyelamatkan saya beberapa karakter, dan saya sekarang benar-benar menjawab tantangan.
theB

1

Burlesque - 28 byte

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)

Cobalah online.


ini dia. (lihat hasil edit atau klik tio.run/##SyotykktLixN/… )
mroman

1

k , 18 byte

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

Cobalah 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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.