संख्या को ऐसे आधार में परिवर्तित करें जहाँ उसके प्रतिनिधित्व में सबसे अधिक "4" हों


30

से प्रेरित होकर इस । एक संख्या है, जिसे पूर्णांक, स्ट्रिंग या अंकों की सरणी (आपकी पसंद) के रूप में दिया गया है। वह आधार ढूंढें जिसमें संख्या का प्रतिनिधित्व सबसे अधिक "4" होगा और उस आधार को वापस कर देगा।

नंबर रिजल्ट
६२४ ५
४४४ १०
 68 16

प्रतिबंध:

  • लौटाया गया आधार इनपुट से अधिक नहीं होना चाहिए।
  • एब्स (4) से कम या उसके बराबर की संख्या को वैध इनपुट नहीं माना जाना चाहिए, इसलिए अपरिभाषित रिटर्न स्वीकार्य हैं

यह कोड-गोल्फ या कोड-चैलेंज हो सकता है । क्या आप कृपया आवश्यकताओं, जीतने के मानदंडों का विस्तार कर सकते हैं और संभवतः इनपुट और वांछित आउटपुट के एक या अधिक उदाहरण दे सकते हैं?
कोडवन

उच्चतम स्वीकार्य आधार क्या है?
स्टीवन रूंबल्स्की

मैं 36 का अनुमान
लगाऊंगा

2
@ सीनचेयर: आपको वास्तव में नंबर प्रदर्शित करने की आवश्यकता नहीं है। आप किसी भी आधार में एक संख्या को आसानी से एक सरणी के रूप में दर्शा सकते हैं, जैसे कि [1,15,3,64,43]आधार में कुछ संख्या के लिए 80। आप केवल आधार संख्या outputting रहे हैं ताकि आप तकनीकी रूप से से हर आधार परीक्षण कर सकते हैं 2करने के लिए n
मेलामोकब

1
के लिए सही जवाब क्या है 1, 2है, और 3, जिनमें से एक ही नंबर है "4" रों (0) हर आधार में? इसके अलावा, कई आधारों में कई आधारों में "4" की समान संख्या होती है (जैसे, 4किसी भी आधार में> 5, 44किसी भी आधार में> 14आधार 9 में, आधार 9 में, या किसी भी आधार> 15, आदि)। क्या सही उत्तर "4" की सबसे बड़ी संख्या के साथ सबसे छोटा आधार होना चाहिए?
mellamokb

जवाबों:


24

एपीएल ( 31 19)

अब सभी संभावित ठिकानों का परीक्षण करेंगे।

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

स्पष्टीकरण:

  • ⍳K←⎕: उपयोगकर्ता इनपुट पढ़ें, K में स्टोर करें। 1 से K तक एक सूची बनाएं, जो प्रयास करने के लिए आधार हैं।
  • {... : इनमें से प्रत्येक के लिए, निम्न फ़ंक्शन चलाएँ
  • K⊤⍨K⍴⍵: K को उस बेस में अंको की सूची (संख्या के अनुसार) प्रति बेस में एनकोड करें। K अंकों का उपयोग करें (एक बड़ा overestimate, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि अप्रयुक्त सभी वैसे भी शून्य होंगे)।
  • 4=: देखें इनमें से कौन 4 के बराबर हैं
  • +/: इन्हें योग करें, अब हम जानते हैं कि प्रति आधार कितने चार हैं
  • ⊃⍒: सूची के सूचकांकों को दें यदि इसे नीचे की ओर क्रमबद्ध किया गया था, तो सबसे बड़ा सूचकांक सबसे आगे है। इस सूची का पहला आइटम लें।

2
मुझे आपके APL समाधान पसंद हैं।
MrZander

25
अजीब बात है कि एपीएल अभिव्यक्ति में वह अभिव्यक्ति है, जिसे ज्यादातर लोग पढ़ते समय बनाते हैं:
महामारी

5

GolfScript, 30 अक्षर

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

किसी भी आधार के लिए काम करता है - ऑनलाइन कोड का परीक्षण करें ।

टिप्पणी: यह समाधान प्रश्न के मूल संस्करण पर आधारित था। इस प्रकार यह इनपुट से बड़े बेस को वापस कर सकता है, उदाहरण के लिए इनपुट 4 के लिए यह सही ढंग से बेस 5 लौटाता है - जो अब नए नियमों से मान्य नहीं है।


5

गोल्फस्क्रिप्ट (23 वर्ण)

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

या

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

या

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

ध्यान दें कि यह स्टड से इनपुट लेता है: हावर्ड के गोल्फस्क्रिप्ट संस्करण के साथ एक निष्पक्ष तुलना के लिए एक चार को घटाएं।


हावर्ड बताते हैं कि नियम बदल गए हैं, और यह बहुत तर्कसंगत नहीं है कि वे अब 4एक संभावित इनपुट के रूप में बाहर कर देते हैं जब यह एक वैध आउटपुट (4 से अधिक पूर्णांक) हो। उस मामले को कवर करने के लिए अतिरिक्त 2 वर्णों की आवश्यकता होती है, जिन्हें सभी प्रकार से जोड़ा जा सकता है:

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

या

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

स्पष्ट लोगों की एक जोड़ी होने के नाते।


अच्छा लगा। लेकिन इनपुट "4" के लिए गलत उत्तर देता है।
हावर्ड

मैंने सिर्फ यह देखा कि उन्होंने मेरे प्रस्तुत करने के बाद नियमों को पूरी तरह से बदल दिया और किसी भी विशेष मामले को हटा दिया। इस प्रकार आपका समाधान नए नियमों के अनुरूप है।
हावर्ड

@ हावर्ड, नियम यह कह सकते हैं कि मामले को संभालने की आवश्यकता नहीं है, लेकिन पूर्णता के हितों में मैं कुछ वेरिएंट जोड़ूंगा।
पीटर टेलर

फिर भी, मैं +1 को एक से अधिक बार नहीं कर सकता; ;-)
हावर्ड

@ हावर्ड, यदि आप वास्तव में चाहते हैं, तो आप एक इनाम जोड़ सकते हैं;)
पीटर टेलर

4

पायथन 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)
  • एक्सेल सूत्र: =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]: N की आधार k प्रतिनिधित्व में चार की संख्या की गणना करें ।
  2. Sort सबसे चौड़े से सबसे चौड़े तल तक कुर्सियां।
  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, 28 29, 30, 31, 32, 33, 34, 35, 36}

यदि आप प्रत्येक संख्या को संबंधित आधार में परिवर्तित करते हैं, तो आप देखेंगे कि उनके बारे में क्या खास है।


मुझे लगता है कि यदि आप nवहाँ का उपयोग करना चाहते हैं, तो आपको एक पूर्ण फ़ंक्शन परिभाषा के लिए 7 बाइट्स जोड़ने होंगे । इसके अलावा, MaximalByवास्तव में मदद करता है, यह 49 बाइट्स के लिए नीचे दस्तक देता है: MaximalBy[Range[a=#],a~IntegerDigits~#~Count~4&]&(बस बेस -1 का उपयोग करने की कोशिश कर रहे संदेशों को अनदेखा करें)
LegionMammal978

इसके अलावा, वर्तमान एक n = 152 पर शुरू होने में विफल रहता है , जहां यह 37 के बजाय 36 देता है।
LegionMammal978

यद्यपि आपका कोड काम करता है, मुझे समझ में नहीं आता है कि यह कैसे पता है कि किस आधार का उपयोग करना है। यह 36 के माध्यम से 2 कुर्सियां ​​(36 के माध्यम से 1) की जांच करने के लिए कहा जाना चाहिए?
डेविड डिक

बेस 36 समस्या में कभी निर्दिष्ट नहीं होता है, और इसलिए मैं दावा करता हूं कि आपका n = 152 = 4 · 37 + 4. के लिए विफल रहता है । मेरा कोड 1 से n तक सभी आधारों की जांच करता है , क्योंकि आधार n + 1 और उसके बाद केवल सिंगल होंगे अंक n
लीजनमोनमल 978 21

स्पष्ट स्पष्टीकरण के लिए धन्यवाद।
डेविड डे

3

जाप -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

सी - (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, 5 21, 22, 23, 6, 25, 26, 27, 7, 29, 30, 31, 8, 33, 34, 35, 35, 9, 37, 38, 39, 10, 41, 42, 43, 11, 5, 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, 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, 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

आर - 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

2

Jmar @ 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" जैसा दिखता है (उदाहरण के लिए बेस 7 में 31 "43")।


2

जेली , 6 बाइट्स

bⱮċ€4M

इसे ऑनलाइन आज़माएं!

आउटपुट "सभी" एन तक आधार करता है जो सबसे अधिक 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 बाइट @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 आह, तुम वास्तव में सही हो। यकीन नहीं होता कि मैं कैसे चूक गया। धन्यवाद!
केविन क्रूज़सेन 15

1

लिनक 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 बाइट्स)

'गोल्फ' समाधान में पहला प्रयास। मैं मूल रूप से ऊपर 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
मेलामोकब

2
इसके अलावा, ऐसा लगता है कि आपने अपना परीक्षण कोड फ़ंक्शन कोड के साथ जोड़ दिया है जो तर्क करता है। युक्ति को अंकों की संख्या / स्ट्रिंग और पूर्णांक के आउटपुट की आवश्यकता होती है। यह केवल एक फ़ंक्शन बनाने के लिए उचित होगा जो intपैरामीटर लेता है, और intपैरामीटर को रिटर्न करता है, यहां तक ​​कि एक Mainविधि के बिना , और चरित्र को कॉल करें अपने स्कोर को गिनें।
मेलामोकब

@ ममेलमोकबेट वाइज - मैंने कुछ नया सीखा। मैंने हमेशा यह माना कि नाम स्थान की आवश्यकता थी। इसके अलावा, टेस्ट एरे पर अच्छी पकड़ है, जो मुझे कुछ चार्ट बचाता है, और मैं अब वास्तव में चुनौती का जवाब दे रहा हूं।
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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.