แปลงตัวเลขเป็นเบสที่มีค่าตัวแทนเป็น“ 4” มากที่สุด


30

แรงบันดาลใจจากนี้ มีตัวเลขซึ่งกำหนดเป็นจำนวนเต็มสตริงหรืออาร์เรย์ของตัวเลข (ตัวเลือกของคุณ) ค้นหาฐานที่การแสดงตัวเลขจะมี "4" มากที่สุดและส่งคืนฐานนั้น

จำนวนผลลัพธ์
624 5
444 10
 68 16

ข้อ จำกัด :

  • ฐานที่ส่งคืนไม่ควรมากกว่าอินพุต
  • ตัวเลขที่น้อยกว่าหรือเท่ากับabs (4)ไม่ควรถูกพิจารณาว่าเป็นอินพุตที่ถูกต้องดังนั้นการส่งคืนที่ไม่ได้กำหนดจึงเป็นที่ยอมรับได้

ซึ่งอาจเป็นได้ทั้งรหัสกอล์ฟหรือรหัสความท้าทาย คุณช่วยอธิบายรายละเอียดข้อกำหนดเกณฑ์การชนะและอาจให้ตัวอย่างหนึ่งตัวอย่างหรือมากกว่าของอินพุตและเอาต์พุตที่ต้องการ?
codeporn

ฐานที่ยอมรับได้สูงสุดคืออะไร?
Steven Rumbalski

ฉันจะสมมติว่า 36 เนื่องจากยากต่อการเป็นตัวแทนหลังจากนั้น
SeanC

2
@SeanCheshire: คุณไม่จำเป็นต้องแสดงตัวเลข คุณสามารถแทนจำนวนในฐานใด ๆ เป็นอาร์เรย์เช่นหมายเลขบางอย่างในฐาน[1,15,3,64,43] 80คุณเท่านั้น outputting จำนวนฐานเพื่อให้คุณได้ในทางเทคนิคสามารถทดสอบฐานทุกจากไป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
  • +/: รวมสิ่งเหล่านี้ตอนนี้เรารู้ว่ามีกี่ fours ต่อฐาน
  • ⊃⍒: ให้ดัชนีของรายการถ้าเรียงลำดับลงดังนั้นดัชนีที่ใหญ่ที่สุดอยู่ข้างหน้า ใช้รายการแรกของรายการนี้

2
ฉันชอบโซลูชัน APL ของคุณ
MrZander

25
Funny วิธีว่าการแสดงออก APL มีการแสดงออกที่คนส่วนใหญ่ทำเมื่ออ่านมัน:
epidemian

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"
Howard

ฉันเพิ่งเห็นว่าพวกเขาเปลี่ยนกฎอย่างสมบูรณ์และลบกรณีพิเศษหลังจากฉันส่ง ดังนั้นโซลูชันของคุณสอดคล้องกับกฎใหม่
Howard

@Howard กฎอาจบอกว่ากรณีนั้นไม่จำเป็นต้องได้รับการจัดการ แต่เพื่อผลประโยชน์ของความสมบูรณ์ฉันจะเพิ่มตัวแปรบางอย่าง
Peter Taylor

อย่างไรก็ตามฉันไม่สามารถ +1 มากกว่าหนึ่งครั้งได้ ;-)
Howard

@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

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)

แก้ไขสำหรับฐานทั้งหมดและลดการทดสอบให้นับเพียง4s
SeanC

FWIW คุณสามารถลบช่องว่าง:For w=5To a
Engineer Toast

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 ฐานจากน้อยที่สุดถึง 4s มากที่สุด
  3. ส่งคืนฐานจากไอเท็มล่าสุดในรายการนั่นคือฐานที่มีการแสดงมากที่สุด 4 รายการ

ตัวเลขพิเศษบางอย่าง

ทีนี้เราจะประยุกต์ใช้ฐานไหนกับหมายเลขพิเศษต่อไปนี้

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&]&(เพียงเพิกเฉยต่อข้อความที่พยายามใช้เบส -1)
LegionMammal978

นอกจากนี้ปัจจุบันไม่สามารถเริ่มต้นที่n = 152 โดยให้ 36 แทน 37
LegionMammal978

แม้ว่ารหัสของคุณจะทำงานได้ แต่ฉันไม่เข้าใจว่าจะรู้ได้อย่างไรว่าควรใช้ฐานใด ไม่ควรบอกให้ตรวจสอบฐาน 2 ถึง 36 (หรือ 1 ถึง 36)?
DavidC

Base 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 ครั้ง แต่เป็นเพียงจำนวนหนึ่งครั้ง จากผลลัพธ์ที่คาดหวังใน Challange สำหรับ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 (โดยใช้โมดูโล%%และการหารจำนวนเต็ม%/%) และเลือกดัชนีของอันแรกที่มี 4s มากที่สุด

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

2

J translation ของ @marinus 'APL solution:

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

มันส่งออกฐานที่เล็กที่สุดที่ให้การแปลง fouriest สำหรับค่าสองสามค่าสุดท้ายในตารางการแทนค่าจะมีลักษณะเหมือน "4n" (เช่น 31 ในฐาน 7 คือ "43")


2

เยลลี่ 6 ไบต์

bⱮċ€4M

ลองออนไลน์!

ส่งออกฐาน "ทั้งหมด" ถึง N ซึ่งให้ 4 มากที่สุด หากคุณต้องการฐานสูงสุดหรือขั้นต่ำสุดให้เพิ่ม(สูงสุด) หรือ(ขั้นต่ำ) ตามลำดับ

มันทำงานอย่างไร

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 ไบต์ขอบคุณ@Cababunghole @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 อาคุณพูดถูกจริงๆ ไม่แน่ใจว่าฉันพลาดอย่างไร ขอบคุณ!
Kevin Cruijssen

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

    }
}

ค่อนข้างแน่ใจว่าจำนวนของตัวแปรสามารถลดลงและถ้าสามารถแปลงเป็น? โอ้ดี ...


1

C # ( 482 ~ 423 ไบต์)

ความพยายามครั้งแรกที่โซลูชัน 'golfed' ฉันใช้อัลกอริธึมเหมือนกับ VBA โดยทั่วไป ฉันอาจบันทึกบางไบต์ inlining ฟังก์ชันการแปลงหรือทำให้ชื่อสั้นลง อย่างที่ฉันบอกว่านี่เป็นความพยายามครั้งแรกดังนั้นโปรดอ่อนโยน

ด้วยช่องว่าง:

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และใช่คุณควร cBaseinline นอกจากนี้ยังรวมการประกาศและการเริ่มต้นเช่นint c=0,m=0.
mellamokb

2
ดูเหมือนว่าคุณได้รวมรหัสทดสอบของคุณกับโค้ดฟังก์ชันที่ใช้ตรรกะ ข้อมูลจำเพาะต้องการอินพุตจำนวน / สตริงของตัวเลขและเอาต์พุตของจำนวนเต็ม มันจะค่อนข้างยุติธรรมที่จะสร้างฟังก์ชั่นที่รับintพารามิเตอร์และคืนintค่าพารามิเตอร์โดยไม่ต้องใช้Mainวิธีใดวิธีหนึ่งและเรียกว่าตัวละครนับคะแนนของคุณ
mellamokb

@mellamokbtheWise - ฉันเรียนรู้สิ่งใหม่ ฉันคิดเสมอว่าต้องมีเนมสเปซ นอกจากนี้ยังมีการจับแถวทดสอบที่ดีที่ช่วยฉันตัวอักษรและตอนนี้ฉันตอบความท้าทายจริง ๆ
theB

1

Burlesque - 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



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.