どれくらい書く必要がありますか?


35

数字を書くことは、プログラミングのHelloの世界の1つであり、多くの場合1〜10です。

たくさんの数字を書きたい!多く、多くの数字。しかし、いくつの数字を書く必要がありますか?

仕事

整数の入力が与えられた場合、0から入力までの範囲のすべての整数を含む文字列に含まれる桁数を出力する数値を出力として指定します。否定識別子( "-")は単一の文字としてカウントされます。

I / Oの例

入力: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

Bash + OS X(BSD)ユーティリティ、24 22バイト

2バイトを節約してくれた@seshoumaraに感謝します。

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

Mac OS Xでのテストの実行:

$ 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バージョンは次のとおりです。

Bash + coreutils、40 38バイト

繰り返しますが、@ seshoumaraのおかげで2バイト節約されました。

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

オンラインでお試しください!


@tuskiomi BSDユーティリティを意味するときにcoreutilsを作成しました-負の入力でも動作するMac OS Xでテストしました(seqはGNU seqと同じではありません)。
ミッチェルスペクター

@DigitalTrauma Nice GNUソリューション。必要に応じて、自分で投稿してください。私の変種として数えるにはあまりにも異なると思います。
ミッチェルスペクター

わかりました、ここにいます :)
デジタル外傷

fold -1|wc -lカウントに使用するのはどうですか?短いです。
seshoumara

6

パイソン2、 8378、64バイト

最短バージョン:

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

@numbermaniacのおかげで、このバージョンでは5バイト節約されました。

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バイトの2行目で使用できますprint len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))。あなたは可能性があることラムダ行うことで、さらに保存します。
numbermaniac

1
@numbermaniacこの方法で似たようなことができますか?
-micsthepick

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

Java 7、74バイト(再帰-2番目のデフォルトパラメーターを含む)

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

Java 7、81 79バイト(ループ-単一パラメーター)

0何らかの理由で、この再帰的なアプローチに関してデフォルトの2番目のパラメーターを使用できない場合は、代わりに次のようなforループを使用できます。

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

Brachylog、5バイト

⟦ṡᵐcl

オンラインでお試しください!

範囲[0、input]を構築し、各数値を文字列に変換し、単一の文字列に連結して結果の長さを返します


TIOには議論があることに気付きましたZ。どうしたの?カウントに含める必要がありますか?
-steenbergh

3
@steenbergh:レオの提出は機能であり、完全なプログラムではありません。ZBrachylogインタープリターに引数を与えると、適切なラッパーを追加して関数をテスト可能にするように指示されます。(完全なプログラムとして実行した場合、出力は生成されません。)ここでプログラムまたは関数の送信を許可します。したがって、実際には送信の一部ではないため、バイトカウントに対してカウントされるべきではありません。

4

PHP、 59 60バイト

Roberto06によってOutgolfed - https://codegolf.stackexchange.com/a/112536/38505

おかげで 前のバージョンが負の数では機能しなかったことに気づいて roberto06にます。

単純に数字の配列を作成し、それを文字列に入れてから、数字(およびマイナス記号)をカウントします

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

例の実行: php -f 112504.php 8


これは負の入力では機能しません。こちらを参照してください
roberto06

エイリアスjoinであるimplodeため、代わりに3バイトを保存できます。
マリオ

マイナス-1バイトをエスケープする必要はありません。一方、あなたはあなたに正規表現を変更することができます[--9]
イェルクHülsermann

4

Haskell39 38バイト

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

オンラインでお試しください!編集:@xnorのおかげで1バイト保存されました!

説明:

Haskellでは、数値はからまでの範囲ab [a..b]あり、より大きいかどうかによって1増分または1減分になります。だから、正のための最初のリストで2つ目は空です。負の場合、2番目の範囲が得られ、最初の範囲は空になります。しかしながら、両方の範囲がリストをもたらすなら、それで、連結はの誤った結果をもたらすでしょう。それが特別なケースとして処理される理由です。abban[0..n]++[n..0][0,1,2,...,n]n[0,-1,-2,...,n]n=0[0][0,0]20

=<<リストの- 演算子はと同じconcatMapであるため、各数値はによって文字列に変換され、showそれらの文字列はすべて、1つの長い文字列に連結され、その文字列lengthが最終的に返されます。


xnorのヒントの前[0,signum n..n]に、の代わりに使用しました[0..n]++[n..0]signum n-1、負の数、0ゼロ、および1正の数であり、フォームの範囲は、[a,b..c]からaまでの数のリストcをincrementで作成します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

PHP、41 35バイト

user59178のおかげで6バイト節約

negativeの答えは否定的な入力に対して間違っていたので、新しいソリューションを構築するために自分自身にそれを取りました:

<?=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
さらに、「glue」パラメーターを省略することにより3つ。
user59178

のエイリアスがあることは知っていましたがimplode、gueパラメーターを省略できることは知りませんでした。ありがとう!
-roberto06


4

R、26 20バイト

sum(nchar(0:scan()))

非常に基本的なアプローチ:

  • ベクトルを0:xにする

  • 各値の文字を数えます(自動的に文字列に強制されます)

関数定義を削減するためのトリックがあるかどうかわからない? 代わりにstdinから入力を取得することにより、Giuseppeのおかげで6バイト節約されました。


sum(nchar(0:scan()))代わりに行うことができ、代わりにnstdinから読み取ることができます。
ジュゼッペ

4

Mathematica、48 47 46バイト

マーティン・エンダーのおかげで-1バイト!

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

引数として数値をとる無名関数。

Greg Martinによる短いソリューション、39バイト

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

1
あなたは使用することができるSign@#ため#/Abs@#
マーティンエンダー

1
わずかに異なるアプローチで数バイトを保存できます1-#~Min~0+Tr@IntegerLength@Range@Abs@#&。最初1の数字は0の数字を表し、-#~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

MATL、11バイト

0hSZ}&:VXzn

オンラインでお試しください!

0h           % Implicitly input n. Append a 0: gives array [n 0]
  S          % Sort
   Z}        % Split array: pushes 0, n or n, 0 according to the previous sorting
     &:      % Binary range: from 0 to n or from n to 0
       V     % Convert to string. Inserts spaces between numbers
        Xz   % Remove spaces
          n  % Length of string. Implicit display

3

PowerShell、23バイト

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

オンラインでお試しください!(非常に大きな(絶対)入力に対してTIOをバーフします)

..範囲演算子を使用し0て、入力から範囲を構成します$args(入力配列から変換する文字列としてキャストされます)。それは-join一緒に文字列(例:)にまとめられ、01234それからLengthが取得されます。それはパイプラインに残り、出力は暗黙的です。


この質問を読んだときに頭にあった正確な解決策
😝– briantist


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

JavaScript、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は、それ自体までのすべてに加えて改行で置き換えられます。これにより、nが正の場合は1〜nの範囲、-負の場合は開始時に追加で-1〜nの範囲が得られます。すべての数値は単項式であり、改行で区切られています。

1+
$.&

1の各シーケンスを対応する10進数に変換します。

^-?
0

0最初にa を置き、余分な部分がある-場合は置き換えます。

.

(非改行)文字の数を数えます。


3

Emacs、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-=

選択した領域で文字カウントを実行します。文字数はミニバッファーに出力されます。

ひどいハイライト色をおApびします。これは、入力100でこのコマンドを使用する例です。出力は、画面の下部にあるミニバッファーにあります。

Example execution with input of 100


うん、私は1つのキーストロークが1バイトであると確信しています。
-NoOneIsHere

@NoOneIsHereそれについて私は2つの考えがあります:1)Ctrl +文字をシングルバイトとして表現できますか?そして、2)Unicode文字を1バイトとして数える答えがここにたくさんありますが、そうではないので、CodeGolfには独自の「バイト」の定義があるのではないかと思いました。ありがとう。
シェリリウム

私は本当に知りません。ただし、Metaで確認できます。
-NoOneIsHere

3

Lua、52バイト

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

0-入力からforループを反復処理し、整数iを文字列に変換し、t印刷する前に文字列の長さを追加しますt



2

C#、77 73バイト

@Kevin Cruijssenのおかげで-4バイト

ラムダ関数:

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

ゴルフされていないテストケース付き:

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();
    }
}

toを変更しwhilefor、数バイトを保存できます:(r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};73バイト
ケビンクルーイッセン

@Kevin Cruijssenあなたは正しい、ありがとう。
氏困り者

おそらくintカウンターを使用し、ループ内に長さを追加して、いくつかのバイトを節約できます。にコンパイルする場合、2バイトを節約Func<int, int>するような関数を呼び出すことができr=>...ます(とにかくこれを行うことができます)。
TheLethalCoder

2

JavaScript、44バイト

f=(n,i=1)=>n<0?f(-n)-n:n<i?1:n+1-i+f(n,i*10)
<input type=number oninput=o.textContent=f(+this.value)><pre id=o>


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.