Перетворити номер у базу, де його представлення має найбільше “4” s


30

Натхненний цим . Є число, вказане як ціле число, рядок або масив цифр (на ваш вибір). Знайдіть базу, в якій представлення числа матиме найбільше "4" s, і поверніть цю базу.

Результат числа
624 5
444 10
 68 16

обмеження:

  • Повернута база не повинна бути більшою за вхідну.
  • числа, менші або рівні abs (4), не повинні вважатися вхідними, тому невизначені повернення є прийнятними

Це може бути або код-гольф, або код-виклик . Чи можете ви детально ознайомитись з вимогами, критеріями виграшу та, можливо, навести один чи більше прикладів введення та бажаного результату?
codeporn

Що є найвищою прийнятною базою?
Стівен Румбальський

Я б припустив 36, оскільки це важко представляти після цього
SeanC

2
@SeanCheshire: Вам фактично не потрібно відображати номер. Ви можете легко представити число в будь-якій базі як масив, наприклад, [1,15,3,64,43]для деякого числа в базі 80. Ви тільки виводячи лужне число, так що ви могли б технічно перевірити кожну базу від 2до n.
mellamokb

1
Яка правильна відповідь на 1, 2і 3, які мають однакову кількість "4" s (0) у кожній базі? Крім того, багато чисел мають однакову кількість "4" s у багатьох базах (наприклад, 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]/,}$)\;

Зауважте, що для цього потрібно взяти стдин: для справедливого порівняння з версією Говарда GolfScript відніміть одну таблицю.


Говард вказує, що правила змінилися, і не дуже логічно, що вони тепер виключають 4як можливий вхід, коли він має дійсний вихід (будь-яке ціле число, що перевищує 4). Для покриття цього випадку потрібні додаткові 2 символи, які можна додати різними способами:

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

або

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

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


Приємно. Але дає неправильну відповідь для введення "4".
Говард

Щойно я побачив, що вони повністю змінили правила та усунули будь-які особливі випадки після того, як я зробив свою заяву. Таким чином, ваше рішення відповідає новим правилам.
Говард

@Howard, правила можуть сказати, що цей випадок не потребує розгляду, але в інтересах повноти я додаю кілька варіантів.
Пітер Тейлор

Тим не менш, я не можу поставити +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

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

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 поданні 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}

Якщо перетворити кожен номер у відповідну базу, ви побачите, що в них особливе.


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

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

2

J переклад рішення 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.)

Ось лише для інтересу, ось деякі значення:

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

Якщо декілька баз мають однакову кількість 4с, це виведе найменший (тобто 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]);

    }
}

Досить впевнений, що кількість змінних можна зменшити, і якщо можна перетворити на? 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параметр, і повертає intпараметр, навіть не використовуючи Mainметод, і зателефонувати символу, який вважає ваш рахунок.
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



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.