숫자를 각 숫자로 나눌 수 있습니까?


47

제 친구와 저는 AP 컴퓨터 과학 수업에서 실험실에서 일하고 있었고, 골프를 마친 후에도 여전히 반 수업을 무료로 제공했기 때문에 골프 문제 하나를 코딩하기로 결정했습니다. 질문은 다음과 같습니다.

숫자 n이 주어지면, n은 각 숫자로 나눌 수 있습니까?

예를 들어 128은이 테스트를 통과합니다. 1, 2, 8로 나눌 수 있습니다. 0이있는 숫자는 자동으로 숫자를 실격합니다. 원하는 경우 다른 언어를 사용하고 솔루션을 게시 할 수 있지만 클래스에서 사용하는 언어 인 컴팩트 한 프로그램을 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를 나타내고 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의 줄 바꿈은 중요하지 않지만 사이 int와 공백 사이의 단일 공백은 중요하지 않습니다 x=1). !


18
PPCG에 오신 것을 환영합니다! 몇 가지 제안 : 1. 기능적인 공백을 계산하지 않는 것은 나쁜 생각입니다. 공백 으로 작성된 답 은 자동으로 이깁니다. 2. 해야하는 우리의 제출 인쇄 / 반환 true및 false또는이다 truthy / falsy 값 확인도? 3. java챌린지 자체가 Java와 관련이 없으므로 태그는 실제로 적용되지 않습니다.
— Dennis

괜찮아. 문제로 죄송합니다. 그것을 정리하기 위해 'int p = n'의 공간이 기능적이라고 생각하겠습니까? 지적한 다른 문제를 해결하겠습니다.
— Mathew Kirschbaum

5
코드가 작동하는 데 필요한 모든 공백은 작동합니다.
— FryAmTheEggman

좋아요, 답변 감사합니다!
— Mathew Kirschbaum

1
@RickyDemer :이 경우 0은 예외적 인 입력이기 때문에 ( 0각각의 배수 인 숫자가 있는 유일한 숫자 임) 대부분의 답변은 검사를 포함하는 데 무관심한 방식으로 더 길어질 것입니다. 그래서 나는 제목에 의해 제기 된 문제를 더 좋아한다 (0을 제외하고 숫자의 배수가 아니라 숫자로 나눌 수 있음).
— Jeroen Mostert

답변:


23

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

부울 컨텍스트에서는 "all"접점이므로 모든 요소가 사실이 아니기 때문에 false입니다.

Bool함수 signature를 만들어서 반환 값을 강제하고 호출자로부터 정션을 숨길 수는 sub golf($_ --> Bool())있지만 함수 서명의 강제는 아직 Rakudo에서 작동하지 않습니다. 반환 값은 여전히 ​​정확히 true 또는 false이며 단지 True또는 아닙니다 False.


당신이 그것을 반환 할 수 있도록하려는 경우 Bool바로 추가 so코드의 앞에 so$_%%.comb.all.
— 브래드 길버트는 b2gills

21

C # 및 System.Linq-26/40

규칙에 따라 메소드 선언 자체는 계산하지 않습니다.

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

다시 한 번, C #은 Java를 고려할 때 탁월한 선택입니다 ... I kid, I kid!

불행히도,이 기능 (및 다른 답변의 많은 기능)은 부정적인 입력에 대한 올바른 결과를 생성하지 않습니다. 우리는 이것을 고칠 수는 있지만 솔루션은 많은 매력을 잃습니다 (길이가 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

2
그리고 이중으로 NaN을 제공합니다! 좋은!
— 피터 테일러

2
48d와 동일 48.0하지만 하나의 적은 문자 (더블의 경우 d)입니다.
— Tim S.

1
@StuartLC : 람다는 방법이 아닙니다. 범위가 다르므로 규칙이 너무 많이 왜곡되는 것 같습니다. 그러나 C # 6 (이 답변 이전)부터 표현 본문 멤버가 있으므로 정의를 단축 할 수 있습니다. 부정적인 경우 에는 단락이 없으므로 &정확하게 사용할 수 없습니다 . &에서 0으로 나누면 예외가 발생합니다 %. 우리는 그것을 (with d) 로 두 배로 만들어서 고칠 수 있지만 한 문자를 다시 잃어 버렸습니다.
— Jeroen 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있습니까? 던지지 않고?
— Optimizer

@Optimizer : 예. 0|X제공합니다 X.
— marinus

단. 또한 대답은 13이 아닌 11 바이트입니다.
— Optimizer

9
오직 APL만이 0으로 모듈로에 오류를
— 일으키지 않으며

3
dfn 대신 열차로 한 문자가 짧음 :(0∧.=⍎¨∘⍕|⊢)
— ngn

14

파이썬 2 : 43 자

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

숫자에 0이 아닌 나머지 숫자가 모듈로 있는지 여부를 확인하고 그 부정을 출력합니다. 0 자리 숫자는 이상하게 처리됩니다. 컴퓨팅 %0에서 오류가 발생하기 때문에의 숫자는 0로 대체됩니다 .3. 부동 소수점 부정확성으로 인해 항상 0이 아닌 결과를 나타내는 것 같습니다.

함수 본문은 32 자입니다.


14

펄-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 값만 계산합니다. Truthy / falsey 값은 계산 되지 않습니다 ."

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

출력 :

1
""

'참'과 '거짓'으로 정의 1하고 "".

오자 :
브래드 길버트가 바르게 지적 , 펄을 정의 진정한 정수 둘 다 스칼라로 1하고 문자열 "1"동시에, 그리고 거짓을 정수 둘 다 스칼라로 0하고 문자열 ""동시에.


이것은 사용하지 않는 단축 할 수있다 $_: pop=~s///ger<1. 나는 영업 이익은 그 동의 여부를 모르는 1및 ""유효한 결과입니다. 그렇지 않은 경우 2 바이트 더 고정시킬 수 있습니다 : 그냥 add |0.
— hvd

perl -pe'$_=s/./!$&||$_%$&/ger<1|0'|0및 -p플래그를 포함하여 26 바이트 입니다. 기능을 사용할 필요는 없습니다.
— hmatt1

1
실제로 참 과 거짓 값은 더처럼 dualvar(1,'1')하고 dualvar(0,'').
— 브래드 길버트는 b2gills

1
@BradGilbert 흥미 롭습니다. 나는 perlguts에 대해 잘 알고 있지만 사실 과 거짓 이 특별한 경우 라는 것을 알지 못했습니다 . 실제로는 '트리플 스칼라'이며 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 바이트 솔루션에 사용했던 기능을 가지고 있습니까?
— lirtosiast

@ThomasKwa : 그렇습니다. 2014 년 7 월에 릴리스 된 버전 0.6.2의 코드를 테스트했습니다.
— Dennis

12

자바 스크립트 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)==""

==""[""]==""returns 이므로 배열이 비어 있는지 확인하는 올바른 방법은 아니지만 배열에 비어 true있지 않은 문자열이 포함되어 있으므로 여기에서 작동합니다.

나머지는 JavaScript에서 매우 일반적인 속기 유형 변환입니다.


1
당신은 대체하여 일부 characteras을 절약 할 수 있습니다 (""+v).split("")로 [...""+v].
— core1024

1
왜이 every방법을 사용하지 않습니까? v=>[...""+v].every(x=>v%x<1);
— openorclose

@openorclose : 감사합니다. JS에서 그것을 사용할 기회가 없었으므로 그러한 기능을 검색하는 것을 생각하지 않았습니다.
— n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2013

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

@ l4m2 이후 v%0수익률 NaN과 NaN == 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

문자열의 문자를 0 ( !vT)으로 입력하거나 입력을 나누지 않도록 필터링 한 %vzvT다음 결과 목록의 논리가 아닌 논리를 취합니다.

여기에서 시도하십시오.


아니요, 기능을 사용하지 않으면 괜찮습니다. 나는 선언을 세지 않아도되고 내부 코드 만 필요로하는 함수를 사용하는 사람을 지적하고 싶었습니다.
— Mathew Kirschbaum

8

루비, 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

파이썬 -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

오, 논리를 뒤집는 것 역시 조금 짧아지는 것 같습니다 f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`]). 그리고 문제 없습니다 :)
— FryAmTheEggman 5

아, 나는 거기 몰랐어요도 했다all 방법.
— Kasran

시겠습니까 1>n%int(c)일?
— Sp3000

3
왜 목록 이해력이 필요한가요? genexp :를 사용하면 all(c>'0'and 0==n%int(c)for c in`n`)정확히 동일하며 2 문자가 적고 목록 할당을 저장합니다.
— Bakuriu


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 5

4

J-14 자

함수 본문은 다음에 나오는 부분 =:입니다. 전체 함수의 문자 수를 최소화하려면 15 자 */@(0=,.&.":|])입니다.

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

,.&.":J에서 가장 작은 방법으로 숫자를 10 진수 목록으로 확장합니다. 문자열로 변환하고 숫자를 구분하고 각 숫자를 다시 숫자로 변환합니다. 해당 숫자 ,.&.":|]의 입력 번호 ( ]) 모듈로 ( |)를 가져옵니다 . 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

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백틱 (backticks )을 넣으면 삽입됩니다. 7) 모든 것을 한 줄에 넣으십시오.
— Zgarb

1과 3은 다른 방법으로 코드를 구하려고 시도했을 때였습니다. 팁 주셔서 감사합니다.
— globby

1
내 제안 : 사용하는 대신 s==filter(...)s을 사용해야합니다 all(...)s. 이제 s표현식에 한 번만 나타나 므로 정의 및 drop으로 바꿀 수 있습니다 where. 또한 대신 ==0에을 사용할 수 있습니다 <1.
— 자랑스런 Haskeller

첫 번째 버전에서 큰 개선!
— 자랑스런 Haskeller

당신은 아직도 당신이 잃게 한 바이트 대체 할 수 있는지 생각 all(\y->...)$show x으로 and[...|y<-show x].
— Zgarb

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을 기본 10으로 변환하는 것 같습니다. 또한 %는 다음 자리가 아니라 숫자로 수정하는 방법을 어떻게 알고 있습니까?
— Mathew Kirschbaum

모든 질문에 대답하는 것은 까다로울 것입니다. 코드에서 각 문자 뒤에 ed를 넣으면 배우기가 매우 쉽습니다. 실행 해보십시오128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
— Optimizer

1
특정 질문에 대한 답 : 10을 밑으로하면 10 자릿수의 숫자가 배열됩니다.이 숫자는 자릿수입니다. %단순히 마지막 두 숫자 (이 경우)를 가져 와서 mod를 계산하십시오. 마지막 두 숫자는 실제 숫자와 숫자입니다 (항상)
— Optimizer

알았어, 조언 고마워!
— Mathew Kirschbaum

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

래퍼 함수를 ​​추가해야한다고 생각합니다. 해당 함수의 선언이 바이트 수에 추가됩니까?
— MarcDefiant

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
int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;OP 코드보다 1 바이트 짧은 Java (1.7.0_45-b18)로 컴파일되는 버전입니다 .
— primo

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,하지만를 반환 서명 한 문자를 추가 부담 bool.

그리고 재미를 위해, 폼의 호출을 허용하면 더 작은 재귀 버전 r(128,128)

편집 : 이제 규칙에서 허용하지 않습니다.

C / C ++, 53 바이트 (본문 33)

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


2
j % (i % 10)은 i % 10 = 0
— SBI

부동 소수점 예외? 기묘한. 컴파일러에서 완벽하게 작동하지만 옳습니다. 정의되지 않은 동작입니다. 컴파일러 종속 UB에 대한 일반적인 PCG 자세가 무엇인지 확실하지 않습니다.
— etheranger

"컴파일러 종속 UB"란 무엇입니까? 그것은 UB이거나 그렇지 않습니다 (그리고 0으로 나누거나 모듈로 0은 실제로 UB입니다). 문자 그대로 어떤 일이 발생할 수 있기 때문에 UB를 허용해서는 안됩니다. 우리는 0으로 나누기가 발생하면 프로그램이 기계에서 실행되어 주위의 모든 사람들을 죽일 것이라고 가정 할 수 있습니다. 자, 우리 모두가 살기를 원한다고 확신합니다 ... C에는 구현 정의 동작의 개념이 있지만 0으로 나누는 것은 그에 해당하지 않습니다.
— Jeroen Mostert

2
@etheranger 0으로 나누기 역사적 이유 부동 소수점 예외라고 : stackoverflow.com/questions/16928942/...
— n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

2
@JeroenMostert :이 사이트의 모든 C 답변의 90 % 이상이 UB를 호출한다고합니다. 일부 컴퓨터에서 일부 컴파일러 와 함께 작동 하는 한 대답은 유효한 것으로 간주됩니다.
— Dennis

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)). :)
— Alex A.

@AlexA. 감사. 나의 첫번째 시도 중 하나는
— wi

@MickyT paste(a)대신 toString(a)동일한 결과가 나타납니다.
— plannapus

@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

자바 스크립트 (ES6) 30

하나의 숫자 매개 변수가있는 기능. 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

나는 문자열을 입력하지 말라고 말할 것입니다.
— Mathew Kirschbaum

1
Firefox 콘솔은 1을 저장 of(t=n+'')하는 것만 of t=n+''으로도 대체 할 수 있습니다.
— DocMax

1

PHP : 85 바이트 (본문 64 바이트)

이 함수가 작동하려면 단순히 문자열이나 숫자를 전달하십시오.

0 올바르게 거짓을 반환합니다.

코드:

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

두 번째 매개 변수를 설정하지 마십시오!

자바 스크립트 : 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);}

"하나의 숫자 매개 변수 만 전달합니다". 이 없다면 당신은 평가 후면 수 있습니다 ($ x)와 X $에 전체 코드를 통과
— abc667

@ abc667 죄송 합니다만, 이해가되지 않습니다.
— Ismael Miguel

1

옥타브, 33 (기능 설정 포함 39)

숫자-행렬 변환 사용 :

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

숫자를 행렬 X로 나누십시오. 여기서 X는 숫자를 문자열로 변환하고 48을 빼서 ASCII 값에서 숫자로 다시 이동합니다. 모듈로 1을 취하여 각 나눗셈의 소수 부분을 구하고 이들 모두가 0인지 확인합니다 (/ 0으로 인해 NaN 인 경우 합계는 NaN이되어 0이 아님).

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

octave - online.net- 위에서 코드 정의를 입력 한 다음 (예 : f (128)) 출력 추가
— Jørgen

컴파일러를 찾아서 요청하기 전에 시도했습니다. 그러나 잘 작동하는 것 같습니다 (을 제외하고 f(123)1, 2 및 3으로 나눌 수 있음). 그러나 제공된 테스트 사례에서는 작동합니다.
— Ismael Miguel


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.