数字はそれぞれの数字で割り切れますか?


47

私の友人と私は、AP Computer Scienceクラスの研究室で働いていましたが、終了後もクラスの半分がまだ空いていたため、ゴルフの問題を1つコーディングすることにしました。ここに質問があります:

数値nが与えられた場合、nは各桁で割り切れますか?

たとえば、128はこのテストに合格します。1、2、および8で割り切れます。ゼロの数字は、自動的に数字を失格にします。必要に応じて他の言語を使用し、ソリューションを投稿することもできますが、クラスで使用する言語であるJavaでプログラムをコンパクトに作成できる方法に関心があります。これまでのところ、我々は両方とも51を持っています。これが私の現在のコードです:

public boolean dividesSelf(int n){for(int p=n;n%10>0;)n/=p%(n%10)>0?.1:10;return n<1;}
// 51 characters

// Breakdown:
// for(int p=n;         Saves one semicolon to put declaration into for loop
// n%10>0;)             Basic check-for-zero
// n/=                  Pretty simple, discarding one number off of n at a time
// p%(n%10)>0?          If p (the given value) is not divisible by n%10 (the current digit)...
// .1:10;               Divide by .1 (multiply by 10) so it fails the check next iteration. If it is divisible, divide by 10 to truncate the last digit
// return n<1           If the number was fully divisible, every digit would be truncated, and n would be 0. Else, there would still be non-zero digits.

必要条件

メソッドのシグネチャは、何でもかまいません。関数本体を数えるだけです。ただし、メソッドがブール値を返し、1つの数値パラメーター(文字列ではなく)のみを渡すようにしてください。

コードはこれらのすべてのケースをパスできる必要があります(元の質問の指示に忠実であり続けるために、言語がブール値をサポートしている場合、ブール値のtrueとfalse のみがカウントされます。 0でfalse、0以外の整数(1または-1が望ましい)でtrueを表します。

128 -> true
 12 -> true
120 -> false
122 -> true
 13 -> false
 32 -> false
 22 -> true
 42 -> false
212 -> true
213 -> false
162 -> true
204 -> false

また、私たちは、空白は、プログラムの動作に不可欠でない限り、そう、同じことを行う気軽に空白カウントされませんでした(Javaで改行はカウントされませんので、しかし、間に単一のスペースintx=1幸運を行い、カウント。) !


18
PPCGへようこそ!いくつかの提案:1.機能的な空白を数えないことは悪い考えです。ホワイトスペースで書かれた答えは自動的に勝ちます。2.万一、当社の提出のプリント/リターンtrueおよびfalseまたはあるtruthy / falsyだけでなく、値OK?3. javaチャレンジ自体はJavaとは無関係なので、タグは実際にはここには適用されません。
デニス14年

はい。問題についてごめんなさい。明確にするために、「int p = n」のスペースは機能的であると考えますか?あなたが指摘した他の問題を修正します。
マシューキルシュバウム14年

5
コードが機能するために必要なすべての空白は機能的です。
FryAmTheEggman 14年

さて、回答ありがとうございます!
マシューキルシュバウム14年

1
@RickyDemer:その場合、0は例外的な入力であるため(0数字はそれぞれの倍数である唯一の数字です)、ほとんどの答えはそれをチェックするために興味のない方法で長くなると思います。だから、タイトルがもたらす問題のほうが好きです(0を除く数字の倍数ではなく、数字で割り切れます)。
Jeroen Mostert 14年

回答:


23

Perl 6、13

sub golf($_) {
   $_%%.comb.all
}

暗黙の変数を使用します$_$_ %% .comb.allと同等$_ %% all($_.comb)です。%%は「割り切れる」演算子でありcomb、追加の引数なしで文字列内の文字のリストを返します。例として、引数が123の場合、関数は評価します

123 %% all(123.comb)

これは

123 %% all(1, 2, 3)

ジャンクションの自動スレッド化により

all(123 %% 1, 123 %% 2, 123 %% 3)

これは

all(True, False, True)

これはブールコンテキストではfalseです。これは「すべて」のジャンクションであり、明らかにすべての要素がtrueではないためです。

Bool関数signatureを作成することにより、戻り値を強制し、呼び出し側からjunction-nessを隠すことができるはずですが、関数シグニチャーのsub golf($_ --> Bool())強制は、Rakudoではまだ機能しません。戻り値は、それだけではありません、まだ正確に真か偽TrueFalse


コードの先頭にBool追加するだけで返すようにしたい場合。soso$_%%.comb.all
ブラッドギルバートb2gills 14年

21

C#およびSystem.Linq-26/40

ルールごとに、メソッド宣言自体はカウントしません。

bool dividesSelf(int i) { 
    return(i+"").All(d=>i%(d-48d)<1);
}

繰り返しますが、Javaを検討中の場合はC#が優れた選択肢です。

残念ながら、この関数(および他の回答の多く)は、負の入力に対して正しい結果を生成しません。これを修正することはできますが、ソリューションの魅力は失われます(長さが46文字になります)。

return(i+"").All(d=>d>48&&i%(d-48)==0||d==45);

編集:ティムの提案で1人のキャラクターを剃り落とした。

編集:C#6 の式の強いメンバーの導入により、以下を削除することでこれをさらに削減できますreturn

bool dividesSelf(int i) =>
    (i+"").All(d=>i%(d-48d)<1);

合計26文字(私の意見では=>、中括弧が含まれる以上に含めるべきではありません)。負の数を処理するバージョンも同様に短縮できます。


なんで.0?整数モジュラス以外のものは必要ありません。
ピーターテイラー14年

3
@PeterTaylor: -あなたが最短プログラムをしたい場合があるi % 0とのi整数を与えますDivideByZeroException
ジェローンモスト14年

2
そしてダブルでNaNを与えます!いいね!
ピーターテイラー14年

2
48dはと同じですが48.0、1文字少なくなります(dはdouble)。
ティムS.14年

1
@StuartLC:ラムダはメソッドではありません。それらのスコープは異なるので、私はそれがあまりにもルールを曲げていると思います。しかし、C#6(この回答は以前のものです)以来、私たちは表現に長けたメンバーを持っているため、定義を短くすることができます。負の場合、を使用することはできません。&なぜなら、&短絡しないからです-でゼロ除算例外が発生します%。それをダブル(with d)にすることで修正できますが、その後1つのキャラクターが再び失われました。
イェルーンMostert

18

APL(13 11)

(明らかに括弧はカウントされません)

{0∧.=⍵|⍨⍎¨⍕⍵}

説明:

  • ⍎¨⍕⍵:文字列表現の各文字を評価します
  • ⍵|⍨:それらのそれぞれについて、それのモジュロを見つけ、
  • 0∧.=:それらのすべてが等しいかどうかを確認します 0

テストケース:

      N,[.5] {0∧.=⍵|⍨⍎¨⍕⍵} ¨ N←128 12 120 122 13 32 22 42 212 213 162 204
128 12 120 122 13 32 22 42 212 213 162 204
  1  1   0   1  0  0  1  0   1   0   1   0

APLはできますX%0か?投げずに?
オプティマイザー14年

@Optimizer:はい。0|X与えるX
マリヌス

甘い。また、あなたの答えは13バイトではなく11バイトです
オプティマイザー

9
APLのみが0によるモジュロにエラーを与えず、非ブールをブールとして評価するとクラッシュします;)
FryAmTheEggman 14年

3
dfnの代わりにトレインを使用した1文字の短縮:(0∧.=⍎¨∘⍕|⊢)
ngn 14

14

Python 2:43文字

f=lambda n:any(n%(int(d)or.3)for d in`n`)<1

数値にその数値を法とするゼロ以外の剰余があるかどうかを確認し、その否定を出力します。ゼロ桁は奇妙に処理されます:計算%0はエラーを引き起こすため、の桁は0に置き換えられます.3。これは、浮動小数点の不正確さにより常にゼロ以外の結果をもたらすようです。

関数本体は32文字です。


14

Perl-27バイト

sub dividesSelf{
    $_=pop;s/./!$&||$_%$&/ger<1
}

指示どおり、関数シグネチャをカウントしません。

サンプル使用法:

use Data::Dump qw(dump);
for $i (128, 12, 120, 122, 13, 32, 22, 42, 212, 213, 162, 204) {
  printf "%3d -> %s\n", $i, dump(dividesSelf $i);
}

サンプル出力:

128 -> 1
 12 -> 1
120 -> ""
122 -> 1
 13 -> ""
 32 -> ""
 22 -> 1
 42 -> ""
212 -> 1
213 -> ""
162 -> 1
204 -> ""

問題の仕様に対処する:「ブール値のtrueとfalseのみがカウントされます。真/偽の値はカウントされませ。」

use Data::Dump qw(dump);
dump(1 == 1);
dump(0 == 1);

出力:

1
""

「True」および「False」は、1およびとして定義され""ます。

正誤:
Brad Gilbertが正しく指摘しているように、perlはtrueを整数1と文字列の両方であるスカラーとして"1"同時に定義falseを整数0と文字列の両方であるスカラーとして同時に定義します""


これは以下を使用しないことで短縮できます$_pop=~s///ger<1。OPがそれに同意し1""有効な結果であるかどうかはわかりません。そうでない場合は、さらに2バイトで修正できます。単にaddだけ|0です。
hvd 14年

perl -pe'$_=s/./!$&||$_%$&/ger<1|0'|0and -pフラグを含む26バイトです。関数を使用する必要はありません。
hmatt1 14年

1
実際にはの値は、より多くのようなものですdualvar(1,'1')dualvar(0,'')
ブラッドギルバートb2gills 14年

1
@BradGilbertそれは面白いです。私はperlgutsにかなり精通していますがtruefalseが特別なケースであることを知りませんでした。それらは実際には「トリプルスカラー」であり、SVIV(int)、SVNV(double)、およびSVPV(string)としてマークされています。
primo

1
実際、最初に文字列を数値として、または数値を文字列として使用するとき、変数はその追加データを保持するように変更されます。あなただけが最初に使用するときの警告を受ける理由です'abc'(あなたがいると仮定すると数としてはuse warnings;。有効)
ブラッド・ギルバートがb2gills

13

CJam、11 10バイト

{
    _Ab:df%:+!
}:F;

これは、名前の関数を定義Fし、スタックからブロックを破棄します。

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

テストケース

$ cjam <(echo '{_Ab:df%:+!}:F;[128 12 120 122 13 32 22 42 212 213 162 204]{F}%p')
[1 1 0 1 0 0 1 0 1 0 1 0]

使い方

_      " Copy the integer on the stack.                                          ";
Ab     " Push the array of its digits in base 10.                                ";
:d     " Cast each digit to Double.                                              ";
f%     " Take the integer on the stack modulus each of its digits.               ";
:+     " Add the results.                                                        ";
!      " Push the logical NOT of the sum.                                        ";

CJamには、質問の作成時に10バイトのソリューションに使用した機能がありましたか?
リトシアスト

@ThomasKwa:はい。2014
デニス

12

JavaScriptのES6、39の 32 28バイト

v=>[...""+v].every(x=>v%x<1)

おかげで交換する提案のためcore1024 (""+v).split("")[...""+v]の使用を示唆しているため、とopenorclose every機能を。

現在、答えには私のコードの1ビットが含まれていません:O

以前のソリューション

v=>[...""+v].filter(x=>v%x|!+x)==""

==""はを[""]==""返すため、配列が空かどうかを確認する有効な方法ではありませんtrueが、配列には空でない文字列が含まれていることが保証されているため、ここで機能します。

残りは、JavaScriptの非常に標準的な速記型変換です。


1
あなたは交換することにより、いくつかのcharacterasを保存することができ(""+v).split("")[...""+v]
core1024 14年

1
everyメソッドを使用しないのはなぜですか?v=>[...""+v].every(x=>v%x<1);
openorclose

@openorclose:ありがとう。JSで使用する機会がなかったため、このような機能を検索することは考えませんでした。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

v=>![...""+v].some(x=>v%x)
l4m2

@ l4m2以来v%0戻りNaNNaN == false0などが含まれていますので、あなたのケース番号で、10返すことがあり、true
浅本しえる

9

Java 8、46バイト(メソッド本体)

Jeroen Mostertのダブルトリックへの変換の使用。

public static boolean dividesSelf(int n) {
    return(""+n).chars().allMatch(x->n%(x-48d)<1);
}

8

Pyth、12バイト

!f|!vT%vzvTz

これは、ゼロ(!vT)または入力を分割しない()のいずれかで文字列内の文字をフィルターし%vzvT、結果のリストの論理的でないものを取ります。

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


いいえ、機能を使用しなくても大丈夫です。宣言をカウントする必要はなく、内部のコードのみをカウントする必要がある関数を使用している人を指摘したかっただけです。
マシューキルシュバウム14年

8

Ruby、44バイト(関数本体:37)

おそらくさらにゴルフされる可能性があります。

f=->n{n.to_s.chars.all?{|x|x>?0&&n%x.hex<1}}

functionを介した入力f。使用例:

f[128] # => true
f[12]  # => true
f[120] # => false
...

1
あなたは変更することができます.to_i.hex一桁の数字がベース16に同じであり、変更することができるため、==0<1
histocrat

8

Python- 59 50 49 47バイト

f=lambda n:all(c>'0'and 0==n%int(c)for c in`n`)

もっと速い方法があると確信しています...まあ。

編集 -ゴルフのヒントをくれたFryAmTheEggmanに感謝します。

編集2 -FryAmTheEggmanもこの時点でこれを書いたかもしれません、おっと

編集3 -genexpsが問題であることさえ知らなかった場合は、手を挙げてください。...私だけ?


ああ、どうもありがとう!私はそれらすべてを忘れ続けています。(私はまた、その方法でcharsより少ないことができることに気づきませんでした。)
カスラン14年

ああ、ロジックを反転すると、少し短くなるようですf=lambda n:all([c>'0'and 0==n%int(c)for c in`n`])。そして問題ありません:)
FryAmTheEggman 14年

ああ、方法あることすら知りませんでしall
カズラン14年

だろう1>n%int(c)動作しますか?
Sp3000 14年

3
なぜリストを理解するのですか?genexp:を使用してall(c>'0'and 0==n%int(c)for c in`n`)もまったく同じことが行われ、2文字少なくなり、リストの割り当ても保存されます。
バクリウ14年


5

Bash + coreutils、44バイト

完全な関数定義は次のとおりです。

f()((`tr 0-9 \10<<<$1``sed "s/./||$1%&/g"<<<$1`))

通常、シェル関数は単一のセットを使用する{}()、関数本体を含むため、これをどのようにスコア付けするかわかりません。ここで(())は、double を使用して、ここで必要な算術展開を引き起こす関数本体を含めることもできます。そのため、今のところ、これらの括弧の1組だけを数えています。これについてのさらなる議論は大歓迎です。

出力:

$ for i in 128 12 120 122 13 32 22 42 212 213 162 204; do f $i; printf "%d " $?; done
1 1 0 1 0 0 1 0 1 0 1 0 $
$

ええと-1と0が許容できるかどうか、またはtrue/ を印刷する必要があるかどうかはわかりませんfalse
デジタル外傷14年

4

J-14文字

関数本体は、の後の部分=:です。関数全体の文字数を最小限にしたい場合、それは15 char */@(0=,.&.":|])です。

f=:0*/@:=,.&.":|]

,.&.":は、数値として10進数のリストに展開するJの最短の方法です。文字列に変換し、数字を分離し、各数字を数字に変換します。,.&.":|]入力数字(])モジュロ(|)それらの数字を取ります。0*/@:=すべての結果が0の場合はtrueを返し、それ以外の場合はfalseを返します。

   f 162
1
   f every 204 212 213
0 1 0

3

Java- 121 102 97 79 78バイト

私は知っている、これは、後に上書きされます。しかたがない。

boolean b(int a){int m=10,j,t=1;for(;m<a*10;m*=10){j=10*(a%m)/m;if(j==0||a%j>0)t=0;}return t>0;}

戻ってきます。


1
これで、関数に好きな名前を付けることができます。実際の関数内の計算のみをカウントするようにルールを変更しましたが、関数ブール型を返す必要があります。したがって、現在86文字です。
マシューキルシュバウム14年

3

ハスケル-100 54 38

f x=all(\y->y>'0'&&x`mod`read[y]<1)$show x

まだ学習中、批評家に感謝


ここにコメントがありましたが、誤って削除しました...とにかく、いくつかの提案:1)lengthsをドロップしてください、それらは不要です。2)t定義で置き換えます。3)elem y s不要です。4)の/='0'代わりに、左のフィルターに移動できますelem y s。5)この場合、/='0'>'0'すべての文字が数字であるため、と同等です。6)modバックティックを入れると、挿入記号になります。7)すべてを1行に配置します。
ズガルブ14年

1と3は、別の方法でコードを回収しようとしていたときのものでした。ヒントをありがとう。
globby

1
私の提案:使用s==filter(...)sする代わりにを使用する必要がありますall(...)s。現在、s式には一度しか現れないので、それをその定義で置き換えてドロップできwhereます。また、代わりに==0を使用することもできます<1
誇りに思ってhaskeller 14年

最初のバージョンからの大きな改善!
誇りに思ってhaskeller 14年

に置き換えるとall(\y->...)$show x、1バイトを失う可能性があると思いますand[...|y<-show x]
ズガルブ14

2

CJam、15バイト

{_Abf{_g{%}*}:|!}

これはブロックであり、CJamの関数に最も近いものです。私は体を数えるだけです(つまり、中括弧は省略します)。次のように使用できます。

128{_Abf{_g{%}*}:|!}~

または、一連の入力をテストする場合は、次のことができます

[128 12 120 122 13 32 22 42 212 213 162 204]{{_Abf{_g{%}*}:|!}~}%

ブロックは、結果を示すために0(偽)または1(真)をスタックに残します。(CJamにはブール型がありません。)

ここでテストしてください。

説明:

_               "Duplicate input.";
 Ab             "Get base-10 digits.";
   f{      }    "This maps the block onto the list of digits, supplying the input each time.";
     _g         "Duplicate digit, get signum S (0 or 1).";
       { }*     "Repeat this block S times.";
        %       "Take input modulo digit.";
                "This leaves an array of zeroes for divisible digits, non-zeroes
                 for non-divisible digits, and non-zero junk for zeroes.";
            :|  "Fold OR onto this list. One could also sum the list with :+";
              ! "Logical NOT. Turns 0 into 1, and non-zero values into 0.";

代替、15バイト

{:XAb{X\_X)?%},!}

説明

:X              "Store input in X.";
  Ab            "Get base-10 digits.";
    {       },  "Filter this list by the result of the block.";
     X\         "Push another copy of X, swap with digit.";
       _        "Duplicate digit.";
        X)      "Push X+1.";
          ?     "Select digit itself or X+1, depending on whether digit is 0 or not.";
           %    "Take modulo. X%(X+1) will always be nonzero for positive integers.";
              ! "Logical NOT. Turns an empty list into 1 and a non-empty list into 0.";

2

CJam、15バイト

{_Abf{_{%}1?}1b!}

{}CJamの関数に最も近いものです。関数の本体を数えているだけです

次のように使用します。

128{_Abf{_{%}1?}1b!}~

1(数字が割り切れる0場合)または(数字が数字で割り切れない場合)を取得します。

こちらからオンラインでお試しください

説明

_Ab                "Copy the number and split it to its digits";
   f{      }       "For each digit, run this code block on the number";
     _{%}1?        "If the digit is 0, put 1, otherwise perform number modulus digit";
            1b     "We now have an array of modulus corresponding to each digit. Sum it up";
              !    "Negate the sum. If all digits were divisible, sum of modules will be"
                   "0, thus answer should be 1 and vice versa";

私は何かを見逃しているかもしれませんが、CJamをすばやく読んだ後、いくつかのことは意味をなさないように見えます:Ab数字をどのように分割するのですか?それは基数10に変換するだけのようです。また、次の数字がスタックの次の数字になるように見えるので、%は次の数字だけでなく数字によってmodを知ることができますか?
マシューキルシュバウム14年

すべての質問に答えるのは難しいでしょう。コード内の各文字の後にedを置くことで、非常に簡単に学ぶことができます。実行してみてください128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
オプティマイザー

1
特定の質問への回答:10を基数とすると、10を基数に変換した数の配列が得られます。これは、この場合は数字そのものです。%最後の2つの数値(この場合)を取得し、modを計算します。ここでは、最後の2つの数字が実際の数と桁(常に)です
オプティマイザ

さて、アドバイスをありがとう!
マシューキルシュバウム

2

C89、43バイト

unsigned char d(int n, int c) {
        int a=n%10;return!n||a&&!(c%a)&&d(n/10,c);
}

C89にはブール型がありません。それがうまくいくことを願っています。また、2番目のパラメーターを使用して元の番号のコピーをスタックに渡しましたが、定義は何でもかまいません。正しい結果を得るには、両方のパラメーターに同じ値を指定して関数を呼び出す必要があります(d(128, 128))。

編集:匿名ユーザーによる提案された編集の適用


codegolf.stackexchange.com/review/suggested-edits/17160を見てください。誰かがゴルフの提案をしてくれました
ジャスティン14年

特にルールに反します。1つのパラメーター。
edc65 14年

うん、この投稿は実際にユーザーがプログラムの代わりに複製を行うべきではないように思えたので、実際に私がそのルールを作ることにした理由です。
マシューキルシュバウム14年

ラッパー関数を追加する必要があると思います。その関数の宣言はバイトカウントに追加されますか?
MarcDefiant 14

2

C11-関数本体の44バイト

別のCバージョン、非再帰的、浮動小数点例外なし。

bool digit_multiple(int i)
{
    for(int n=i;i%10&&n%(i%10)<1;i/=10);return!i;
}

これは、C ++、Java、および他のほとんどのCライクな言語でも機能します。

primoのコメントの改善が含まれるように編集されました。


1
Java(1.7.0_45-b18)でコンパイルするバージョン:int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;、OPのコードより1バイト短い。
プリモ14年

2

ジュリア32 25 23

数字の使用を改善

負の数の問題も修正

selfDivides(x)=sum(x%digits(x).^1.)==0

古い方法

すべての剰余の合計が0である場合、すべての数字が分割されます。他と同様に、負の数に問題があります。

selfDivides(x)=sum(x.%(Float64["$x"...]-48))==0

出力

[selfDivides(x) for x in [128,12,120,122,13,32,22,42,212,213,162,204]]
12-element Array{Any,1}:
  true
  true
 false
  true
 false
 false
  true
 false
  true
 false
  true
 false

改善されたメソッドはBigIntも処理します

selfDivides(BigInt(11111111111111111111111111111111111111112))
true

しかしながら

selfDivides(BigInt(11111111111111111111111111111111111111113))
false

なぜなら

BigInt(11111111111111111111111111111111111111113) %3
1

2

C / C ++、58バイト(本体で44)

未定義の動作を呼び出します(コメントを参照)

int d(int i){int j=i;while(i&&!(j%(i%10)))i/=10;return!i;}

trueおよびfalse 1および0ですが、を返すために署名に1文字を自由に追加してくださいbool

そして、楽しみのために、次の形式の呼び出しを許可する場合は小さい再帰バージョン r(128,128)

編集:ルールで禁止されました:

C / C ++、53バイト(本体33)

int r(int i,int j){return!i||!(j%(i%10))&&r(i/10,j);}


2
#0を含む数値の浮動小数点例外を有する1ダイをj個の%(%I 10)I%10 = 0のために違法になるので
SBI

浮動小数点例外?奇妙な。それは私のコンパイラで完全に動作しますが、あなたは正しい、それは未定義の動作です。コンパイラに依存するUBの一般的なPCGスタンスが何であるかわかりません。
etheranger 14年

「コンパイラ依存UB」とは何ですか?それはUBかそうでないかのどちらかです(そして、ゼロによる除算、またはゼロを法とする除算は、実際にはUBです)。文字通り何かが起こる可能性があるため、UBは許可されません。ゼロ除算が発生すると、プログラムが爆発し、周囲の全員を殺すマシン上でプログラムが実行されると想定される場合があります。さて、あなたは私たち全員に生きてほしいと確信しています... Cには実装定義の振る舞いの概念がありますが、ゼロで割ることはそれに該当しません。
Jeroen Mostert 14年

2
@etheranger:0除算は、歴史的な理由のための浮動小数点例外と呼ばれている:stackoverflow.com/questions/16928942/...
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

2
@JeroenMostert:このサイトのすべてのC回答の90%以上がUBを呼び出していると思います。一部のマシンの一部のコンパイラで動作する限り、答えは有効と見なされます。
デニス14年

2

R:72 67 65

関数

f<-function(a)!(anyNA(a%%(d=as.double(strsplit(paste0(a),"")[[1]])))|sum(a%%d))

@AlexAと@plannapusに感謝します

テスト走行

i=c(128,12,120,122,13,32,22,42,212,213,162,204)
for(a in i){print(f(a))}
[1] TRUE
[1] TRUE
[1] FALSE
[1] TRUE
[1] FALSE
[1] FALSE
[1] TRUE
[1] FALSE
[1] TRUE
[1] FALSE
[1] TRUE
[1] FALSE

現在、関数の本体では72バイトではなく70バイトをカウントしています。ただし、を使用して67バイトに減らすことができますd=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d))。:)
アレックスA.

@AlexA。ありがとう。R.間違いなく再訪する私の最初の試みの1つ:)
MickyT

@MickyT paste(a)ではなくtoString(a)同じ結果が得られます。
プランナパス

@plannapusありがとう、きちんとした小技。覚えておく必要があります
-MickyT

1

GNU Awk:53文字

カウントされた部分:

for(;++i<=split($1,a,//);)r=r||!a[i]||v%a[i];return!r

機能全体:

function self_divisible(v, i, r)
{
    for (; ++i <= split($1, a, //); )
        r = r || ! a[i] || v % a[i]

    return ! r
}

Awkにはブール値がないため、1 tor trueおよびfalseの0を返します。


1

JavaScript(ES6)30

1つの数値パラメーターを持つ関数。JavaScriptでは0%0がNaNであるため、%と減算を使用して、特別なケース「0」は不要です。

保存された1文字のthx DocMaxを編集

F=n=>[for(d of t=n+'')t-=n%d]&&t==n 

ただの楽しみのために、関数シグネチャをカウントしないというルールを乱用しています4

Check=(n,t=n+'',q=[for(d of t)n-=t%d])=>t==n

FireFox / FireBugコンソールでテストする

console.log([128, 12, 120, 122, 13, 32, 22, 42, 212, 213, 162, 204]
.map(x=>+x + ' -> ' + F(x)).join('\n'))

出力

128 -> true
12 -> true
120 -> false
122 -> true
13 -> false
32 -> false
22 -> true
42 -> false
212 -> true
213 -> false
162 -> true
204 -> false

文字列の入力には「いいえ」と言います。
マシューキルシュバウム14年

1
Firefoxのコンソールはの交換に満足しているof(t=n+'')だけでof t=n+''1を保存する
DocMax

1

PHP:85バイト(本体で64バイト)

この関数が機能するには、文字列または数値を渡すだけです。

0 正しくfalseを返します。

コード:

function f($n,$i=0){for($n.='';$n[$i]&&$t=!($n%$n[$i++]););return$t&&$i==strlen($n);}

2番目のパラメーターを設定しないでください。

Javascript:76バイト(本文で61バイト)

これは、以前の機能の書き直しです。

両方のバージョン間で大きな変更はありません。

コードは次のとおりです。

function f(n){for(i=0,n+='';n[i]/1&&(t=!(n%n[i++])););return t&&i==n.length}

ポリグロット:Javascript + PHP 187 217 バイト(76 定型文なしの84バイト):

なぜ作ったの?

理由と多分私ができるからです!

PHPのエラーを無視してください:とにかく動作します!
不要になったため、3バイトを削除することで修正されました。

これが傑作です。

if('\0'=="\0"){function strlen($s){return $s['length'];}}
function toString(){return'';}
function f($n){for($i=0,$n=$n.toString();$n[$i]/1&&($t=!($n%$n[$i++])););return $t&&$i==strlen($n);}

このコードは、コンソールとPHPインタープリターの両方で実行できます!


旧版:

if('\0'=="\0"){function strlen($s){return $s['length'];}}
function s($s){return('\0'=="\0")?$s+'':str_replace('','',$s);}
function f($n,$i){for($i=0,$n=s($n);$n[$i]/1&&($t=!($n%$n[$i++])););return $t&&$i==strlen($n);}

「1つの数値パラメータのみを渡す」。これがないと、eval($ x)を実行してコード全体を$ xに渡すことができます
-abc667

@ abc667申し訳ありませんが、わかりません。
イスマエルミゲル

1

オクターブ、33(39機能セットアップを含む)

数値から行列への変換の使用:

f=@(a)sum(mod(a./(num2str(a)-48),1))==0

数値を要素XをマトリックスXで除算します。Xは、数値を文字列に変換し、48を減算してASCII値から再び数値に変換することで作成されます。1を法として各除算の小数部分を取得し、これらすべてがゼロであることを確認します(/ 0によりNaNがある場合、合計はNaNであり、したがってゼロではありません)。

www.octave-online.netを使用したサンプル入力:

f=@(a)sum(mod(a./(num2str(a)-48),1))==0
for j=[128,12,120,122,13,32,22,42,212,213,162,204]
f(j)
end

出力:

ans =  1
ans =  1
ans = 0
ans =  1
ans = 0
ans = 0
ans =  1
ans = 0
ans =  1
ans = 0
ans =  1
ans = 0

これをどのようにテストできますか?
イスマエルミゲル14年

octave - online.net-上記からコード定義を入力し、(たとえば)f(128)を入力します。出力を追加します
ヨルゲン14年

コンパイラを見つけて、尋ねる前に試してみました。ただし、正常に動作するようです(f(123)1、2、3で割り切れるを除く)。ただし、提供されているテストケースでは機能します。
イスマエルミゲル


1

BASH-117文字

f(){ [[ $1 =~ 0 ]]&& return 0 || r=;n=$1;for((i=0;i<${#n};i++));do r=$(($r+${n}%${n:$i:1}));done;return $(($r==0));}

テスト

for N in 128 12 120 122 13 32 22 42 212 213 162 204; do
  f $N
  echo "${N} ->  $?"
done

128 ->  1
12 ->  1
120 ->  0
122 ->  1
13 ->  0
32 ->  0
22 ->  1
42 ->  0
212 ->  1
213 ->  0
162 ->  1
204 ->  0

1

PHP- 74 71 64文字

ゴルフ:

function t($n){while($n>1){if(!($b=$n%10)||($n%$b)){return 0;}$n/=10;}return 1;}

少ないゴルフ:

function t($n){
    while($n>1){
        if( !($b=$n%10) || ($n%$b) )
            { return 0; }
        $n/=10;
    }
    return 1;
}

試験結果:

(コード)

$ans = array(128,12,120,122,13,32,22,42,212,213,162,204);
foreach($ans as $a)
{ echo "$a -> ".(t($a)?"True":"False").PHP_EOL; }

(出力)

128 -> True
12 -> True
120 -> False
122 -> True
13 -> False
32 -> True
22 -> True
42 -> True
212 -> True
213 -> True
162 -> False
204 -> False
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.