Chuyển đổi số thành cơ sở nơi đại diện của nó có hầu hết 4 4


30

Lấy cảm hứng từ điều này . Có một số, được đưa ra dưới dạng số nguyên, chuỗi hoặc mảng chữ số (lựa chọn của bạn). Tìm cơ sở trong đó biểu diễn của số sẽ có nhiều "4" nhất và trả về cơ sở đó.

Kết quả số
624 5
444 10
 68 16

hạn chế:

  • Cơ sở trả về không được lớn hơn đầu vào.
  • các số nhỏ hơn hoặc bằng abs (4) không được coi là đầu vào hợp lệ, vì vậy lợi nhuận không xác định được chấp nhận

Đây có thể là mã golf hoặc thử thách mã . Bạn có thể vui lòng nêu chi tiết các yêu cầu, tiêu chí chiến thắng và có thể đưa ra một hoặc nhiều ví dụ về đầu vào và đầu ra mong muốn không?
mật mã

Cơ sở chấp nhận cao nhất là gì?
Steven Rumbalski

Tôi sẽ giả sử 36, vì nó rất khó để đại diện sau đó
SeanC

2
@SeanCheshire: Bạn thực sự không phải hiển thị số. Bạn có thể dễ dàng biểu diễn một số trong bất kỳ cơ sở nào dưới dạng một mảng, chẳng hạn như [1,15,3,64,43]đối với một số trong cơ sở 80. Bạn chỉ xuất số cơ sở, vì vậy bạn có thể kiểm tra kỹ thuật mọi cơ sở từ 2đến n.
mellamokb

1
Câu trả lời đúng cho 1, 23, có cùng số "4" s (0) trong mỗi cơ sở là gì? Ngoài ra, nhiều số có cùng số "4" trong nhiều cơ sở (ví dụ: 4trong bất kỳ cơ sở nào> 5, 44trong bất kỳ cơ sở nào> 45, 14trong cơ sở 9 hoặc bất kỳ cơ sở nào> 15, v.v.). Câu trả lời đúng có phải là cơ sở nhỏ nhất có số "4" lớn nhất không?
mellamokb

Câu trả lời:


24

APL ( 31 19)

Bây giờ kiểm tra tất cả các cơ sở có thể.

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

Giải trình:

  • ⍳K←⎕: đọc dữ liệu nhập của người dùng, lưu trữ trong K. Lập danh sách từ 1 đến K, đây là cơ sở để thử.
  • {... : cho mỗi thứ này, hãy chạy chức năng sau
  • K⊤⍨K⍴⍵: mã hóa K vào cơ sở đó đưa ra danh sách các chữ số (dưới dạng số) trên mỗi cơ sở. Sử dụng chữ số K (một sự đánh giá quá cao, nhưng nó không thành vấn đề bởi vì những cái không được sử dụng tất cả sẽ bằng không).
  • 4=: xem cái nào trong số này bằng 4
  • +/: tổng hợp những điều này, bây giờ chúng tôi biết có bao nhiêu bốn trên mỗi cơ sở
  • ⊃⍒: đưa ra các chỉ số của danh sách nếu nó được sắp xếp xuống dưới, vì vậy chỉ số của danh sách lớn nhất nằm ở phía trước. Lấy mục đầu tiên của danh sách này.

2
Tôi yêu các giải pháp APL của bạn.
MrZander

25
Thật buồn cười là biểu thức APL đó chứa biểu thức mà hầu hết mọi người tạo ra khi đọc nó:
dịch

5

GolfScript, 30 ký tự

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

Hoạt động cho bất kỳ cơ sở - kiểm tra mã trực tuyến .

Nhận xét: Giải pháp này dựa trên phiên bản gốc của câu hỏi. Do đó, nó có thể trả về một cơ sở lớn hơn đầu vào, ví dụ, đối với đầu vào 4, nó trả về chính xác cơ sở 5 - không còn hợp lệ bởi các quy tắc mới.


5

GolfScript (23 ký tự)

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

hoặc là

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

hoặc là

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

Lưu ý rằng điều này lấy đầu vào từ stdin: để so sánh công bằng với phiên bản GolfScript của Howard trừ đi một char.


Howard chỉ ra rằng các quy tắc đã thay đổi và không hợp lý lắm khi giờ đây họ loại trừ 4như một đầu vào có thể khi nó có đầu ra hợp lệ (bất kỳ số nguyên nào lớn hơn 4). Để bao quát trường hợp đó cũng cần thêm 2 ký tự, có thể được thêm vào bằng mọi cách:

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

hoặc là

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

là một vài trong số những người rõ ràng.


Tốt đẹp. Nhưng đưa ra câu trả lời sai cho đầu vào "4".
Howard

Tôi chỉ thấy rằng họ đã thay đổi hoàn toàn các quy tắc và loại bỏ bất kỳ trường hợp đặc biệt nào sau khi tôi nộp bài. Do đó, giải pháp của bạn phù hợp với các quy tắc mới.
Howard

@Howard, các quy tắc có thể nói rằng trường hợp đó không cần phải xử lý, nhưng vì lợi ích của sự hoàn thiện, tôi sẽ thêm một số biến thể.
Peter Taylor

Tuy nhiên, tôi không thể +1 nhiều hơn một lần ;-)
Howard

@Howard, bạn có thể thêm tiền thưởng nếu bạn thực sự muốn;)
Peter Taylor

4

Python 2.x, 77 ký tự

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

Hoạt động tối đa 98 và các số dài tối đa 98 chữ số.


4

J, 38 ký tự

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

Sử dụng:

   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

sử dụng:

  • cửa sổ trực tiếp: ?k(num)
  • Công thức Excel: =k(A1)

đã sửa cho tất cả các cơ sở và giảm kiểm tra xuống chỉ đơn giản là đếm 4s
SeanC

FWIW, bạn có thể xóa một khoảng trắng:For w=5To a
Kỹ sư Toast

3

Toán học 59

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

Hãy đặt tên cho hàm trên.

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

Giải trình

  1. Count[IntegerDigits[n,k],4]: Đếm số lượng bốn trong biểu diễn k cơ sở của n .
  2. Sort các cơ sở từ ít nhất đến hầu hết 4s.
  3. Trả về cơ sở từ mục cuối cùng trong danh sách, nghĩa là cơ sở có đại diện có nhiều nhất 4.

Một số số đặc biệt

Bây giờ hãy áp dụng whichBase cho các số đặc biệt sau.

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}

Nếu bạn chuyển đổi từng số thành cơ sở tương ứng, bạn sẽ thấy những gì đặc biệt về chúng.


Tôi nghĩ rằng bạn phải thêm 7 byte cho một định nghĩa hàm hoàn chỉnh nếu bạn muốn sử dụng nở đó. Ngoài ra, MaximalBythực sự có ích, hạ nó xuống còn 49 byte: MaximalBy[Range[a=#],a~IntegerDigits~#~Count~4&]&(chỉ cần bỏ qua các tin nhắn từ nó đang cố sử dụng cơ sở-1)
LegionMammal978

Ngoài ra, hiện tại không thành công bắt đầu từ n = 152, trong đó nó cho 36 thay vì 37.
LegionMammal978

Mặc dù mã của bạn hoạt động, tôi không hiểu làm thế nào nó biết nên sử dụng cơ sở nào. Không cần phải nói để kiểm tra các cơ sở 2 đến 36 (hoặc 1 đến 36)?
DavidC

Cơ sở 36 không bao giờ được chỉ định trong vấn đề và đó là lý do tại sao tôi cho rằng lỗi của bạn không đạt n = 152 = 4 · 37 + 4. Mã của tôi kiểm tra tất cả các cơ sở từ 1 đến n , vì các cơ sở n + 1 trở đi sẽ chỉ chứa một chữ số n .
LegionMammal978

Cảm ơn đã giải thích rõ ràng.
DavidC

3

Japt -h, 10 byte

444ở cơ sở 10[4,4,4]có chứa số chữ số 43 lần nhưng 444ở cơ sở 100[4,44]trong đó cũng chứa các chữ số 43 lần, nhưng chỉ như một số lần. Đưa ra kết quả đầu ra dự kiến ​​trong 444trường hợp thử nghiệm cho trường hợp thử nghiệm, tôi đoán chúng ta sẽ phải đếm số 4:

õ ñ@ìX è¥4

Thử nó

Nhưng nếu chúng ta đang đếm chữ số 4 thì:

õ ñ@ìX ¬è4

Thử nó

õ              :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 ký tự)

Trong tất cả đó là vinh quang golf:

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

Và hơi vô dụng:

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
}

Chỉ để cho vui ở đây là đầu ra cho các số [0,127](đây là những cơ sở lớn nhất dưới chính số đầu vào).

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


1
@AttilaO. Tôi đã hy vọng ai đó sẽ chú ý :)
Gordon Bailey

2

R - 148 137 ký tự

(vì vậy, cách xa phần còn lại của cuộc thi nhưng vẫn)

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}

Về cơ bản chuyển đổi đầu vào từ cơ sở 10 sang tất cả các cơ sở từ 4 đến n (sử dụng %%phép chia số nguyên và số nguyên %/%) và chọn chỉ số của cơ sở đầu tiên có nhiều 4s nhất.

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

2

Bản dịch J của giải pháp APL của @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.)

Chỉ cần quan tâm, đây là một số giá trị:

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

Nó xuất ra cơ sở nhỏ nhất mang lại sự biến đổi mạnh mẽ nhất. Đối với một vài giá trị cuối cùng trong bảng, các biểu diễn trông giống như kiểu 4nv (ví dụ 31 trong cơ sở 7 là Lọ 43).


2

Thạch , 6 byte

bⱮċ€4M

Hãy thử trực tuyến!

Kết quả đầu ra "tất cả" dựa trên N, cung cấp tối đa 4 giây. Nếu bạn muốn cơ sở tối đa hoặc tối thiểu, hãy thêm (tối đa) hoặc (tối thiểu) tương ứng.

Làm thế nào nó hoạt động

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 nhờ vào @Cowabunghole .

Nếu nhiều cơ sở có cùng số lượng 4s, nó sẽ tạo ra cơ sở nhỏ nhất (nghĩa là 16sẽ dẫn đến 6, nhưng 12cũng sẽ là một đầu ra có thể).

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Bạn không thể thay thế Qƶàbằng k>? tức là tìm chỉ số dựa trên 0 của max và tăng nó?
Cowabunghole

@Cowabunghole Ah, bạn thực sự đúng. Không chắc làm thế nào tôi bỏ lỡ điều đó. Cảm ơn!
Kevin Cruijssen

1

C # với 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]);}}

hoặc là

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

    }
}

Khá chắc chắn số lượng biến có thể được giảm và nếu có thể được chuyển đổi thành? S. Ồ tốt ...


1

C # ( 482 ~ 423 byte)

Lần thử đầu tiên vào giải pháp 'đánh gôn'. Về cơ bản, tôi đã sử dụng thuật toán tương tự như VBA. Tôi có thể có thể lưu một số byte nội tuyến chức năng chuyển đổi hoặc rút ngắn tên. Giống như tôi đã nói đây là lần thử đầu tiên, vì vậy hãy nhẹ nhàng.

Với khoảng trắng:

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
Tôi không nghĩ namespacelà bắt buộc. Tất cả các tên phải là một ký tự đơn, bao gồm ProgramcBase. Và vâng, bạn nên nội tuyến cBase. Ngoài ra, kết hợp khai báo và khởi tạo, nghĩa là , int c=0,m=0.
mellamokb

2
Ngoài ra, có vẻ như bạn đã kết hợp mã kiểm tra của mình với mã chức năng thực hiện logic. Thông số kỹ thuật yêu cầu đầu vào của một số / chuỗi chữ số và đầu ra của một số nguyên. Sẽ thật công bằng khi chỉ cần tạo một hàm lấy inttham số và trả về inttham số, thậm chí không có Mainphương thức và gọi ký tự đếm số điểm của bạn.
mellamokb

@mellamokbtheWise - Tôi đã học được một điều mới. Tôi luôn luôn giả định không gian tên là bắt buộc. Ngoài ra, nắm bắt tốt trong mảng thử nghiệm, giúp tôi tiết kiệm được một số ký tự, và bây giờ tôi thực sự đang trả lời thử thách.
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)

Hãy thử trực tuyến.


bạn đi đây (xem phần chỉnh sửa hoặc nhấp vào tio.run/##SyotykktLixN/, )
mroman

1

k , 18 byte

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

Hãy thử trực tuyến!

{                } /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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.