一个数字可以被每个数字整除吗?


47

我和我的朋友正在AP计算机科学课程的一个实验室里工作,并决定将一个问题编码为一个高尔夫,因为完成后我们仍然有一半的课程免费。这是问题:

给定数字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.

要求

方法签名可以是任何您想要的。仅计算功能体。但是,请确保该方法返回一个布尔值,并且仅传入一个数字参数(而不是字符串)。

代码必须能够通过所有这些情况下(为了忠于原题的方向,只有布尔值true和false值计算,如果语言支持布尔值,当且仅当你的语言没有布尔变量,你可以用0表示false,用任何非零整数(最好是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.我们的提交应该打印/返回truefalse还是真的/错误的值也可以吗?3. java标签实际上并没有在这里应用,因为挑战本身与Java无关。
丹尼斯

好的。对于这些问题感到抱歉。只是为了澄清起见,您是否会认为'int p = n'中的空格是有效的,因为我以前没有这样做。我将解决您指出的其他问题。
Mathew Kirschbaum 2014年

5
代码正常工作所需的所有空格都可以使用。
FryAmTheEggman 2014年

好的,谢谢您的回复!
Mathew Kirschbaum 2014年

1
@RickyDemer:因为在这种情况下0是一个例外的输入(这是唯一的0数字,每个数字都是它们的倍数),我想大多数答案将以一种无趣的方式变得更长,包括对其进行检查。因此,我更喜欢标题所带来的问题(按数字可整,而不是数字的倍数(不包括0))。
Jeroen Mostert 2014年

Answers:


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)

在布尔值上下文中这是错误的,因为它是“所有”连接,并且显然并非所有元素都是正确的。

可以Bool通过制作函数签名来强制返回的值并向调用者隐藏连接性sub golf($_ --> Bool()),但是函数签名中的强制在Rakudo中尚不起作用。返回值仍然正确为true或false,不是Trueor False


如果要使其返回,Bool只需so在代码前面添加一个即可so$_%%.comb.all
布拉德·吉尔伯特b2gills 2014年

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

编辑:用蒂姆的建议剃掉了一个字符。

编辑:通过在C#6中引入表达式主体成员,我们可以通过切出来进一步减少表达式return

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

总共要包含26个字符(我认为,=>不应该包含大括号,而应包括在内)。处理负数的版本可以类似地缩短。


为什么.0呢 除了整数模量,不需要任何其他东西。
彼得·泰勒

3
@PeterTaylor:如果您想要最短的程序,则i % 0可以i使用整数-给出一个DivideByZeroException
Jeroen Mostert 2014年

2
加上两倍,就可以得到NaN!真好!
彼得·泰勒

2
48d与相同48.0,但少一个字符(d表示双精度字符)。
Tim S.

1
@StuartLC:lambda不是方法;它不是方法。它们的范围是不同的,所以我认为这太违反规则了。但是,由于C#6(此答案早于此),我们有了表达式健全的成员,这些成员的确可以缩短定义。对于否定的情况,我们不能使用&,因为&它不会短路-您会在上得到零除异常%。我们可以通过将其设置为double(带有d)来解决此问题,但随后又丢失了一个字符。
Jeroen Mostert

18

杀伤人员地雷(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什么?没有扔?
Optimizer

@Optimizer:是的。0|XX
marinus 2014年

甜。另外,您的答案是11个字节,而不是13个
Optimizer

9
只有APL不会以0为模给出错误,并且在评估非布尔值布尔值时会崩溃;)
FryAmTheEggman 2014年

3
用火车代替dfn缩短一个字符:(0∧.=⍎¨∘⍕|⊢)
ngn 2014年

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才计数。真值/ falsey值计算在内。”

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

输出:

1
""

“ True”和“ False”定义为1""

勘误:
作为吉尔伯特正确地指出,perl的定义真实作为标量,它是两个整数1和字符串"1"同时,和作为标量,它是两个整数0和字符串""同时。


这可以通过不使用被缩短$_pop=~s///ger<1。我不知道OP是否会同意1并且""是有效的结果。如果不是,那么可以用另外两个字节修复它:只需添加即可|0
2014年

perl -pe'$_=s/./!$&||$_%$&/ger<1|0'是26个字节,包括|0and -p标志。您不必使用功能。
hmatt1 2014年

1
实际上,TrueFalse值更像dualvar(1,'1')dualvar(0,'')
布拉德·吉尔伯特b2gills 2014年

1
@BradGilbert有趣。我相当熟悉perlguts,但我不知道,是特殊套管。它们实际上是“三标量”,分别标记为SVIV(int),SVNV(double)和SVPV(string)。
primo

1
实际上,当您第一次使用字符串作为数字或数字作为字符串时,会对该变量进行修改以保存该附加数据。这就是为什么您第一次在使用'abc'数字时仅得到警告的原因(假设您已use warnings;启用。)
Brad Gilbert b2gills 2014年

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字节解决方案的功能?
lirtosiast

@ThomasKwa:是的。我已经测试了2014
Dennis

12

的JavaScript ES6,39个 32 28字节

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

感谢core1024您的建议,以取代(""+v).split("")[...""+v],和为openorclose建议使用的every功能。

答案目前不包含我的代码:O

先前的解决方案

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

==""不检查一个数组是空的,因为一个有效的方式[""]==""返回true,但数组是保证包含非空字符串,因此它在这里工作。

其余的是JavaScript中相当标准的速记类型转换。


1
您可以将替换(""+v).split("")为来保存一些字符[...""+v]
2014年

1
为什么不使用该every方法?v=>[...""+v].every(x=>v%x<1);
openorclose2014年

@openorclose:谢谢。从来没有机会在JS中使用它,所以我从没想过要搜索这种功能。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2014年

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

@ l4m2由于v%0回报NaNNaN == false,所以在包含0您的案件数,如10,可以返回true
Shieru Asakoto

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),然后对结果列表进行逻辑非运算。

在这里尝试。


不,如果没有使用函数,我很好。我只想指出使用函数的任何人,他们不需要计数声明,而只计算内部代码。
Mathew Kirschbaum 2014年

8

Ruby,44个字节(功能主体:37个)

可能有进一步打高尔夫球的潜力。

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

通过功能获取输入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是一件事情,请举起手来。...只有我?


哦,非常感谢!我一直忘记所有这些东西。(我也没有意识到您可以用这种方式比字符少。)
Kasran 2014年

哦,翻转逻辑似乎也会缩短一点:f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`])。没问题:)
FryAmTheEggman 2014年

哦,我从来不知道还有甚至一种all方法。
卡斯兰2014年

1>n%int(c)工作吗?
Sp3000

3
为什么要进行列表理解?使用genexp:all(c>'0'and 0==n%int(c)for c in`n`)完全一样,少2个字符,甚至保存列表的分配。
Bakuriu 2014年

8

腐霉病 11

!f%Q|vT.3`Q

这结合了@isaacg@xnor 答案。通过检查的值,它从输入中滤除数字input % (eval(current_digit) or .3)。然后,它检查结果字符串是否为空。

遇到了另一对相同长度的变体:

!f%Q|T.3jQT
!f|!T%QTjQT

在线尝试。


5

Bash + coreutils,44个字节

完整的功能定义为:

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

我不确定该如何评分,因为通常情况下,壳函数使用一组{}()包含函数主体。我在这里发现我也可以使用double (())来包含函数体,这会导致我在这里进行算术扩展。因此,目前我仅数这两个括号,欢迎对此进行进一步讨论。

输出:

$ 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
Digital Trauma'14

4

J-14个字符

函数主体是后面的部分=:。如果我们要最小化整个函数的字符数,则为15个字符*/@(0=,.&.":|])

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

,.&.":是J中将数字扩展为其十进制数字列表的最短方法:转换为字符串,分隔数字,然后将每个数字转换回数字。,.&.":|]将输入数字]|)与这些数字取模()。0*/@:=如果所有结果均为0,则返回true,否则返回false。

   f 162
1
   f every 204 212 213
0 1 0

3

爪哇- 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个字符。
Mathew Kirschbaum 2014年

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反引号,使其变为infix。7)将所有内容放在一行上。
Zgarb 2014年

1和3来自我尝试以其他方式进行操作并挽救了代码。感谢您的提示。
globby 2014年

1
我的建议:而不是使用s==filter(...)s,应该使用all(...)s。现在,由于s仅在表达式中出现一次,因此您可以用它的定义替换它并放置它where。另外,==0也可以使用代替<1
骄傲的haskeller 2014年

与第一个版本相比有了很大的改进!
自豪的haskeller 2014年

我认为如果替换为all(\y->...)$show x,您仍然会丢失一个字节and[...|y<-show x]
Zgarb 2014年

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,因为似乎下一位数字在堆栈上将是下一位?
Mathew Kirschbaum 2014年

回答所有问题将非常棘手。通过在代码中的每个字符后加上ed,将非常容易学习。尝试运行128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
Optimizer

1
回答特定问题的方法:以10为基数给出了以10为基数的转换数字的数组,在这种情况下,转换数字本身就是数字。%只需取最后两个数字(在这种情况下)并计算mod。最后两个数字是实际数字和数字(总是)
Optimizer

好的,谢谢您的建议!
Mathew Kirschbaum 2014年

2

C89,43个字节

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

C89没有布尔类型。希望能奏效。另外,我使用了第二个参数来通过堆栈传递原始编号的副本,但是定义可以是任何东西。为了获得正确的结果,您只需为两个参数(d(128, 128))调用具有相同值的函数。

编辑:由匿名用户应用建议的编辑


看看codegolf.stackexchange.com/review/suggested-edits/17160,有人给你一些打高尔夫球的建议
Justin

特别违反规则。一个参数。
edc65

是的,这篇文章实际上就是我决定制定该规则的原因,因为用户应该执行重复操作而不是执行程序似乎并不正确。
Mathew Kirschbaum 2014年

我想我必须添加一个包装函数。该函数的声明是否会增加字节数?
2014年

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的代码短一个字节。
2014年

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

truefalse 分别为 1和0,但可以随时在签名中添加一个字符以返回bool

有趣的是,如果允许调用以下形式,则递归版本会更小 r(128,128)

编辑:现在被规则禁止:

C / C ++,53个字节(主体为33个字节)

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


2
#1与一个浮点异常模具用于包含0,因为J%(I%10)将是非法对于i%10 = 0号
SBI

一个浮点异常?奇怪的。它在我的编译器上可以很好地工作,但是您是对的,这是不确定的行为。不确定依赖于编译器的UB的一般PCG立场是什么。
etheranger 2014年

什么是“依赖编译器的UB”?要么是UB,要么不是UB(除以零,或者取模数为零,的确是UB)。UB不应该被允许,因为实际上任何事情都会发生。我们可能假设您的程序将在一台机器上运行,当被零除时,该机器会炸毁并杀死周围的所有人。现在,我确定您希望我们所有人生活……C确实具有实现定义的行为的概念,但是除以零并不属于这种情况。
Jeroen Mostert 2014年

2
@etheranger:由于历史原因,除以0被称为浮点异常:stackoverflow.com/questions/16928942/…–
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

2
@JeroenMostert:我想说这个站点上所有C答案的90%以上都调用UB。只要它与一些对编译器的一些机器,答案被视为有效。
丹尼斯

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

我目前在您的函数主体中计数70个字节,而不是72个字节。但是您可以使用将其减少到67个字节d=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d))。:)
Alex A.

@AlexA。谢谢。我第一次尝试R.一定会再访:)
MickyT 2015年

@MickyT paste(a)而不是toString(a)给出相同的结果。
plannapus 2015年

@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和0表示false。


1

JavaScript(ES6)30

具有一个数字参数的函数。使用%和减法,不需要特殊情况'0',因为0%0在JavaScript中是NaN。

编辑已保存的1个字符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

我要对输入字符串说不。
Mathew Kirschbaum 2014年

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

请不要设置第二个参数!

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

“并且仅传递一个数字参数”。没有这个,您可以eval($ x)并在$ x中传递整个代码
abc667

@ abc667抱歉,但我不明白。
伊斯梅尔·米格尔

1

33倍频程(39包括功能设置)

使用数字到矩阵的转换:

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

将数字逐个除以矩阵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

我们如何测试呢?
Ismael Miguel 2014年

octave - online.net-从上方输入代码定义,然后输入(例如)f(128)。将增加输出
约根2014年

我已经找到编译器并在询问之前对其进行了尝试。但这似乎工作正常(除了f(123),可以被1、2和3整除)。但这确实适用于提供的测试用例。
Ismael Miguel 2014年

1

MATLAB-39个字符

function [b] = dividesSelf(i)
b=all(~mod(i,sscanf(num2str(i),'%1d')))
end

1

重击-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.