デジタルルートを印刷する


19

これは、Wordが複雑ではなく、計算するだけで、比較する必要がないため、Word打ち負かすことができるのとは異なります。

デジタルルートを見つけるには、数字のすべての数字を取得して追加し、1桁の数字が得られるまで繰り返します。例えば、場合の数だった12345、あなたが追加することになり1234、と5、なって15。その後、追加15、あなたに与えます6

あなたのタスク

整数N(0 <= N <= 10000)からSTDINまでを指定すると、Nのデジタルルートが出力されます。

テストケース

1 -> 1
45 -> 9
341 -> 8
6801 -> 6
59613 -> 6
495106 -> 7

これはであるため、バイト数が最小のコードが優先されます。


1
このチャレンジのサブタスクかもしれません。
nimi

3
この課題非常に密接に関連しています...おそらく、だまされやすいほどです。
AdmBorkBork

8
と言うときはもっと正確にしてくださいnumber。特に。入力0をサポートする必要がありますか?
トンホスペル

2
@TimmyDこれは、文字から整数への変換を追加することなく、2つの値の関数を計算し、リテラルを含むことなく、はるかにクリーンな課題だと思いますSTALEMATE。これのだましとして、もう一方を閉じる方が良いかもしれません。
マーティンエンダー

3
@MartinEnder私は近い投票を撤回しました。別のより複雑な挑戦の策略として良い挑戦を終えることは不公平だと思います。
エリックアウトゴルファー

回答:



17

ゼリー7 5 4 3 バイト

ḃ9Ṫ

TryItOnline!またはすべてのテストケース

どうやって?

デジタルルートは、式(N-1)%9 + 1に従うことが知られています。
これは、全単射ベース9における最後の桁と同じである
(その実装に起因0ḃ9=[]し、[]Ṫ=0これはハンドルゼロのエッジケース)。

ḃ9Ṫ - Main link: n
ḃ9  - convert to bijective base 9 digits (a list)
  Ṫ - tail (get the last digit)


6

MATL、3バイト

9X\

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

多くの(現在削除されている回答)がモジュロ9を使用して結果を得ようとしました。これは素晴らしいショートカットですが、残念ながら9の倍数では機能しません。MATLにはintervalのモジュロ機能があります[1, n]。このモジュロを使用すると1 % 3 == 1, 2 % 3 == 2, 3 % 3 == 3, 4 % 3 == 1、などが得られます。この答えは、このカスタムモジュロを使用して入力モジュロ9を取得します。


6

Mathematica、27 11バイト

Mod[#,9,1]&

Mathematica Modは3番目のパラメータをモジュロの結果範囲のオフセットとして受け取ります。これにより、入力の減少と出力の増加が回避されます。


6

Python、16 20バイト

ゼロのエッジケースを処理する+4バイト。

lambda n:n and~-n%9+1

repl.it


1
ワオ。これは非常に簡単なので、どの言語にも移植できます。できます~-input()%9+1
カールナップ

1
残念ながら0では機能しません。
エミグナ

@KarlNapfそれは必要ないのprint
ジョナサンアラン

@JonathanAllan Ah、おそらく。REPL環境でテストしたところ、それができました。
カールナップ

1
@編集を試みた匿名ユーザー-実際にコードを壊して(0結果の入力を行うので9はなく、コード0n and一部で処理される)、さらに13ではなく19バイトとしてカウントしていました(以来print)とスペースカウントされなければなりません。
ジョナサンアラン


4

PHP、15バイト

<?=--$argn%9+1;

以前のバージョンのPHP、55バイト

$n=$argn;while($n>9)$n=array_sum(Str_split($n));echo$n;

正確に私はそれをやった!
CT14.IT

@ CT14.IT必要に応じて、この投稿を削除できます。あなたの削除された投稿は1分早くWSとあなただけのwhileループ忘れている
イェルクHülsermann

Nah削除された答えは間違っていました。最初に質問を正しく読んでおらず、生成された数値を合計しようとしなかったためです
-CT14.IT

2
他の答えのトリックを追加することができます<?=--$argv[1]%9+1?>
暗号

3

Haskell、35 34バイト

until(<10)$sum.map(read.pure).show

Ideoneでお試しください。

説明:

until(<10)$sum.map(read.pure).show
                              show  -- convert int to string
               map(         ).      -- turn each char (digit) into
                        pure        --    a string 
                   read.            --    and then a number
           sum.                     -- sum up the list of numbers
until(<10)$                         -- repeat until the result is < 10

3

Perl、15バイト

+2を含む -lp

STDINに入力する

root.pl <<< 123

root.pl

#!/usr/bin/perl -lp
$_&&=~-$_%9+1

これはすでに多くの言語で提供されている退屈なソリューションですが、少なくともこのバージョンもサポートしてい0ます

(別の順序ではありますが)実際に繰り返される追加を行うと、実際には1バイトだけ長くなります。

#!/usr/bin/perl -p
s%%$_+=chop%reg

3

R、72 67 29バイト

編集:2バイトを削る@rturnbullに感謝します。

n=scan();`if`(n%%9|!n,n%%9,9)

最近、同じ動作でにifelse置き換えることができることを学びました。これにより`if`、数バイト節約できます。
rturnbull

@rturnbull私はいつも ` if`がどのように機能するのかと思っていました。例を挙げたり、ゴルフのヒントに
ビリーウォブ

それを理解する最も簡単な方法は、ベクトル化されていないことifelseです。この場合、`if`(n%%9|!n,n%%9,9)投稿したコードと同じ動作を提供します。私が知る限り、この動作は文書化されていません!ヒントスレッドにコメントを追加します。
rturnbull

3

網膜、7バイト

{`.
*
.

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

私は多くの数学的な解決策を目にしますが、Retinaでは簡単なアプローチが最良の方法のようです。

説明

{`文字列が変更されなくなるまで、プログラム全体をループで実行します。ループは2つのステージで構成されます。

.
*

各桁を単項に変換します。

.

文字数をカウントします(=単項数を10進数に変換します)。

これは、各桁を桁間の区切りなしで単項に変換すると、すべての桁の合計に等しい単一の単項数が作成されるためです。


2

Brachylog、9バイト

#0|@e+:0&

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

説明

#0            Input = Output = a digit
  |           OR
   @e         Split the input into a list of digits
     +        Sum
      :0&     Call this predicate recursively

代替アプローチ、11バイト

:I:{@ e +} i#0

これは、メタ述語i - Iterateを使用して、入力のI述語の時間を呼び出し{@e+}ます。これは、Ifrom 0から無限大までの値を試行して、出力がi1桁になるようにし#0ます。


2

JavaScript(ES6)、 41 38バイト

Bassdrop Cumberwubwubwubのおかげで3バイト節約

文字列を受け取って返します。

f=s=>s[1]?f(''+eval([...s].join`+`)):s

テストケース


4
あなたは変更することができますs.split``[...s]
Bassdrop Cumberwubwubwub

2

CJam19 13バイト

r{:~:+_s\9>}g

通訳

説明:

r{:~:+_s\9>}g Code
r             Get token
 {:~:+_s\9>}  Block: :~:+_s\9>
   ~          Eval
  :           Map
     +        Add
    :         Map
      _       Duplicate
       s      Convert to string
        \     Swap
         9    9
          >   Greater than
            g Do while (pop)

-6バイトの8478(Martin Ender)に感謝します。


CJam、6バイト

ri(9%)

8478(Martin Ender)によって提案されました。 通訳

私はそれについて考えていましたが、マーティンはちょうど私の前にそれを得ました。説明:

ri(9%) Code
r      Get token
 i     Convert to integer
  (    Decrement
   9   9
    %  Modulo
     ) Increment

単一コマンドのmapとreduceの両方をprefix :で書くことができるので、できます:~:+。また、ブロックを少なくとも1回実行しても害はないため、gループの代わりにループを使用できwます。
マーティンエンダー

@MartinEnderはr{_,1>}{:~:+`}w動作しますが、私はgここでどのように使用することになっているのかわかりません。
エリックアウトゴルファー

たとえば、次のようになりますr{:~:+_s\9>}g(もちろん、閉じた形式のソリューションri(9%)ははるかに短くなります。
マーティン・エンダー

@MartinEnderああ、ガウド、本当は今、私はそんな初心者です...
エリックOutgolfer

2つ目は9の倍数では機能しません
-ThePlasmaRailgun

2

Java 7、63バイト

int f(int n){int s=0;for(;n>0;n/=10)s+=n%10;return s>9?f(s):s;}

mod / divで数字を取得するだけの再帰関数。派手なものは何もありません。

安い港

ジョナサン・アランのちっぽけな28バイトのようになります。

int f(int n){return~-n%9+1;}

1

パイソン2、54の 51バイト

i=input()
while~-len(i):i=`sum(map(int,i))`
print i 

3バイトの節約を支援してくれたOliverとKarl Napfに感謝


に変更while len(i)>1while~-len(i)て、1バイトを保存できます。
オリバーNi

目盛りを省略してinput()、入力を引用符で囲むことで2バイトを節約できると思います。
カールナップ

@KarlNapf入力が整数の場合、これができるとは思わない。
エリックアウトゴルファー

@ EriktheGolfer、opは入力を文字列として受け取ることができると言った
ダニエル

1

Python、45バイト

f=lambda x:x[1:]and f(`sum(map(int,x))`)or x

引数を文字列として受け取ります。



1

C、64 29バイト

Jonathan Allanの回答(特別なケース0)からのCポート。

f(i){return i>0?~-i%9+1:0;}

前の64バイトコード:

q(i){return i>9?i%10+q(i/10):i;}
f(i){i=q(i);return i>9?f(i):i;}

qクロスの和をとり、f一桁までのクロス和をとる繰り返されます。


1

網膜、15バイト

.+
$*
1{9}\B

1

オンラインでお試しください!(最初の行は、改行で区切られたテストスイートを有効にします。)

説明

.+
$*

入力を単項に変換します。

(1{9})*\B

あとに少なくとも1文字以上ある9を削除して、1ベースのモジュロを取ります。

1

1の残りの数をカウントして、10進数に変換します。


1

Perl 6、29バイト

{($_,*.comb.sum...10>*)[*-1]}

拡張:

{ # bare block lambda with implicit parameter 「$_」
  ( # generate a sequence

    $_,         # starting with the input
    *.comb.sum  # Whatever lambda that splits into digits, and finds sum
    ...         # keep doing that
    10 > *      # until it is less than 10

  )[ * - 1 ] # get the last value
}

1

ファクター、24

賢い賢い答え。

[ neg bitnot 9 mod 1 + ]

ダム反復ソリューションの場合:63

[ [ dup 9 > ] [ number>string >array [ 48 - ] map sum ] while ]

1

ラビリンス、8バイト

?(_9%)!@

方程式を使用して(n-1)%9+1

  • ? 入力を10進数として読み取り、スタックにプッシュします
  • ( スタックのトップをデクリメントします
  • _ スタックの一番上にゼロをプッシュします
  • 9 スタックの一番上にある数字を10倍押します(この場合は9)。
  • % yをポップ、xをポップ、x%yをプッシュ
  • ) スタックの最上部をインクリメントします
  • ! スタックの一番上をポップし、10進数の文字列として出力します
  • @ プログラムを終了します

1

パイス-7 4 6 7バイト

最良のものではありませんが、それでもかなりの量の答えを打ち負かしています:

|ejQ9 9

前のバージョンと同様ですが、論理ORを使用して9の倍数のケースも処理します。


このバージョンは45テストケースに失敗します

ejQ9

説明:

 jQ9  -> converting the input to base 9
e     -> taking the last digit

ここで試してみてください

ここで以前のバージョンをお試しください!


以前のソリューション:

&Qh%tQ9

説明

    tQ    -> tail: Q-1
   %tQ9   -> Modulo: (Q-1)%9
  h%tQ9   -> head: (Q-1)%9+1
&Qh%tQ9   -> Logical 'and' - takes the first null value. If Q is 0 - returns zero, otherwise returns the (Q-1)%9+1 expression result

あなたはに招待しているここでそれを試してみてください


4バイトバージョンはテストケース45に失敗します。
デニス

これは、9の倍数に対して0になりませんか?
-xnor

Yeah, I just noticed it. Will do some fixing there. Apparently, jQ9 doesn't act like Jelly's ḃ9 :-P
Yotam Salmon


1

Hexagony, 19 15 bytes

.?<9{(/>!@!/)%' 

More Readable:

  . ? < 
 9 { ( /
> ! @ ! / 
 ) % ' .
  . . . 

Try it online!

-3 bytes by taking a different approach, making the 0 edge case trivial.
-1 byte by fixing 0 edge case bug

Using the formula ((n-1) mod 9) + 1 like a lot of other solutions aswell.


1

K (oK), 9 bytes

Solution:

(+/.:'$)/

Try it online!

Explanation:

Super straightforward. Break number into digits and sum up - do this until the result converges:

(+/.:'$)/ / the solution
(      )/ / do this until result converges
      $   / string, 1234 => "1234"
   .:'    / value each, "1234" => 1 2 3 4
 +/       / sum over, 1 2 3 4 => 10

1
In my implementation of k I made x\y encode y in base x with as many digits as necessary, so it's slightly shorter: (+/10\)/
ngn

Nice. In the newer versions of kdb+ (I think from 3.4 and up) you can do 10\:.. but not in oK - and .:'$ is the same number of bytes - so I went with that :)
streetster

oK uses \ and requires a list on the left: `(,10)`
ngn

Indeed, your implementation adds "as many digits as necessary", which is what you get from \: in kdb+ (3.4+), but for oK I'd need to know how many 10s to put in my list.
streetster

1

Keg, 6 bytes(SBCS on Keg wiki)

¿;9%1+

Explanation:

¿#      Take implicit input
 ;9%1+# Digital Root Formula
# Implicit output

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