私の番号はどのくらいですか:制限付きバージョン


8

ここで元の課題を見つけます

チャレンジ

Z範囲内の整数を指定すると、-2^31 < Z < 2^31その数値の桁数を出力します(基数10)。

ルール

文字列関数は使用しないでください(オーバーロードの場合、文字列関数と整数関数の両方として機能する関数に文字列を渡してはなりません)。数値を文字列として保存することはできません。

すべての数学関数が許可されます。

入力は任意の基数で取得できますが、出力は基数10の数値の長さでなければなりません。

負の数のマイナス記号は数えません。数値が10進数になることはありません。

ゼロは実質的に先行ゼロなので、ゼロまたは 1桁にすることができます。

Input > Output

-45 > 2
1254 > 4
107638538 > 9
-20000 > 5
0 > 0 or 1
-18 > 2

勝利

バイト単位の最短コードが優先されます。


配列関数もないと思いますか?
Cyoce

@Cyoceはい、配列関数はありません
Beta Decay

言語が入力を文字列としてのみ受け入れる場合、このチャレンジには無効ですよね?
エンジニアトースト2017年

@EngineerToastはい、非常にそうです
Beta Decay

制限されたソースタグを削除します。これは制限ですが、コンピュータで扱いにくいという点で、実際のソース制限ではないためです。
アドホックガーフハンター2017

回答:


9

Mathematica、13バイト

IntegerLength

上手...


codegolf.meta.stackexchange.com/a/3605/14732によると、これによりこの質問は重複します。
イスマエルミゲル

@IsmaelMiguelええと、これは少しトリッキーなケースです。チャレンジは一部の言語では事実上重複していますが、他の言語ではまったく同じではないためです。
マーティンエンダー2017年

そこにあるほとんどの回答は、ここにコピーできます。
Ismael Miguel

@IsmaelMiguel私は行って数える必要がありますが、以前のチャレンジの回答の大部分はここではオプションではない文字列処理を使用したと思います。
マーティンエンダー2017年

ええ、私は3回カウントを失いました。しかし、実際には回答の30〜45%程度のようです。それらはそのままコピーできます。
イスマエルミゲル



6

JavaScript(ES6)、19バイト

f=n=>n&&f(n/10|0)+1

console.log(f(-45))       // 2
console.log(f(1254))      // 4
console.log(f(107638538)) // 9
console.log(f(-20000))    // 5
console.log(f(0))         // 0
console.log(f(-18))       // 2


「f =」を数えますか?ここの他の言語の多くは、それ自体で関数定義を提示しています。
Sparr

5
@Sparrこれは自分自身を参照する再帰関数です。したがって、この特別なケースでは、はい、数えますf=
Arnauld、

4

ゼリー3 2バイト

Leaky Nunのおかげで1バイト節約

DL

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

説明

 L    Length of
D     Decimal expansion of input argument. Works for negative values too


私はこれをやろうとしていました。しかし、コードページで必要なものが見つかりませんでした:(
Christopher

文字列の長さを与えるのと同じ関数を使用して、整数の「長さ」は本当に文字列関数のように感じます...
Sparr

1
整数ではなく、その数字のリスト(で取得D)の長さではありません。挑戦は言う:オーバーロードされている場合には、あなたは文字列と整数の両方の機能としてその行為の関数に文字列を渡す必要がありません私は、文字列渡していないよ:この答えは、そのルールに従います
ルイス・Mendo






2

Java 8、61 59 39 37バイト

n->n==0?1:(int)Math.log10(n<0?-n:n)+1

@TheLethalCoderのC#回答からのポートですが、-castMath.floorを使用すると、(int)Javaで自動的に小数点が切り捨てられて小数点が切り捨てられるため、これはありません。

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


再帰的なJava 7の回答(61 38バイト):

int c(int n){return n!=0?1+c(n/10):0;}

@ Khaled.KのC回答のポート。

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



1

アリス、16バイト

/O
\I@/Hwa:].$Kq

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

説明

/O
\I@/...

これは、単に数値入力→数学処理→数値出力のフレームワークです。

コードの残りの部分は実際のアルゴリズムです。

Hwa:].$Kq
H            Compute absolute value
 w   .$K     While the result is not zero do:
  a:           divide the number by 10
    ]          move the tape head one cell forward
        q    Get the position of the tape head









0

PowerShell、52 51バイト

$m=[math];$m::Floor($m::Log10($m::Abs($args[0])))+1

Log10の問題を修正し、1バイトの節約を提供してくれたFelipeに感謝します。

任意のSystem.Math呼び出しは、PowerShellの非常に高価です。

入力の絶対値のLog10を取得し、それを切り上げる方法を使用します。


あなたが使用する必要がありますFloor()+1Ceil()10のべき乗で失敗する
フェリペナルディバティスタ

$m::Log10(...バイトの保存に使用
フェリペナルディバティスタ

0

QBIC、25バイト

≈abs(:)>=1|b=b+1┘a=a/z}?b

これは入力を10で割り、N<1になるまでこれを何回実行できるかを追跡します。

説明:

≈abs(:)>=1| : gets cmd line input, 
            ≈ starts a while loop,
            abs() is literal QBasic code and is for cases with negative n
            | is the terminator to the WHILE-condition
b=b+1       Keep track of the # of divisions        
┘           Syntactic line break
a=a/z       Divide a by 10 (z==10 in QBIC)
}           End WHILE-loop body
?b          PRINT b




0

実際には、8バイト

;0=+A╥Lu

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

説明:

;0=+A╥Lu
;0=       is input equal to 0?
   +      add 1 if input is 0, else add 0
    A     absolute value
     ╥L   log base 10, floor
       u  increment

このプログラムは効果的に計算しfloor(log10(x))+1ます。log(0)未定義であることを処理するため(実際に(-inf+nanj)は、未定義であると言う特別な方法である戻り値)、0長さが計算される前に入力が増分されます。したがって、0の長さはと見なされます1



0

Ruby、27バイト

f=->x{x==0?0:1+f[x.abs/10]}

テストとして:

tests = [[-45 , 2],
         [1254 , 4],
         [107638538 , 9],
         [-20000 , 5],
         [0 , 0 ],
         [-18 , 2]]

tests.each do |i, o|
  p f.call(i) == o
end

それは出力します:

true
true
true
true
true
true

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