Преобразовать число в базу, где его представление имеет больше «4»

30

Вдохновленный этим . Существует число, заданное как целое число, строка или массив цифр (на ваш выбор). Найдите базу, в которой представление числа будет иметь наибольшее число «4», и верните эту базу.

Номер результата
624 5
444 10
 68 16

ограничения:

  • Возвращаемая база не должна быть больше, чем ввод.
  • числа, меньшие или равные abs (4), не должны считаться допустимыми, поэтому допускаются неопределенные возвраты
Fixpoint
источник
Это может быть либо code-golf, либо code-challenge . Не могли бы вы подробно описать требования, критерии победы и, возможно, привести один или несколько примеров ввода и желаемого результата?
codeporn
Какая самая высокая приемлемая база?
Стивен Румбальски
Я бы предположил 36, так как после этого становится трудно представить
SeanC
2
@SeanCheshire: Вам не нужно отображать номер. Вы можете легко представить число в любой базе в виде массива, например, [1,15,3,64,43]для некоторого числа в базе 80. Вы выводите только базовый номер, так что вы можете технически проверить каждую базу от 2до n.
mellamokb
1
Что такое правильный ответ на 1, 2и 3, которые имеют такое же число «4» s (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 цифр (большое завышение, но это не имеет значения, потому что неиспользуемые все равно будут равны нулю).
  • 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]/,}$)\;

Обратите внимание, что для этого требуется ввод из stdin: для честного сравнения с версией Говарда для GolfScript вычтите один символ.


Говард указывает, что правила изменились, и не очень логично, что они теперь исключают 4в качестве возможного ввода, когда он имеет допустимый вывод (любое целое число больше 4). Чтобы охватить этот случай, также требуются дополнительные 2 символа, которые могут быть добавлены различными способами:

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

или

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

будучи парой очевидных.

Питер Тейлор
источник
Ницца. Но дает неверный ответ для ввода «4».
Говард
Я только что увидел, что они полностью изменили правила и удалили все особые случаи после того, как я сделал свое представление. Таким образом, ваше решение соответствует новым правилам.
Говард
@ Однако в правилах может быть сказано, что этот случай не нужно обрабатывать, но в интересах полноты я добавлю несколько вариантов.
Питер Тейлор
Тем не менее, я не могу +1 больше, чем один раз ;-)
Говард
@Howard, вы можете добавить награду, если вы действительно хотите;)
Питер Тейлор
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
Gareth
источник
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)
  • Формула Excel: =k(A1)
SeanC
источник
исправлен для всех баз и уменьшен тест до простого подсчета 4s
SeanC
FWIW, вы можете удалить пробел:For w=5To a
Инженер Тост
3

Mathematica 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 представлении n .
  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}

Если вы преобразуете каждое число в соответствующую базу, вы увидите, что в них особенного.

DavidC
источник
Я думаю, что вам нужно добавить 7 байтов для полного определения функции, если вы хотите использовать nтам. Кроме того, MaximalByдействительно помогает, сбивает его до 49 байт: MaximalBy[Range[a=#],a~IntegerDigits~#~Count~4&]&(просто игнорируйте сообщения от него, пытаясь использовать base-1)
LegionMammal978
Кроме того, текущий сбой начинается с n = 152, где он дает 36 вместо 37.
LegionMammal978
Хотя ваш код работает, я не понимаю, как он знает, какие базы использовать. Разве это не нужно указывать для изучения основ 2–36 (или 1–36)?
DavidC
База 36 никогда не указывается в задаче, и поэтому я утверждаю, что ваша ошибка не работает при n = 152 = 4 · 37 + 4. Мой код проверяет все базы от 1 до n , поскольку базы n + 1 и далее будут содержать только одну цифра n .
LegionMammal978
Спасибо за четкое объяснение.
DavidC
3

Japt -h, 10 байт

444в базе 10is, [4,4,4]которая содержит число и цифру 43 раза, но 444в базе 100is, [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. Я надеялся, что кто-нибудь заметит :)
Гордон Бэйли
2

R - 148 137 символов

(так, далеко от остальных конкурентов, но все же)

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 до n (с использованием %%деления по модулю и целому числу %/%) и выберите индекс первого, имеющего наибольшее число 4.

f(624)
[1] 5
f(444)
[1] 10
plannapus
источник
2

J перевод решения @marinus 'APL:

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» (например, 31 в базе 7 - «43»).

Джеймс Вуд
источник
2

Желе , 6 байт

bⱮċ€4M

Попробуйте онлайн!

Выводит «все» базы до N, что дает наибольшее число 4. Если вы хотите максимальную или минимальную базу, добавьте (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>

-1 байт благодаря @Cowabunghole .

Если несколько баз имеют одинаковое количество 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 Ах, ты действительно прав. Не уверен, как я это пропустил. Благодарность!
Кевин Круйссен
1

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

или

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. Ну что ж...

m0s
источник
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);
    }
}
Theb
источник
4
Я не думаю, что namespaceтребуется. Все имена должны состоять из одного символа, включая Programи cBase. И да, вы должны встроить cBase. Также объедините объявление и инициализацию, т int c=0,m=0. Е.
mellamokb
2
Кроме того, похоже, что вы объединили свой тестовый код с кодом функции, который выполняет логику. Спецификация требует ввода числа / строки цифр и вывода целого числа. Было бы справедливо просто создать функцию, которая принимает intпараметр и возвращает intпараметр, даже без Mainметода, и вызывать символ для подсчета вашей оценки.
mellamokb
@mellamokbtheWise - я узнал что-то новое. Я всегда предполагал, что пространство имен необходимо. Кроме того, хороший улов на тестовом массиве, который экономит мне немного символов, и теперь я действительно отвечаю на вызов.
13
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)

Попробуйте онлайн.

mroman
источник
вот и ты. (см. правку или нажмите 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
zgrep
источник