(केविनसी) त्रिकोणीय DeciDigits अनुक्रम


19

इनपुट:

एक सकारात्मक पूर्णांक n जो है 1 <= n <= 25000

आउटपुट:

  1. इस क्रम में हम दशमलव संख्या 1 / n से शुरू करते हैं ।
  2. फिर हम अल्पविराम (1-अनुक्रमित) के बाद n 'वें अंक तक अंकों का योग लेते हैं ; ( n -1) th, तब तक ( n -2) th, आदि तक अंकों का योग जारी रहेगा n , 1है।
  3. आउटपुट इन सभी संयुक्त का योग है।

उदाहरण के लिए:

n = 7
1/7 = 0.1428571428...
7th digit-sum = 1+4+2+8+5+7+1 = 28
6th digit-sum = 1+4+2+8+5+7 = 27
5th digit-sum = 1+4+2+8+5 = 20
4th digit-sum = 1+4+2+8 = 15
3rd digit-sum = 1+4+2 = 7
2nd digit-sum = 1+4 = 5
1st digit     = 1
Output = 28+27+20+15+7+5+1 = 103

चुनौती नियम:

  • यदि 1 / n के दशमलव में अल्पविराम के बाद n अंक नहीं हैं , तो लापता लोगों को 0 (यानी 1/2 = 0.50 => (5+0) + (5) = 10) के रूप में गिना जाएगा ।
  • आप (यानी के अंकों गोलाई बिना अंक ले 1/6रहे हैं 166666और नहीं 166667)

सामान्य नियम:

  • मानक नियम आपके उत्तर के लिए लागू होते हैं , इसलिए आपको उचित पैरामीटर, पूर्ण कार्यक्रमों के साथ STDIN / STDOUT, फ़ंक्शन / विधि का उपयोग करने की अनुमति है। तुम्हारा फोन।
  • डिफ़ॉल्ट लूपोल्स निषिद्ध हैं।
  • यदि संभव हो, तो कृपया अपने कोड के लिए एक परीक्षण के साथ एक लिंक जोड़ें।
  • इसके अलावा, यदि आवश्यक हो तो एक स्पष्टीकरण जोड़ें।

अनुक्रम में पहला 1 - 50:

0, 10, 18, 23, 10, 96, 103, 52, 45, 10, 270, 253, 402, 403, 630, 183, 660, 765, 819, 95, 975, 1034, 1221, 1500, 96, 1479, 1197, 1658, 1953, 1305, 1674, 321, 816, 2490, 2704, 4235, 2022, 3242, 2295, 268, 2944, 3787, 3874, 4097, 1980, 4380, 4968, 3424, 4854, 98

अंतिम 24990 - 25000 अनुक्रम में:

1405098782, 1417995426, 1364392256, 1404501980, 1408005544, 1377273489, 1395684561, 1405849947, 1406216741, 1142066735, 99984

8
क्या किसी ने मेरे नाम का उल्लेख किया है?
केविन

जवाबों:


6

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

R⁵*:%⁵+\S

बल्कि धीमी, लेकिन छोटी। इसे ऑनलाइन आज़माएं! या पहले 50 परीक्षण मामलों की पुष्टि करें

यह काम किस प्रकार करता है

R⁵*:%⁵+\S  Main link. Argument: n

R          Range; yield [1, ..., n].
 ⁵*        10 power; yield [10**1, ..., 10**n].
   :       Divide each power by n.
    %⁵     Take each quotient modulo 10.
           This yields all desired decimal digits.
      +\   Take the cumulative sum of the digits.
        S  Take the sum.

15

गणितज्ञ, 42 बाइट्स

#&@@RealDigits[1/#,10,#,-1].(#-Range@#+1)&

या

#&@@RealDigits[1/#,10,#,-1].Range[#,1,-1]&

या

Tr@Accumulate@#&@@RealDigits[1/#,10,#,-1]&

व्याख्या

चुनौती की कल्पना से उदाहरण लें। हम गणना करना चाहते हैं:

  1+4+2+8+5+7+1
+ 1+4+2+8+5+7
+ 1+4+2+8+5
+ 1+4+2+8
+ 1+4+2
+ 1+4
+ 1

Rearranging, यह है:

  1*7 + 4*6 + 2*5 + 8*4 + 5*3 + 7*2 + 1*1
= (1, 4, 2, 8, 5, 7, 1) . (7, 6, 5, 4, 3, 2, 1)

जहां .दो वैक्टर का अदिश उत्पाद है।

सभी समाधान बहुत सुंदर है।

#&@@RealDigits[1/#,10,#,-1]

यह हमें पहले हो जाता है Nकी दशमलव अंक 1/N(#&@@ का पहला तत्व निकालता हैRealDigits परिणाम क्योंकि यह भी पहले अंक की भरपाई करता है जिसकी हमें परवाह नहीं है)।

तब हमें सूची Nनीचे 1या तो उपयोग करने से मिलती है , (#-Range@#+1)या फिर Range[#,1,-1]दोनों की तुलना में छोटी होती हैReverse@Range@# , और अदिश उत्पाद लेते हैं।

इसके बजाय वैकल्पिक समाधान Accumulateसभी उपसर्गों की सूची की गणना करने के लिए उपयोग करता है और फिर उन उपसर्गों को जोड़ देता हैTr

चूंकि यह वास्तव में बड़े इनपुट के लिए भी तेज है, यहां अनुक्रम का एक बिखराव साजिश है N = 100,000( उन सभी को करने और उन्हें साजिश रचने में थोड़ी देर लगी हालांकि):

यहाँ छवि विवरण दर्ज करें
बड़े संस्करण के लिए क्लिक करें।

नीली रेखा भोली ऊपरी सीमा है 9 N (N+1) / 2(यदि सभी दशमलव अंक थे9 ) और नारंगी रेखा आधी है। अप्रत्याशित रूप से यह कथानक की मुख्य शाखा के अंदर से सही है, क्योंकि सांख्यिकीय रूप से, हम औसत अंक 4.5 होने की उम्मीद करेंगे।

कथानक बिंदुओं की पतली रेखा जो आप मुख्य शाखा के नीचे देख सकते हैं ...3333..., वे अंश हैं जो अंत में आते हैं , क्योंकि वे सभी बहुत करीब हैं 3 N (N+1) / 2


बहुत अच्छा जवाब, और मुझे ग्राफ-प्लॉट पसंद है! यह लगभग दुर्भाग्यपूर्ण है कि यह सबसे छोटा नहीं है और मैं इसे उत्तर के रूप में स्वीकार नहीं कर सकता। :) अगर मैं नहीं भूलता तो मैं दो दिनों में दिए गए साधारण असाइनमेंट की तुलना में बहुत अधिक जवाब देने के लिए एक छोटा सा इनाम दे सकता हूं।
केविन क्रूज़सेन

1
@ केविनक्रूजसेन धन्यवाद! :)
मार्टिन एंडर

6

05AB1E , 12 11 बाइट्स

Di<ë°¹÷.pSO

इसे ऑनलाइन आज़माएं! या पहले 50 नंबर के लिए टेस्ट सूट

व्याख्या

              # implicit input n
Di<           # if n == 1 then 0
   ë          # else
    °¹÷       # 10^n // n
       .p     # get prefixes
         SO   # sum digits

TIO पर बड़ी संख्या में प्रयास करने के लिए एक अधिक कुशल संस्करण

छोटे संस्करण का अंतर यह है कि यहाँ हम उपसर्गों में अंकों के बजाय अंकों के उत्पाद और उनके 1-आधारित सूचकांक के उलट का योग करते हैं।

Di<ë°¹÷SDgLR*O

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


5

जावा 8, 181 169 166 153 142 बाइट्स

import java.math.*;n->{int m=n+2,r=0,i;for(;m>2;)for(i=m--;i-->2;r+=(BigDecimal.ONE.divide(new BigDecimal(n),n,3)+"").charAt(i)-48);return r;}

स्पष्टीकरण:

इसे यहाँ आज़माएँ।

import java.math.*;   // Required import for BigDecimal

n->{                  // Method with integer as both parameter and return-type
  int m=n+2,          //  Copy of the input-integer plus 2
      r=0,            //  Result-integer, starting at 0
      i;              //  Index-integer
  for(;m>2;)          //  Loop (1) as long as `m` is larger than 2
    for(i=m--;        //   Set index `i` to `m`, and decrease `m` by one afterwards
        i-->2;        //   Inner loop (2) from `m` down to 2 (inclusive)
      r+=             //    Add to the result-sum:
         (BigDecimal.ONE.divide(
                      //     1 divided by,
           new BigDecimal(n),
                      //     the input
           n,3)       //     With the minimal required precision
          +"")        //     Convert this to a String
          .charAt(i)  //     Take the character of this String at index `i`
          -48         //     And convert it to a number
     );               //   End of inner loop (2)
                      //  End of loop (1) (implicit / single-line body)
  return r;           //  Return result
}                     // End of method

4

PHP, 66 65 बाइट्स

for($b=$c=$argv[$a=1];$c;)$o+=$c--*(($a=10*($a%$b))/$b^0);echo$o;

इस उत्तर से अनुकूलित (मेरे द्वारा भी): इतनी कम संख्या का विभाजन नहीं और जार्ग हुल्सरमैन ने इसे संपादित करने का सुझाव दिया। जैसे उपयोग करें:

php -r "for($b=$c=$argv[$a=1];$c;)$o+=$c--*(($a=10*($a%$b))/$b^0);echo$o;" 7

संपादित करें: +1 बाइट्स के लिए बग को ठीक किया और $ 1 में $ argv [1] के असाइनमेंट को -2 बाइट्स के लिए शुद्ध 1 बाइट से कम कर दिया।


3

स्काला, 84 बाइट्स

val b=BigDecimal
def?(& :Int)=1 to&map(x=>(""+b(1)/b(&))slice(2,x+2)map(_-48)sum)sum

Ungolfed:

def f(n: Int)={
  val digits = ""+BigDecimal(1)/BigDecimal(n)
  (1 to n).map( x=>
    digits.slice(2, x+2).map(d => d - 48).sum
  ).sum

स्पष्टीकरण:

val b=BigDecimal   //define an alias for BigDecimal
def?(& :Int)=      //define a method called ? with an integer & as a parameter
  1 to &           //create a range from 1 to &
  map(x=>          //for each number x...
    (""+b(1)/b(&))   //calculate the fraction
    slice(2,x+2)     //and take the slice starting from the third element,
                     //(dropping the "1.") and containing x elements
    map(_-48)        //for each char, subtract 48 to get the integer value
    sum              //and sum them
  )sum             //and take the sum

मैं संकलक के टोकन के तरीके का दोहन करके कुछ बाइट्स बचा सकता था: तर्क को कॉल करके &, आप 1 to&mapइसके बजाय लिख सकते हैं 1 to n map। उसी नियम पर लागू होता है def?


3

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

’aµR⁵*:µDFS

TryItOnline
पहले 50

बड़े परीक्षण मामलों के लिए बहुत धीमा।

कैसे?

’aµR⁵*:µDFS - Main link: n
’           - decrement
 a          - and (to handle special case where n=1, to return 0 rather than 10)
  µ         - monadic chain separation
   R        - range: [1,2,...n]
    ⁵       - literal 10
     *      - exponentiation: [10,100,...,10^n]
      :     - integer division: [10//n,100//n,...,10^n//n]
       µ    - monadic chain separation
        D   - cast to a decimal list [[digits of 10//n],[digits of 100//n],...]
         F  - flatten into one list
          S - sum

2
मुझे नहीं लगता कि मैंने पहले कभी एक जेली का उत्तर देखा है जहां स्पष्टीकरण एक सीधी रेखा है ;-)
ETHproductions

मैंने लगभग R⁵*बायें से दायें समतुल्य रखा, लेकिन फिर अच्छी सीधी रेखा देखी :)
योनातन एलन

3

PHP, 76 बाइट्स

(एडिट -1 बाइट - धन्यवाद user59178 - आपका समाधान और भी बेहतर है)

for($c=substr(bcdiv(1,$a=$argv[1],$a),2);$i<$a;)$s+=($a-$i)*$c[$i++];echo$s;

आप एक बाइट (एक अर्धविराम) $c=blahको पहले भाग में सहेज कर बचा सकते हैंfor(;;)
user59178

2

MATL, 19 बाइट्स

li/GEY$4LQ)!UYsG:)s

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

व्याख्या

l       % Push a 1 literal to the stack
i/      % Grab the input (n) and compute 1/n
GE      % Grab the input again and multiply by 2 (2n)
Y$      % Compute the first 2n digits of 1/n after the decimal
4LQ)    % Get only the digits past the decimal point
!U      % Convert to numbers
Ys      % Compute the cumulative sum
G:)     % Get the first n terms
s       % Sum the result and implicitly display

2

ग्रूवी, 87 बाइट्स

यह मेरे अनुमान से कम दर्दनाक था, और यहाँ मेरे उत्तर पर आधारित है :

{n->(1..n).collect{x->(1.0g.divide(n, n, 1)+"")[2..x+1].getChars().sum()-48*(x)}.sum()}

व्याख्या

1.0g - एक के लिए BigDecimal संकेतन का उपयोग करें।

.divide(n, n, 1)+"" - n परिशुद्धता (केवल BigDecimal फ़ंक्शन) के साथ n से विभाजित करें और str में कनवर्ट करें।

(...)[2..x+1].getChars() - चार की एक सरणी के रूप में वर्तमान पुनरावृत्ति का विकल्प प्राप्त करें।

.sum()-48*(x)- पात्रों के ASCII मानों को योग करें और प्रत्येक तत्व के लिए 48 से कम करें। यह एक ASCII अंक से एक पूर्णांक को अनिवार्य रूप से बाइट को बचाने के लिए मान को बदल देता है *.toInteger()

(1..n).collect{...}.sum() - डिवीजन में प्रत्येक अंक पर Iterate करता है, इस फ़ंक्शन को करते हुए, उन सभी को एकल सरणी और योग में प्राप्त करें।

सहेजे गए 2 बाइट्स और बलिदान की क्षमता ...

यह एक अधिक कुशल संस्करण है जो बिगडेसिमल को प्रत्येक पुनरावृत्ति में पुनर्गणना नहीं करता है।

{n->i=1.0g.divide(n, n, 1)+"";(1..n).collect{x->i[2..x+1].getChars().sum()-48*(x)}.sum()}

2

जे, 27 बाइट्स

1#.[:+/\-{.10#.inv%<.@*10^]

प्रयोग

इनपुट एक विस्तारित पूर्णांक है।

   f =: 1#.[:+/\-{.10#.inv%<.@*10^]
   (,.f"0) (>: i. 50x) , 24990x + i. 11
    1          0
    2         10
    3         18
    4         23
    5         10
    6         96
    7        103
    8         52
    9         45
   10         10
   11        270
   12        253
   13        402
   14        403
   15        630
   16        183
   17        660
   18        765
   19        819
   20         95
   21        975
   22       1034
   23       1221
   24       1500
   25         96
   26       1479
   27       1197
   28       1658
   29       1953
   30       1305
   31       1674
   32        321
   33        816
   34       2490
   35       2704
   36       4235
   37       2022
   38       3242
   39       2295
   40        268
   41       2944
   42       3787
   43       3874
   44       4097
   45       1980
   46       4380
   47       4968
   48       3424
   49       4854
   50         98
24990 1405098782
24991 1417995426
24992 1364392256
24993 1404501980
24994 1408005544
24995 1377273489
24996 1395684561
24997 1405849947
24998 1406216741
24999 1142066735
25000      99984

प्रदर्शन अच्छा है और केवल बड़े परीक्षण मामलों की गणना के लिए लगभग 3 सेकंड की आवश्यकता होती है।

   timex 'f 7x'
0.000119
   timex 'f 24999x'
3.8823
   timex 'f 25000x'
3.14903

व्याख्या

1#.[:+/\-{.10#.inv%<.@*10^]  Input: n
                          ]  Get n
                       10^   Raise 10 to the nth power
                  %          Get the reciprocal of n
                      *      Multiply (1/n) with (10^n)
                   <.@       Floor it
           10#.inv           Convert it to a list of base 10 digits
        -                    Negate n
         {.                  Take the last n values from the list of digits
                             (This is to handle the case for n = 1)
   [:  \                     For each prefix of the list of digits
     +/                        Reduce it using addition to get the sum
1#.                          Convert those sums as base 1 digits and return
                             (This is equivalent to taking the sum)

2

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

⁵*:⁸D+\_ỊS

नहीं कम से कम दृष्टिकोण है, लेकिन काफी कुशल। इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें

यह काम किस प्रकार करता है

⁵*:⁸D+\_ỊS  Main link. Argument: n (integer)

⁵*          Yield 10**n.
  :⁸        Divide 10**n by n (integer division).
    D       Convert the quotient to base 10.
     +\     Take the cumulative sum of the digits.
        Ị   Insignificant; yield (abs(n) <= 1).
       _    Subtract the resulting Boolean from each decimal digit.
            This takes care of edge case n = 1, which would return 2 otherwise.
         S  Take the sum.

1

पायथन 2, 90 बाइट्स

lambda o:sum([sum([int(i)for i in s])for s in map(lambda x:str(1.0/o)[2:x],range(3,3+o))])

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


1

जावास्क्रिप्ट (ईएस 6), 47 बाइट्स

f=(b,a=1%b,c=b+1)=>c&&(a/b|0)*c+f(b,a%b*10,c-1)

यह काम किस प्रकार करता है

यह उत्तर a / b के c दशमलव अंकों की गणना के लिए एक तकनीक प्रदर्शित करता है :

f=(a,b,c,d=".")=>~c?(a/b|0)+d+f(a%b*10,b,c-1,""):d

यह इस चुनौती के लिए एक उत्कृष्ट प्रारंभिक बिंदु बना देगा। पहले हम इसे थोड़ा बदल सकते हैं ताकि यह मापदंडों को फिर से परिभाषित करके और डिफ़ॉल्ट सेटिंग सेट करके 1 / b के b दशमलव अंकों की गणना करे :

f=(b,a=1,c=b,d=".")=>~c?(a/b|0)+d+f(b,a%b*10,c-1,""):d

अगला हम इसे बदल सकते हैं ताकि यह पहले बी दशमलव अंकों की राशि की गणना करे , बजाय उन्हें समाप्‍त किए (यह dपैरामीटर के साथ दूर होता है ):

f=(b,a=1,c=b)=>~c?(a/b|0)+f(b,a%b*10,c-1):0

हम लगभग एक समाधान के लिए कर रहे हैं; अब हमें बस इसे c + 1 द्वारा प्रत्येक अंक को गुणा करने की आवश्यकता है :

f=(b,a=1,c=b)=>~c?(a/b|0)*-~c+f(b,a%b*10,c-1):0

हम्म, यह थोड़ा लंबा लगता है। क्या होगा अगर हम शुरू करने के लिए 1 से c बढ़ाते हैं ?

f=(b,a=1,c=b+1)=>c?(a/b|0)*c+f(b,a%b*10,c-1):0

कि एक बाइट बचाता है। और यहाँ एक तरीका है एक और बचाने के लिए:

f=(b,a=1,c=b+1)=>c&&(a/b|0)*c+f(b,a%b*10,c-1)

और अब हमारे पास जवाब नहीं है। f(7)103 है, f(11)270 है, f(1)है ... 2? ओह, हम उस मामले के लिए जवाब देना भूल गए हैं जहां ए / बी पहली यात्रा पर 1 है (यानी बी 1 है)। आइए इस बारे में कुछ करें:

f=(b,a=1%b,c=b+1)=>c&&(a/b|0)*c+f(b,a%b*10,c-1)

1 आधुनिक ख हमेशा होता है 1 , जब तक कि है 1 , जिस स्थिति में यह हो जाएगा 047 बाइट्स पर हमारा प्रोग्राम अब सभी इनपुट के लिए सही है ।


1

पायथन 2, 49 बाइट्स

lambda n:sum(10**-~k/n%10*(n-k)for k in range(n))

Ideone पर इसका परीक्षण करें ।


0

सी, 53 बाइट्स

f(n,i,x,s){while(i)x=10*(x%n),s+=i--*(x/n);return s;}

कुछ परीक्षण करने के लिए मुख्य के नीचे ...

//44,79
#define R return
#define F for
#define U unsigned
#define N int
#define B break
#define I if
#define L(i) for(;i-->0;)
#define J(a,b)  if(a)goto b
#define G goto
#define P printf
#define D double
#define C unsigned char
#define A getchar()
#define O putchar
#define M main
#define Y malloc
#define Z free
#define S sizeof
#define T struct
#define E else
#define Q static
#define X continue  
main()
{N  k, a=0, b=0, i;

 F(i=1;i<50;++i) 
       P("f(%u)=%u |", i, f(i,i,1,0));
 P("\n");
 F(i=24990;i<=25000;++i) 
       P("f(%u)=%u |", i, f(i,i,1,0));
 P("\n");
 R 0;
}

/*
f(1)=0 |f(2)=10 |f(3)=18 |f(4)=23 |f(5)=10 |f(6)=96 |f(7)=103 |f(8)=52 |f(9)=45
f(10)=10 |f(11)=270 |f(12)=253 |f(13)=402 |f(14)=403 |f(15)=630 |f(16)=183 |f(17)=660 
f(18)=765 |f(19)=819 |f(20)=95 |f(21)=975 |f(22)=1034 |f(23)=1221 |f(24)=1500
f(25)=96 |f(26)=1479 |f(27)=1197 |f(28)=1658 |f(29)=1953 |f(30)=1305 |f(31)=1674
f(32)=321 |f(33)=816 |f(34)=2490 |f(35)=2704 |f(36)=4235 |f(37)=2022 |f(38)=3242
f(39)=2295 |f(40)=268 |f(41)=2944 |f(42)=3787 |f(43)=3874 |f(44)=4097 |f(45)=1980
f(46)=4380 |f(47)=4968 |f(48)=3424 |f(49)=4854 |
f(24990)=1405098782 |f(24991)=1417995426 |f(24992)=1364392256 |f(24993)=1404501980
f(24994)=1408005544 |f(24995)=1377273489 |f(24996)=1395684561 |f(24997)=1405849947 
f(24998)=1406216741 |f(24999)=1142066735 |f(25000)=99984 
*/

किसी ने इसे वोट क्यों दिया? क्या यह कुछ बग के कारण है? क्या यह इसलिए है क्योंकि मुझे उसके लिए सही मंत्री नहीं मिला है? मेरे लिए चार की संख्या पर्याप्त है और ठीक है कि इस उत्तर को भी कैसिल के लिए स्वतंत्र महसूस करो, जहां मैं बोल नहीं सकता हूं
RosLuP

3
जैसा कि अन्य लोगों ने आपके अन्य उत्तरों पर टिप्पणी की है, कोड गोल्फ का बिंदु कोड को यथासंभव छोटा बनाना है , फिर भी आप बिना किसी अच्छे कारण के मैक्रोज़ का एक गुच्छा शामिल करना जारी रखते हैं। f(n,i,x,s){while(i)x=10*(x%n),s+=i--*(x/n);return s;}केवल 53 बाइट्स लंबी है।
डेनिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.