मुझे कितना लिखना है?


35

संख्याओं को लिखना प्रोग्रामिंग की हैलो दुनिया में से है, अक्सर संख्या 1-10।

मैं कई संख्याएँ लिखना चाहता हूँ! कई, कई संख्या। लेकिन मुझे कितने नंबर लिखने होंगे?

कार्य

पूर्णांक इनपुट को देखते हुए, आउटपुट के रूप में एक संख्या दें जो मुझे उन अंकों की संख्या देगा जो 0 से लेकर इनपुट तक के सभी पूर्णांक संख्याओं वाले स्ट्रिंग में होंगे। नकारात्मक पहचानकर्ता ("-") एक एकल वर्ण के रूप में गिना जाता है।

उदाहरण I / Os

इनपुट: 8
लिखित: 0,1,2,3,4,5,6,7,8
आउटपुट: 9

इनपुट: 101
लिखा हुआ: 0,1,2,3 ...., 99,100,101
आउटपुट: 196

इनपुट: 102
लिखा हुआ: 0,1,2,3 ...., 100,101,102
आउटपुट: 199

इनपुट -10
लिखा गया: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
आउटपुट: 22

यह एक । बाइट्स की सबसे कम संख्या जीतती है!

जवाबों:




11

रोड़ा , 23 बाइट्स

f x{[#([seq(0,x)]&"")]}

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

व्याख्या की:

f x{[#([seq(0,x)]&"")]}
f x{                  } /* Defines function f with parameter x. */
        seq(0,x)        /* Creates a stream of numbers from 0 to x. */
       [        ]       /* Creates an array. */
                 &""    /* Joins with "". */
     #(             )   /* Calculates the length of the resulting string. */
    [                ]  /* Returns the value. */


7

बैश + ओएस एक्स (बीएसडी) उपयोगिताओं, 24 22 बाइट्स

2 बाइट बचाने के लिए @seshoumara को धन्यवाद।

seq 0 $1|fold -1|wc -l

मैक ओएस एक्स पर टेस्ट रन:

$ for n in 8 101 102 -10 -1 0 1; do printf %6d $n; ./digitcount $n; done
     8       9
   101     196
   102     199
   -10      22
    -1       3
     0       1
     1       2

यहाँ एक GNU संस्करण है:

बैश + कोरुटिल्स, 40 38 बाइट्स

दोबारा, 2 बाइट्स ने @seshoumara को धन्यवाद दिया।

(seq $1 0;seq 0 $1)|uniq|fold -1|wc -l

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


@tuskiomi जब मैंने बीएसडी उपयोगिताओं का मतलब किया तो मैंने कोरुटिल्स लिखा - मैंने इसे मैक ओएस एक्स में परीक्षण किया, जहां यह नकारात्मक इनपुट पर भी काम करता है (seq वहाँ GNU seq के समान नहीं है)।
मिशेल स्पेक्टर

@DigitalTrauma नाइस GNU समाधान। आगे बढ़ें और यदि आप चाहें तो इसे स्वयं पोस्ट करें; मुझे लगता है कि मेरा एक संस्करण के रूप में गिनती करना बहुत अलग है।
मिशेल स्पेक्टर


fold -1|wc -lकाउंटिंग करने के लिए कैसे उपयोग करें ? यह छोटा है।
शेषमारा

6

पायथन 2, 83 , 78 64 बाइट्स

सबसे छोटा संस्करण:

lambda x:sum(map(len,map(str,(range(0,x+cmp(x,.5),cmp(x,.5))))))

इस संस्करण ने 5 बाइट्स को बचाया, @numbermaniac के लिए धन्यवाद:

x=input()
print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

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

यह एक मैं उसके बाद अपने साथ आया था (बाइट्स की एक ही राशि):

x=input()
print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

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


आप map78 बाइट्स के लिए दूसरी लाइन पर उपयोग कर सकते हैं print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1))))):। आप इसे मेमना बनाकर और भी अधिक बचा सकते हैं
नंबरमानसी

1
क्या मैं इस तरह से कुछ कर सकता हूं?
माईस्टेपिक

1
यहाँ @numbermaniac एक समतुल्य है:print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
micsthepick

lambda x:sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))71 बाइट्स के लिए
फेलिप नारदी बतिस्ता

6

जावा 7, 74 बाइट्स (पुनरावर्ती - दूसरा डिफ़ॉल्ट पैरामीटर सहित)

int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

स्पष्टीकरण (1):

int c(int r, int n){     // Recursive method with two integer parameters and integer return-type
                         // Parameter `r` is the previous result of this recursive method (starting at 0)
  r += (n+"").length();  //  Append the result with the current number's width
  return n > 0 ?         //  If the input is positive
     c(r, n-1)           //   Continue recursive method with n-1
    : n < 0 ?            //  Else if the input is negative
     c(r, n+1)           //   Continue recursive method with n+1
    ?                    //  Else (input is zero)
     r;                  //   Return the result
}                        // End of method

जावा 7, 81 79 बाइट्स (लूप - सिंगल पैरामीटर)

यदि एक डिफ़ॉल्ट दूसरा पैरामीटर है 0 इस पुनरावर्ती दृष्टिकोण के लिए वजह से किसी कारण से अनुमति नहीं है, तो इस तरह के लिए एक लूप का उपयोग किया जा सकता है:

int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

स्पष्टीकरण (2)

int d(int n){                 // Method with integer parameter and integer return-type
  String r = "x";             //  Initial String (with length 1 so we won't have to +1 in the end)
  for(int i=n; i != 0;        //  Loop as long as the current number isn't 0
      i += n < 0 ? 1 : 1)     //   After every iteration of the loop: go to next number
    r += i;                   //   Append String with current number
                              //  End of loop (implicit / single-line body)
  return r.length();          //  Return the length of the String
}                             // End of method

टेस्ट कोड:

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

class M{
  static int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

  static int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

  public static void main(String[] a){
    System.out.println(c(0, 8) + "\t" + d(8));
    System.out.println(c(0, 101) + "\t" + d(101));
    System.out.println(c(0, 102) + "\t" + d(102));
    System.out.println(c(0, -10) + "\t" + d(-10));
  }
}

आउटपुट:

9   9
196 196
199 199
22  22

1
मुझे यह समाधान पसंद है, :)
tuskiomi


4

ब्रेकीलॉग , 5 बाइट्स

⟦ṡᵐcl

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

सीमा [0, इनपुट] बनाता है, प्रत्येक संख्या को स्ट्रिंग में परिवर्तित करता है, एक स्ट्रिंग में समाप्‍त करता है और परिणाम की लंबाई लौटाता है


मैंने देखा कि TIO का एक तर्क है Z; उसके साथ क्या है? क्या यह गिनती में होना चाहिए?
स्टीनबर्गघ

3
@steenbergh: लियो की प्रस्तुति एक कार्य है, न कि एक पूर्ण कार्यक्रम। ZBrachylog दुभाषिया को तर्क देते हुए इसे फ़ंक्शन को परीक्षण योग्य बनाने के लिए एक उचित आवरण जोड़ने के लिए कहता है। (यदि आप इसे एक पूर्ण कार्यक्रम के रूप में चलाते हैं, तो यह किसी भी आउटपुट का उत्पादन नहीं करेगा।) हम यहां या तो प्रोग्राम या फंक्शन सबमिशन की अनुमति देते हैं, ताकि बाइट की गिनती के खिलाफ गिनती न हो, क्योंकि यह वास्तव में प्रस्तुत करने का हिस्सा नहीं है।

4

PHP, 59 60 बाइट्स

रॉबर्टो06 द्वारा बहिष्कृत - https://codegolf.stackexchange.com/a/112536/38505

Roberto06 के लिए धन्यवादपिछले संस्करण लिए नकारात्मक संख्याओं के लिए काम नहीं किया।

बस संख्याओं की एक सरणी बनाता है, इसे एक स्ट्रिंग में डालता है, फिर अंकों की गणना करता है (और ऋण चिह्न)

<?=preg_match_all("/\-|\d/",implode(",",range(0,$argv[1])));

उदाहरण चलाएँ: php -f 112504.php 8


यह एक नकारात्मक इनपुट के लिए काम नहीं करता है, यहाँ देखें
roberto06

आप joinइसके बजाय 3 बाइट्स बचा सकते हैं implodeक्योंकि यह एक उपनाम है।
मारियो

माइनस -1 बाइट से बचने की कोई आवश्यकता नहीं है। दूसरी ओर आप अपने करने के लिए regex बदल सकते हैं[--9]
Jörg Hülsermann

4

हास्केल , 39 38 बाइट्स

f 0=1
f n=length$show=<<[0..n]++[n..0]

इसे ऑनलाइन आज़माएं! संपादित करें: @xnor के लिए 1 बाइट धन्यवाद सहेजा गया!

स्पष्टीकरण:

संख्या के लिए हास्केल में aऔर b [a..b]सीमा से है aकरने के लिए b1-वेतन वृद्धि या 1-decrements, जो इस पर निर्भर में bबड़ा है a। तो एक सकारात्मक के nलिए पहली सूची [0..n]++[n..0]है [0,1,2,...,n]और दूसरी खाली है। नकारात्मक के nलिए दूसरी श्रेणी की पैदावार [0,-1,-2,...,n]और पहली वाली खाली है। हालाँकि, यदि n=0दोनों श्रेणियों की सूची प्राप्त होती है [0], तो संघनन का [0,0]गलत परिणाम निकलेगा 2। इसीलिए0 इसे एक विशेष मामले के रूप में संभाला जाता है।

=<<एक सूची पर -operator रूप में ही है concatMapइसलिए प्रत्येक संख्या से एक स्ट्रिंग में बदल जाता है, showऔर उन सभी तार एक लंबी स्ट्रिंग जिनमें से में concatenated रहे हैं lengthअंत में दिया जाता है।


एक्सनोर के टिप से पहले मैंने [0,signum n..n]इसके बजाय इस्तेमाल किया [0..n]++[n..0]signum nहै -1ऋणात्मक संख्याओं, के लिए 0शून्य के लिए और 1सकारात्मक संख्या के लिए और फार्म की एक श्रृंखला [a,b..c]से नंबर की सूची बनाता है aकरने के लिए cवेतन वृद्धि के साथ b। जिससे सकारात्मक और नकारात्मक के लिए [0,signum n..n]सीमा का निर्माण होता है । इसके लिए अनंत सूची का निर्माण होगा ताकि हमें एक विशेष मामले के रूप में भी संभालना पड़े ।[0,1,2,...,n]n[0,-1,-2,...,n]nn=0[0,0,0,...]0


मुझे लगता है कि के लिए [0..n]++[n..0]करना चाहिए [0,signum n..n]
xnor

4

पीएचपी, 41 35 बाइट्स

सहेजा गया 6 बाइट्स user59178 के लिए धन्यवाद

चूंकि नकारात्मक इनपुट के लिए Since का उत्तर गलत था, इसलिए मैंने एक नया समाधान बनाने के लिए इसे स्वयं लिया:

<?=strlen(join(range(0,$argv[1])));

यह समारोह:

  • से एक सरणी बनाता 0है$argv[1] (इनपुट उर्फ)
  • एक खाली चरित्र के साथ इसे लागू करता है (यानी इसे एक स्ट्रिंग में बदल देता है)
  • स्ट्रिंग की लंबाई गूँज

यहाँ यह कोशिश करो!


यह मेरा करने के लिए एक अच्छा समाधान है, idk क्यों मैंने सोचा था कि मैं ऐसा करना पड़ा preg_match():(
ʰᵈˑ

ठीक है, मैंने सोचा नहीं होगा कि range()यह आपके समाधान के लिए नहीं था, मुझे लगता है कि हम भी हैं;)
roberto06

1
के join()बजाय का उपयोग करके आप 3 बाइट्स बचा सकते हैं implode()। यह उसी चीज के लिए एक उपनाम है। php.net/manual/en/function.join.php
user59178

1
और 'गोंद' पैरामीटर को छोड़ कर 3 अधिक।
user59178

मुझे पता था कि इसके लिए एक उपनाम था implode, लेकिन मुझे नहीं पता था कि मैं जीयू पैरामीटर को छोड़ सकता हूं। धन्यवाद !
रॉबर्टो 06

4

रूबी , 20 26 29 बाइट्स

->x{[*x..-1,0,*1..x]*''=~/$/}

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


क्यों बढ़ी?
ब्रायन मिंटन

पहला संस्करण नकारात्मक संख्याओं के लिए काम नहीं करता था, दूसरे संस्करण में इनपुट के रूप में शून्य की समस्या थी।
जीबी

4

आर, 26 20 बाइट्स

sum(nchar(0:scan()))

बहुत बुनियादी दृष्टिकोण:

  • एक वेक्टर बनाएं 0: x

  • प्रत्येक मान में वर्णों की गणना करें (स्वचालित रूप से एक स्ट्रिंग के लिए मजबूर किया जाएगा)

  • योग

निश्चित नहीं अगर फ़ंक्शन की परिभाषा को काटने के लिए कोई चाल है? इसके बजाय स्टड से इनपुट लेकर 6 बाइट्स ने ग्यूसेप को धन्यवाद दिया।


आप sum(nchar(0:scan()))इसके बजाय nस्टड से पढ़ सकते हैं और कर सकते हैं ।
ग्यूसेप

4

मेथेमेटिका, ४hem ४ 48 46 बाइट्स

मार्टिन एंडर को -1 बाइट !

StringLength[""<>ToString/@Range[0,#,Sign@#]]&

अनाम फ़ंक्शन, संख्या को तर्क के रूप में लेना।

ग्रेग मार्टिन , 39 बाइट्स द्वारा छोटा समाधान

1-#~Min~0+Tr@IntegerLength@Range@Abs@#&

1
आप के Sign@#लिए उपयोग कर सकते हैं #/Abs@#
मार्टिन एंडर

1
आप थोड़े अलग दृष्टिकोण के साथ कुछ बाइट्स बचा सकते हैं 1-#~Min~0+Tr@IntegerLength@Range@Abs@#&:। 10 के अंक के लिए प्रारंभिक खाते, जबकि -#~Min~0इनपुट नकारात्मक होने पर सभी नकारात्मक संकेतों के लिए खाते हैं।
ग्रेग मार्टिन

3

बैच, 110 बाइट्स

@set/a"n=%1,t=n>>31,n*=t|1,t=1-t*n,i=0
@for /l %%i in (0,1,9)do @set/a"t+=(i-n)*(i-n>>31),i=i*10+9
@echo %t%

गणना करता है sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1)। (मुझे केवल 9बैच के पूर्णांक अंकगणितीय की सीमाओं के कारण ऊपर जाना है ।)




3

पॉवरशेल , 23 बाइट्स

-join(0.."$args")|% Le*

इसे ऑनलाइन आज़माएं!(बहुत बड़े (निरपेक्ष) इनपुट्स के लिए TIO पर बारफ)

..रेंज ऑपरेटर को 0इनपुट से रेंज बनाने के लिए उपयोग करता है $args(इनपुट एरे से परिवर्तित करने के लिए एक स्ट्रिंग के रूप में कास्ट करें)। यह -joinएक स्ट्रिंग (जैसे 01234) में एक साथ एड है और फिर Leएनजीओ को लिया जाता है। यह पाइपलाइन पर छोड़ दिया गया है और आउटपुट निहित है।


जब मैंने यह प्रश्न पढ़ा तो मेरे दिमाग में इसका सटीक समाधान था
ri ब्रायंटिस्ट


3

QBIC , 25 बाइट्स

:[0,a,sgn(a)|A=A+!b$]?_lA

स्पष्टीकरण:

:[0,a     Read 'a' from the cmd line, start a FOR loop from 0 to 'a'
,sgn(a)|  with incrementer set to -1 for negative ranges and 1 for positive ones
A=A+!b$   Add a string cast of each iteration (var 'b') to A$
]         NEXT
?_lA      Print the length of A$

3

जावास्क्रिप्ट, 50 बाइट्स

@ETHproductions के साथ सहयोग किया गया

n=>{for(t="";n;n<0?n++:n--)t+=n;alert(++t.length)}


3

रेटिना , 28 बाइट्स

\d+
$*
1
$`1¶
1+
$.&
^-?
0
.

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

व्याख्या

\d+
$*

साइन को अछूता रखते हुए, संख्या को एकात्मक में बदलें।

1
$`1¶

प्रत्येक 1 को अपने आप में सब कुछ बदल दिया जाता है और साथ ही एक नई पंक्ति। इसके साथ हमें 1 से n तक की रेंज मिलती है अगर n पॉजिटिव था, तो -1 से n -तक शुरू में एक अतिरिक्त के साथ अगर यह नकारात्मक था। सभी नंबरों को एकसूत्र में बांधा गया है और नई कहानियों से अलग किया गया है।

1+
$.&

उनमें से प्रत्येक अनुक्रम को संबंधित दशमलव संख्या में परिवर्तित करें।

^-?
0

0शुरू में रखो , -अगर यह है तो अतिरिक्त की जगह ।

.

(गैर-नई पंक्ति) वर्णों की संख्या की गणना करें।


3

एमएसीएस, 20 बाइट्स

C-x ( C-x C-k TAB C-x ) M-{input} C-x e C-x h M-=

कमांड स्वयं 20 कीस्ट्रोक्स है, लेकिन मुझे इस पर स्पष्टीकरण की आवश्यकता है कि इसे बाइट्स के रूप में कैसे गिना जाना चाहिए। मैंने तर्क दिया कि प्रत्येक कीस्ट्रोके को 1 बाइट के रूप में गिनना सबसे उचित होगा। ऊपर दिए गए आदेश को आसान पढ़ने के लिए पारंपरिक रूप से लिखा गया है।

व्याख्या

C-x (

एक कीबोर्ड मैक्रो को परिभाषित करना शुरू करें।

C-x C-k TAB

एक नया मैक्रो काउंटर बनाएँ। 0बफर को लिखता है; काउंटर का मान अब 1 है।

C-x )

अंत कीबोर्ड मैक्रो परिभाषा।

M-{input} C-x e

META मारने के बाद, अपने इनपुट नंबर को टाइप करें। C-x eतो मैक्रो कई बार निष्पादित करता है।

C-x h

बफर की शुरुआत के लिए चिह्न सेट करें (जो इस प्रकार उत्पन्न पाठ के सभी का चयन करता है)।

M-=

चयनित क्षेत्र पर वर्ण गणना चलाएँ। पात्रों की संख्या मिनीबफ़र में मुद्रित की जाएगी।

उदाहरण

भयानक हाइलाइटिंग रंग के लिए माफी। यह इनपुट 100 के साथ इस कमांड का उपयोग करने का एक उदाहरण है। आउटपुट स्क्रीन के निचले भाग में मिनीबफ़र में है।

100 के इनपुट के साथ उदाहरण निष्पादन


हाँ, मुझे पूरा यकीन है कि एक कीस्ट्रोके एक बाइट है।
NoOneIsHere

@NoOneIsHere मेरे बारे में दो विचार हैं: 1) क्या Ctrl + चरित्र को एकल बाइट के रूप में दर्शाया जा सकता है? और 2) मुझे यहाँ बहुत से जवाब मिलते हैं कि यूनिकोड वर्णों को एक बाइट के रूप में गिना जा रहा है, लेकिन वे नहीं हैं, इसलिए मैंने सोचा कि शायद कोडगॉल्फ की शायद "बाइट" की अपनी परिभाषा है? धन्यवाद।
चेरिलियम

मैं वास्तव में नहीं जानता। लेकिन आप मेटा पर पूछ सकते हैं ।
NoOneIsHere

3

लुआ, 52 बाइट्स

t=0;for i=0,io.read()do t=t+#tostring(i)end;print(t)

0 से एक लूप के माध्यम से Iterates - इनपुट, पूर्णांक iको एक स्ट्रिंग में कनवर्ट करता है और tमुद्रण से पहले स्ट्रिंग की लंबाई जोड़ता हैt



2

सी #, 77 73 बाइट्स

-4 बाइट्स @ केविन क्रूज़सेन को धन्यवाद

लंबोतरा समारोह:

(r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};

Ungolfed और परीक्षण मामलों के साथ:

class P
{
    delegate int numbers(int e);
    static void Main()
    {
        numbers n = (r) =>
        {
            var l = ""; 
            for (int i = 0, s = r < 0 ? -1 : 1; i != r + s; i += s)
                l += i; 
            return l.Length;
        };
        System.Console.WriteLine(n(8));
        System.Console.WriteLine(n(101));
        System.Console.WriteLine(n(102));
        System.Console.WriteLine(n(-10));
        System.Console.ReadKey();
    }
}

आप बाइट्स के एक जोड़े को बचाने के whileलिए बदल सकते हैं for: (r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};( 73 बाइट्स )
केविन क्रूज़सेन

@ केविन क्रूज़सेन आप सही हैं, धन्यवाद।
श्री स्कैपग्रेस

आप शायद एक इंट काउंटर का उपयोग कर सकते हैं और कुछ बाइट्स को बचाने के लिए लूप के अंदर की लंबाई जोड़ सकते हैं। यदि आप एक संकलन करते हैं, Func<int, int>तो आप r=>...2 बाइट्स को बचाने के लिए फ़ंक्शन को कॉल कर सकते हैं (शायद वैसे भी ऐसा कर सकते हैं)।
लीथलकोडर


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.