숫자가 "4"로 가장 많이 밑으로 변환


30

영감을받은 . 정수, 문자열 또는 숫자 배열로 제공되는 숫자가 있습니다 (선택). 숫자 표현에 "4"가 가장 많은 밑을 찾아 해당 밑을 반환합니다.

수 결과
624 5
444 10
 68 16

제한 사항 :

  • 반환 된 기준은 입력보다 크지 않아야합니다.
  • abs (4) 보다 작거나 같은 숫자 는 유효한 입력으로 간주되어서는 안되므로 정의되지 않은 반환은 허용됩니다

이것은 code-golf 또는 code-challenge 일 수 있습니다. 요구 사항, 당첨 기준을 자세히 설명하고 입력 및 원하는 출력에 대한 하나 이상의 예를 제공 할 수 있습니까?
codeporn

허용 가능한 가장 높은 기준은 무엇입니까?
Steven Rumbalski

나는 그 이후에 표현하기가 어려워 36을 가정합니다
SeanC

2
@SeanCheshire : 실제로 숫자를 표시 할 필요는 없습니다. base의 [1,15,3,64,43]일부 숫자 와 같이 모든 base의 숫자를 배열로 쉽게 나타낼 수 있습니다 80. 기준 번호 만 출력하므로 기술적으로 모든 기준을에서 2까지 테스트 할 수 n있습니다.
mellamokb

1
무엇에 대한 정답 1, 2그리고 3같은 수를 가지고있는, "4"모든 자료들 (0)? 또한, 많은 숫자는 많은 염기에서 동일한 수의 "4"를 가진다 (예를 들어, 4임의의 염기> 5, 44임의의 염기> 45, 14염기 9 또는 임의의 염기> 15 등). 정답은 가장 많은 수의 "4"를 가진 가장 작은 기본이어야합니까?
mellamokb

답변:


24

APL ( 31 19)

이제 가능한 모든 기지를 테스트하십시오.

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

설명:

  • ⍳K←⎕: 사용자 입력을 읽고 K에 저장합니다. 1부터 K까지 목록을 작성하십시오.
  • {... : 이들 각각에 대해 다음 기능을 실행하십시오.
  • K⊤⍨K⍴⍵: K를 해당 기준으로 인코딩하여 기준 당 자릿수 (숫자) 목록을 제공합니다. K 숫자를 사용하십시오 (과대 평가되었지만 사용되지 않은 숫자는 모두 0이므로 중요하지 않습니다).
  • 4=:이 중 4와 동일한 것을 확인하십시오
  • +/: 이것들을 합하면, 우리는 기본 당 몇 개의 포를 알고 있습니다
  • ⊃⍒:리스트가 아래쪽으로 정렬 된 경우 인덱스를 제공하므로 가장 큰 인덱스는 맨 앞에 있습니다. 이 목록의 첫 번째 항목을 가져 가십시오.

2
나는 당신의 APL 솔루션을 좋아합니다.
MrZander

25
그 APL 표현이 대부분의 사람들이 그것을 읽을 때 만드는 표현을 포함하는 방법에 대한 재미 :
전염병

5

GolfScript, 30 자

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

모든 코드에서 온라인으로 코드를 테스트합니다 .

의견 : 이 솔루션은 질문의 원래 버전을 기반으로합니다. 따라서 입력보다 큰 기준을 반환 할 수 있습니다. 예를 들어, 입력 4의 경우 기준 5를 올바르게 반환합니다.이 기준은 더 이상 새 규칙에서 유효하지 않습니다.


5

GolfScript (23 자)

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

또는

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

또는

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

Howard의 GolfScript 버전과의 공정한 비교를 위해 stdin에서 입력을받습니다. 한 문자를 뺍니다.


Howard는 규칙이 변경되었다고 지적하고 4유효한 출력 (4보다 큰 정수)이있을 때 가능한 입력으로 제외 하는 것이 논리적이지 않습니다 . 이 경우를 처리하려면 모든 종류의 방법으로 추가 할 수있는 추가 2자가 필요합니다.

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

또는

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

몇 가지 명백한 것들입니다.


좋은. 그러나 입력 "4"에 대해 잘못된 답변을 제공합니다.
Howard

방금 그들이 규칙을 완전히 바꾸고 제출 한 후 특별한 경우를 제거하는 것을 보았습니다. 따라서 솔루션은 새로운 규칙을 준수합니다.
Howard

@Howard, 규칙에 따르면 그 사건을 처리 할 필요는 없지만 완전성을 위해 변형을 추가 할 것입니다.
피터 테일러

그럼에도 불구하고, 나는 한 번 이상 +1을 할 수 없다 ;-)
Howard

@Howard, 당신이 정말로 원하는 경우 현상금을 추가 할 수 있습니다;)
Peter Taylor

4

Python 2.x, 77 자

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

기수 98과 최대 98 자리의 숫자까지 작동합니다.


4

J, 38 자

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

용법:

   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

용법:

  • 직접 창 : ?k(num)
  • 엑셀 공식 : =k(A1)

모든 기지에 고정, 테스트 횟수를 4
초로 줄였습니다

FWIW, 당신은 공간을 제거 할 수 있습니다 :For w=5To a
엔지니어 토스트

3

매스 매 티카 59

암호

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

위 함수에 이름을 지어 보자.

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

설명

  1. Count[IntegerDigits[n,k],4]: 기재에 발로 숫자 개수 k 개의 표현 없음을 .
  2. Sort 최소에서 최대 4까지의 기지.
  3. 목록의 마지막 항목, 즉 가장 4가 많은 표현을 가진 기본에서 밑을 반환합니다.

특별한 숫자들

이제 다음 특수 숫자에 whichBase를 적용 해 봅시다.

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}

각 숫자를 해당 염기로 변환하면 그 숫자가 무엇인지 알 수 있습니다.


완전한 함수 정의를 사용하려면 7 바이트를 추가해야한다고 생각합니다 n. 또한 MaximalBy정말 도움이됩니다. 49 바이트로 떨어 뜨립니다. MaximalBy[Range[a=#],a~IntegerDigits~#~Count~4&]&(base-1을 사용하려고하는 메시지를 무시하십시오)
LegionMammal978

또한, 현재는 n = 152에서 시작하여 37 대신 36을 제공합니다.
LegionMammal978

코드가 작동하지만 사용할베이스를 어떻게 알 수 있는지 이해하지 못합니다. 베이스 2에서 36 (또는 1에서 36)을 검사하라는 지시를받지 않아도됩니까?
DavidC

Base 36은 문제에 명시되지 않았으므로 n = 152 = 4 · 37 + 4에 대해 실패한다고 주장하는 이유 는 다음 과 같습니다 .n + 1 이상에서는 단일 염기 만 포함하므로 내 코드는 1에서 n 까지 모든 염기를 검사합니다. 숫자 n .
LegionMammal978

명확한 설명에 감사드립니다.
DavidC

3

Japt -h, 10 바이트

444기본 10[4,4,4]숫자 숫자를 43 번 포함하지만 444기본 100[4,44]숫자를 43 번 포함 하지만 한 번만 숫자를 포함합니다. 444테스트 케이스 의 도전에서 예상되는 출력을 감안할 때, 우리는 숫자 4를 계산해야한다고 생각합니다.

õ ñ@ìX è¥4

시도 해봐

그러나 우리 숫자 4를 세면 :

õ ñ@ìX ¬è4

시도 해봐

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

모든 것이 골프의 영광입니다.

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

그리고 다소 골퍼되지 않은 :

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
}

재미있게 여기 숫자에 대한 출력이 있습니다 [0,127](입력 숫자 자체에서 가장 큰 염기입니다).

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. 나는 누군가가 주목할 것이기를 바라고 있었다 :)
Gordon Bailey

2

R- 148137

(따라서 나머지 경쟁사와는 거리가 멀지 만 여전히)

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}

기본적으로 입력을 기본 10에서 4까지의 모든 염기로 변환하고 (모듈로 %%및 정수 나누기 사용 %/%) 가장 많은 4를 갖는 첫 번째 인덱스를 선택하십시오.

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

2

@marinus 'APL 솔루션의 J 번역 :

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

관심을 끌기 위해 다음과 같은 값이 있습니다.

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

가장 네 번째 변환을 제공하는 가장 작은베이스를 출력합니다. 표의 마지막 몇 값의 경우 표현은“4n”과 같습니다 (예 : 기저 7의 31은“43”).


2

젤리 , 6 바이트

bⱮċ€4M

온라인으로 사용해보십시오!

최대 4를 제공하는 최대 N까지 "모두"를 출력합니다. 최대 또는 최소베이스를 원하면 각각 (max) 또는 (min)을 추가하십시오 .

작동 원리

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 바이트

LBε4¢}Zk>

@Cowabunghole 덕분에 -1 바이트 .

여러 염기 4S 동일한 양이 경우, 출력 가장 작은 (즉, 윌 16초래한다 6, 그러나12 나올 수도 가능한 결과 일 것입니다).

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

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

당신은 대체 할 수 없습니다 Qƶà와 함께 k>? 즉, 최대의 0 기반 색인을 찾아서 증가 시킵니까?
Cowabunghole

@Cowabunghole 아, 맞아. 내가 어떻게 그리웠는지 모르겠습니다. 감사!
Kevin Cruijssen

1

Linq 273을 사용한 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]);}}

또는

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

    }
}

변수 수를 줄이고 if를? s로 변환 할 수 있는지 확인하십시오. 오 잘 ...


1

C # ( 482 ~ 423 바이트)

먼저 '골프'솔루션을 시도하십시오. 기본적으로 위의 VBA와 동일한 알고리즘을 사용했습니다. 아마도 변환 함수를 인라인하거나 이름을 단축하는 바이트를 절약 할 수 있습니다. 내가 말했듯이 이것은 첫 번째 시도이므로 조심하십시오.

공백으로 :

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
나는 그것이 필요하다고 생각하지 않습니다 namespace. 모든 이름은 다음과 같은 단일 문자해야 Program하고 cBase. 그리고 네, 인라인해야합니다 cBase. 또한 선언과 초기화를 결합하십시오 (예 :) int c=0,m=0.
mellamokb

2
또한 테스트 코드를 로직을 수행하는 함수 코드와 결합한 것 같습니다. 스펙에는 숫자 / 문자열의 입력과 정수 출력이 필요합니다. 메소드 없이 매개 int변수 를 가져 와서 매개 변수를 리턴 하는 함수를 작성 하고 문자 수를 점수로 호출하는 것이 적절합니다 . intMain
mellamokb

@mellamokbtheWise-새로운 것을 배웠다. 나는 항상 네임 스페이스가 필요하다고 가정했다. 또한 테스트 배열을 잘 잡아서 몇 가지 문자를 절약하고 실제로 도전에 답하고 있습니다.
theB

1

해 학적 인-28 바이트

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)

온라인으로 사용해보십시오.


당신은 간다. (편집을 참조하거나 tio.run/##SyotykktLixN/…을 클릭하십시오 )
mroman

1

케이 , 18 바이트

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

온라인으로 사용해보십시오!

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.