이 번호는 Loeschian입니까?


33

양의 정수 k는 다음과 같은 경우 Loeschian 수입니다.

  • k다음과 같이 표현 될 수 i*i + j*j + i*j대한 i, j정수.

예를 들어, 첫 번째 양의 Loeschian 수는 다음과 같습니다. 1( i=1, j=0); 3( i=j=1); 4( i=2, j=0); 7( i=2, j=1); 9( i=-3, j=3); ... 그 참고 i, j주어진가 k고유하지 않습니다. 예를 들어, 9또한 생성 할 수있다 i=3, j=0.

이 숫자의 다른 동등한 특성은 다음과 같습니다.

  • k다음과 같이 표현 될 수 i*i + j*j + i*ji, j음이 아닌 정수. (정수의 각 쌍에 대해 i, j동일한 준다 음이 아닌 정수의 쌍있다 k)

  • k육각형 격자에 테셀레이션을 형성하는 연속 된 육각형 세트가 있습니다 ( k = 4및 그림 참조 k = 7). (이 속성으로 인해이 숫자는 모바일 셀룰러 통신 네트워크 에서 애플리케이션을 찾습니다 .)

  • 시퀀스 의 OEIS 페이지 에서 더 많은 특성을 확인하십시오 .

도전

소정의 양의 정수 truthy 결과 출력 그것이 Loeschian 수있는 경우 , 또는 그렇지 falsy 결과.

프로그램 또는 함수는 최대 1000또는 데이터 유형 제한까지 입력을 처리해야합니다 (예 : 1 분 미만) .

코드 골프. 최단 승리.

테스트 사례

다음 숫자는 확실한 결과를 출력해야합니다.

1, 4, 7, 12, 13, 108, 109, 192, 516, 999

다음 숫자는 잘못된 결과를 출력해야합니다.

2, 5, 10, 42, 101, 102, 128, 150, 501, 1000

관련 (@PeterTaylor에 의해 언급 됨)
Luis Mendo

무차별 대입 알고리즘에 대한 참고 사항 : √k로 반복하면 일부 바이트를 희생하여 알고리즘 복잡성을 O (n²)에서 O (n)으로 줄입니다. c;
Rod

i, j non-negative integers또는 9 (i=-3, j=3)-어느 쪽입니까?
Titus

1
@Titus 아 이제 봅니다. 정수 i, j의 각 쌍에 대해 동일한 k를주는 음이 아닌 쌍이 ​​있습니다
Luis Mendo

답변:


17

젤리 , 11 9 바이트

ÆF‘%3,2ḄȦ

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

배경

에서 바이너리 차 형태에 초등학교 결과 + AB + b² a² , 저자는 Löschian 번호에 대한 다음과 같은 정리를 증명한다.

정리 16. a² + ab + b² 형식의 음이 아닌 정수의 필요하고 충분한 조건은 소인수 분해에서 (6k + 1) 형식이 아닌 3 이외의 모든 소수 는 짝수입니다. 지수.

관련 OEIS 페이지 에 언급 된 바와 같이 , 모든 정수가 0 , 1 또는 2 모듈로 3 에 적합하기 때문에 숫자 30에 부합하는 유일한 소수이며 (6k + 1) 형식의 모든 숫자 는 일치합니다 도 1 에서, 정리는 다음과 같이 대안 적으로 언급 될 수있다.

음수가 아닌 정수 n 2 모듈로 3에 해당하는 n의 모든 소인수 가 지수를 갖는 경우에만 로첸 숫자 입니다.

작동 원리

ÆF‘%3,2ḄȦ  Main link. Argument: n (integer)

ÆF         Yield the prime factorization of n, as prime-exponent pairs.
  ‘        Increment all primes and exponents, turning primes of the form 3k - 2
           into multiples of 3 and odd exponents into multiples of 2.
   %3,2    Reduce all incremented primes/exponents modulo 3/2.
           n is Löschian if and only if this does not result in a [0, 0] pair.
           Due to Jelly's form of vectorization, this yields [3, 2] if n = 1.
       Ḅ   Unbinary; convert each pair from base 2 to integer.
           Note that [x, y] = [0, 0] if and only if 2x + y = 0.
        Ȧ  All; return 1 if the result contains no zeroes, 0 otherwise.

17

망막 , 66 63 45 43 36 바이트

^()(\1(?<1>.\1))+(\1(.(?(4).\4)))*$

Retina의 제목에도 불구하고 이것은 Loeschian 숫자의 단항 표현 을 허용하는 일반 .NET 정규식입니다 .

입력 999와 1000은 1 초 미만으로 잘 작동합니다.

온라인으로 사용해보십시오! 첫 번째 줄은 줄 바꿈으로 구분 된 테스트 스위트를 사용하고 다음 두 줄은 편의를 위해 단항으로 변환을 처리합니다.

설명

해결책은 입력이 i*i + j*(i + j)양수 i및 음수가 아닌 것으로 입력 할 수 있다는 분류 j(입력을 처리 할 필요가 없기 때문에 0)이며, 이는 n*n첫 번째 n홀수 정수 의 합입니다 . 골프를 치는 것은 앞으로 참조 할 때 흥미로운 운동이었습니다.

"앞으로 참조"는 참조하는 그룹 내에 역 참조를 넣을 때입니다. 물론 역 참조 할 것이 없기 때문에 그룹을 처음 사용할 때는 작동하지 않지만 루프에 넣으면 역 참조가 매번 이전 반복의 캡처를 가져옵니다. 차례로 반복 할 때마다 더 큰 캡처를 만들어 봅시다. 이것은 삼각형 숫자, 사각형 및 피보나치 숫자와 같은 것을 위해 매우 컴팩트 한 패턴을 만드는 데 사용될 수 있습니다.

예를 들어, 제곱은 첫 번째 n홀수 정수의 합이라는 사실을 사용하여 다음 과 같이 제곱 입력을 일치시킬 수 있습니다.

(^.|..\1)+$

첫 번째 반복에서는 아직 값이 없으므로 ..\1작동 \1하지 않습니다. 이제 우리 ^.는 단일 문자를 그룹으로 캡처하는 것으로 시작 1합니다. 후속 반복 ^.에서 앵커로 인해 더 이상 일치하지 않지만 이제는 ..\1유효합니다. 이전 반복보다 두 개 이상의 문자를 일치시키고 캡처를 업데이트합니다. 이런 식으로 우리는 증가하는 홀수와 일치하여 매 반복마다 사각형을 얻습니다.

불행히도이 기법을 그대로 사용할 수는 없습니다. 매칭 후 i*i, 우리는 얻을 필요가 i우리하여 증식 할 수 그래서뿐만 아니라 j. 이 작업을 수행하는 간단하지만 긴 방법은 일치하는 반복 i*i이 필요 하다는 사실을 활용 하여 그룹으로 항목을 i캡처하는 i것입니다 1. 우리는 이제 밸런싱 그룹 을 사용하여 이것을 추출 할 수 i있지만, 내가 말한 것처럼 비쌉니다.

대신, 나는이 "연속 홀수 정수의 합"을 작성하는 다른 방법을 찾아서 i끝에 캡처 그룹을 만들었습니다. 물론이 i홀수는 단지 2i-1입니다. 이를 통해 각 반복에서 순방향 참조를 1 씩만 증가시킬 수 있습니다. 이것이이 부분입니다 :

^()(\1(?<1>.\1))+

이것은 ()단지 그룹에 위치 빈 캡처 밀어 1(초기화하는 i에를 0). 이것은 ^.|위의 간단한 솔루션 과 거의 동일 하지만 |이 경우 사용 하는 것이 조금 까다 롭습니다.

그런 다음 메인 루프가 (\1(?<1>.\1))있습니다. \1이전의 일치 i, (?<1>.\1)다음 그룹을 업데이트 1와 함께 i+1. 새로운 측면에서 i방금 2i-1문자를 일치 시켰습니다. 정확히 우리가 필요한 것.

완료되면 일부 사각형 i*i과 일치 하고 그룹은 1여전히 i문자를 보유 합니다.

두 번째 부분은 위에서 보여준 간단한 정사각형에 더 가깝습니다. 1지금 까지의 역 참조를 무시하자 :

(.(?(4).\1))*

이것은 문자열의 시작 부분이 아니기 때문에 (^.|..\4)*사용할 수 없다는 점을 제외하고 는 기본적으로와 동일 ^합니다. 대신 .\1이미 group을 사용한 경우에만 추가 조건과 일치하도록 조건부를 사용 4합니다. 그러나 실제로 이것은 정확히 동일합니다. 이것은 우리에게 제공합니다 j*j.

빠진 것은 j*i용어입니다. 계산에는 여전히 반복 이 필요 j*j하다는 사실을 이용 하여이를 결합합니다 . 그래서 각각의 반복에 대해 우리는 또한으로 커서를 사전 에 . 연속적인 홀수와 일치하지 않기 때문에 group에 쓰지 않아야 합니다. 이것이 우리가 다음에 도달하는 방법입니다.j*jji\14

(\1(.(?(4).\1)))*

2
내가 이것을 더 많이 읽을수록, 나는 덜 이해한다. 정말 많은 정규식 알고 싶다
하비에르 디아즈

@JavierDiaz Java 정규식을 기반으로 스택 오버플로에 대한 참조설명하는 일련의 게시물이 있습니다 . 예제가 아마도 더 간단 할 것입니다.
Martin Ender

13

CJam ( 16 15 바이트)

{mF{~\3%2=&},!}

온라인 데모

이것은 스택 ( "익명 함수")이며 스택에서 스택으로 나가 0거나 스택에서 입력을받습니다 1. 그것은 숫자가 Loeschian이라는 특성을 사용합니다. 홀수 다중성을 갖는 2 mod 3과 같은 소수를 갖지 않습니다.

1 바이트 절약을위한 Dennis 에게 감사합니다 .


와우, 좋은 특성!
Luis Mendo

6

파이썬 2, 56 바이트

lambda n:any(n==i*i%n+i/n*(i/n+i%n)for i in range(2*n*n))

6

하스켈, 42 바이트

f k=or[k==i*i+j*j+i*j|i<-[0..k],j<-[0..i]]

사용 예 : f 501-> False.

의 모든 조합 시도 i에서 0까지 kj에서 0까지를 i. 조합 중 하나 이상에 대해 동등성이 유지되는 경우를 or반환 True합니다 k==i*i+j*j+i*j.

@flawr은 동일한 바이트 수를 가진 약간 다른 버전을 찾았습니다.

f k|v<-[0..k]=or[(i+j)^2==k+i*j|i<-v,j<-v]

나는 or, cool =) 에 대해 몰랐을 것이다 f k|v<-[0..k]=or[(i+j)^2==k+i*j|i<-v,j<-v].
flawr

@flawr : 아니요, 버전을 더 낮추는 방법을 모릅니다. 마음에 들지 않으면 대안 버전으로 내 답변에 추가하겠습니다.
nimi

5

자바 8, 81 바이트

k->{for(int i=0,j;i<=k;i++)for(j=0;j<=k;)if(i*i+j*j+i*j++==k)return 1;return 0;};

단순하고 순진한 구현. 우연히 같은 C #하지만 용도로 코드 ->가 아니라 =>.


중괄호와 끝을 생략 할 수 있으므로 3 바이트가 줄어 듭니다 ;. 조금도!
TheLethalCoder

@ TheLethalCoder 실제로는 할 수 없습니다 .C #과 동일한 바이트 수입니다.
저스틴

어쨌든 기분이 좋아집니다 :)
TheLethalCoder

이것은 음성 i또는 을 테스트하지 않는 것 같습니다 j.
Titus


4

젤리 , 15 14 13 12 바이트

마일 덕분에 1 바이트.

²S+P
‘ṗ2’Ç€i

온라인으로 사용해보십시오!

더 작은 테스트 케이스를 확인하십시오 .

많은 수 (50보다 큰)를 테스트 할 때 조언 :하지 마십시오.

Truthy는 양수입니다. 팔시는 0입니다.

설명

‘ṗ2’Ç€i   main chain, argument: z
‘ṗ2’      generate all pairs of numbers between 0 and z inclusive
    ǀ    apply the helper link to each pair
      i   find the index of z in the result

²S+P   helper link, argument: [x,y] (a pair of numbers)
²      compute [x*x, y*y]
 S     x*x+y*y
  +P   x*x+y*y+x*y

묶여 (for) now ... :-)
Luis Mendo

우리는 베드로의 특성을 이용해야합니까?
Luis Mendo

@LuisMendo 흥미로운 것 같지만 더 길 것 같습니다
Leaky Nun

평평하게 할 필요는 없다고 생각합니다. 도우미 링크는 이미 튜플에서 정수로 매핑됩니다.

@ 마일 영리합니다. 감사합니다.
Leaky Nun


3

MATL , 14 13 바이트

t:0hU&+HM&*+m

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

출력 1또는 0.

설명

t:    % Implicitly input number k. Duplicate. Generate vector [1 2 ...k]
0h    % Concatenate a 0. Gives [1 2 ... k 0]
U     % Square, element-wise. Gives [1 4 ... k^2 0]
&+    % Sum of all pairs from this vector. Gives a (k+1)×(k+1) matrix
HM    % Push [1 2 ... k 0] again
&*    % Product of all pairs from this vector. Gives a (k+1)×(k+1) matrix
+     % Add the two matrices
m     % True if k is a member of the resulting matrix. Implicitly display

젤리를 방금 나왔니?
Leaky Nun

@LeakyNun 얼마나 오래 지속되는지 봅시다. 어쩌면 내가 코드 설명을 비트 - P 지연거야
루이스 Mendo

아니. – – – – –
새는 수녀

당신의 차례 – – –
Leaky Nun

@LeakyNun Aw :-( 이제 설명을 추가 할 수 있습니다 :-)
Luis Mendo 16:04의

3

파이썬, 49 바이트

lambda n:0in[(n-3*i*i+0j)**.5%1for i in range(n)]

의 OEIS에 주어진 등가 2 차 형식을 사용합니다 n == 3*i*i+j*j. n-3*i*i제곱근을 i취하여 정수인지 확인하여 (즉, 0 모듈로 1 인지 확인 하여) 완벽한 제곱 인지 여부를 확인하십시오 . Python은 부동 소수점 오류없이 완벽한 제곱의 제곱근을 정확하게 계산합니다. 는 +0j음의 제곱근에 오류를 방지하기 위해 그것을 복소수한다.


3

C (gcc), 71 69 바이트

i,j,r;f(n){for(r=i=n+1;i--;)for(j=n;j--;)r*=n!=i*i+j*j+i*j;return!r;}

69 바이트 : i,j,r;f(n){for(r=i=n+1;i--;)for(j=n;j--;)r*=n!=i*i+j*j+i*j;return!r;}.
owacoder

이것은 음성 i또는 을 테스트하지 않는 것 같습니다 j.
Titus

@Titus 질문 지시는 음수 ij.
orlp

긍정적 인 k,하지만 i하고 j. 예제를 자세히 살펴보십시오.
Titus

도전 인용 @Titus : " k로 표현 될 수있다 i*i + j*j + i*j위한 i, j 음이 아닌 정수." 당신은 좀 더 자세히 살펴.
orlp

2

C #, 84 82 81 바이트

k=>{for(int i=0,j;i<=k;++i)for(j=0;j<=k;)if(i*i+j*j+i*j++==k)return 1;return 0;};

순진한 솔루션. 1 = 참, 0 = 거짓


2

VBA, 68 67 바이트

Function L(N):For a=0To N:For b=0To a:L=L+(N=a^2+a*b+b^2):Next b,a

순진 검색, n = 1000에서 약간 느리게 시작합니다. Excel은 제로 리턴을 거짓으로 인식하고 다른 모든 리턴은 진실로 인식합니다.

i> j> = 0 이기 때문에 음수 ij에 대한 조사는 필요하지 않습니다 .

(-i) 2 + (-i) (-j) + (-j) 2 = i 2 + ij + j 2

( ij 와 동일한 결과 )

(-i) 2 + (-i) j + j 2 = i 2 -ij + j 2

i 2 + i (-j) + (-j) 2 = i 2 -ij + j 2

(하나가 부정적이라면 어느 것이 중요하지 않다)

(ij) 2 + (ij) j + j 2 = (i 2 -2ij + j 2 ) + (ij-j 2 ) + j 2 = i 2 -ij + j 2

그리고 (ij)j 는 모두 음이 아니므로 음수가 아닌 Loeschian 수는 음수가 아닌 숫자를 사용하여 생성 할 수 있습니다.


바이트를 저장 Next:Next-> Next b,a테일러 스콧 덕분에.


이것은 음성 i또는 을 테스트하지 않는 것 같습니다 j.
Titus

"기타 동등한 특성"의 첫 번째 요점을 참조하십시오. 모든 테스트 사례가 올바르게 나타납니다. 답변에 수학적 타당성을 추가하겠습니다 (가능한 경우).
Joffan

미안, 내 잘못이야 필요하지 않다는 것을 읽으십시오.
Titus

@Joffan 당신은 축소 할 수 있습니다 Next:NextNext b,a
테일러 스콧

@Joffan은 솔루션을 다시 한 번보고있을 것입니다. 솔루션 :End Function의 끝 부분이 누락 되었기 때문일 수 있습니다.
Taylor Scott

1

자바 스크립트 (외부 라이브러리 사용-열거 가능) (63 바이트)

k=>_.Range(0,k+1).Any(i=>_.Range(0,k+1).Any(j=>i*i+j*j+i*j==k))

라이브러리 링크 : https://github.com/mvegh1/Enumerable 코드 설명 : 0에서 k까지의 정수 범위 ( "i"범위라고 함)를 작성하고 "i"가 특정 술어를 만족하는지 테스트하십시오. 해당 술어는 0에서 k까지의 범위를 작성하고 ( "j"범위라고 함) "j"가 특정 술어를 만족하는지 테스트합니다. 그 술어는 loeschian 공식입니다

여기에 이미지 설명을 입력하십시오


1

펄 6 ,  52 51  50 바이트

->\k{?first ->(\i,\j){k==i*i+j*j+i*j},(0..k X 0..k)}
->\k{?grep ->(\i,\j){k==i*i+j*j+i*j},(0..k X 0..k)}

{?grep ->(\i,\j){$_==i*i+j*j+i*j},(0..$_ X 0..$_)}

설명:

{
  # Turn the following into a Bool
  # ( Technically not necessary as a list of 1 or more values is truthy )
  ?

  # find all where the code block returns a truthy value
  grep

  # pointy block that takes one value (list of 2 values)
  # and gives each of the values in it a name
  ->
    $ ( \i, \j )
  {
    # return true if the definition matches
    $_ == i*i + j*j + i*j
  },

  # a list of 2 element lists (possible i and j values)
  ( 0..$_ X 0..$_ )
}

테스트:

use v6.c;
use Test;

my @true = 0, 1, 4, 7, 12, 13, 108, 109, 192, 516, 999;
my @false = 2, 5, 10, 42, 101, 102, 128, 150, 501, 1000;

plan (@true + @false) * 2;

my &is-loeschian = {?grep ->(\i,\j){$_==i*i+j*j+i*j},(0..$_ X 0..$_)}

for |(@true X True), |(@false X False) -> ( $input, $expected ) {
  my ($result,$seconds) = $input.&time-it;
  is $result, $expected, ~$input;
  cmp-ok $seconds, &[<], 60, "in $seconds seconds"
}

sub time-it ( $input ) {
  my $start = now;
  my $result = $input.&is-loeschian;
  my $finish = now;
  return ( $result, $finish - $start )
}
1..42
ok 1 - 0
ok 2 - in 0.00111763 seconds
ok 3 - 1
ok 4 - in 0.00076766 seconds
...
ok 19 - 516
ok 20 - in 0.19629727 seconds
ok 21 - 999
ok 22 - in 0.1126715 seconds
ok 23 - 2
ok 24 - in 0.0013301 seconds
ok 25 - 5
ok 26 - in 0.00186610 seconds
...
ok 37 - 150
ok 38 - in 0.83877554 seconds
ok 39 - 501
ok 40 - in 9.2968558 seconds
ok 41 - 1000
ok 42 - in 37.31434146 seconds

이것은 음성 i또는 을 테스트하지 않는 것 같습니다 j.
Titus

@Titus 는보다 작 으면 (0..$_ X 0..$_)빈 목록을 생성 하므로 음수를 확인할 필요가 없으며 음수 가 아니기 때문입니다. 긍정적 인 Loeschian 수로 만 생산되어야하기 때문에 부정적인 경우를 위해 특별한 것을 할 필요가 없습니다. $_0ijTrue
Brad Gilbert b2gills

9 = (3*3)+(-3*-3)+(3*-3)긍정적 인 Loeschian i=3, j=-3; 하지만 나는 모든 Loeschian 수는 음이 아닌 가지고 overread ij. 따라서 음수를 찾을 필요가 없습니다. 실제로 우리는 그 의견을 삭제할 수 있습니다. 버그가있어 죄송합니다. 내 잘못.
Titus

@Titus는 코드를 수정하여 {grep ->(\i,\j){$_==i*i+j*j+i*j},(-$_..$_ X -$_..$_)}(9)결과를 얻 습니다 ((-3,0),(-3,3),(0,-3),(0,3),(3,-3),(3,0)). 솔직히 나는 아마 다른 답변에서 그것을 개조했을 것입니다.
브래드 길버트 b2gills

1

PowerShell v2 +, 63 56 55 바이트

param($k)(0..$k|%{0..($i=$_)|%{$i*($i+$_)+$_*$_}})-eq$k

input을 취하고 $k위쪽으로 두 번 반복하고 (outer loop $i = 0 to $k, inner loop $j = 0 to $i), 각 반복에서 결과를 생성합니다 i*i + j*j + i*j(단축 i*(i+j) + j*j). 이러한 결과는 parens로 캡슐화되고에 배열로 전달됩니다 -eq$k. 입력과 동일한 요소 만 선택하는 필터 역할을합니다. 진실의 경우 0이 아닌 값 (백백)을 출력하거나 거짓의 경우 아무것도없는 (빈) 출력합니다. 프로세스 1000내 컴퓨터에 약 15 초.

테스트 사례

PS C:\Tools\Scripts\golfing> (1,4,7,12,13,108,109,192,516,999|%{.\loeschian-numbers.ps1 $_})-join','
1,4,7,12,13,108,109,192,516,999

PS C:\Tools\Scripts\golfing> (2,5,10,42,101,102,128,150,501,1000|%{.\loeschian-numbers.ps1 $_})-join','

PS C:\Tools\Scripts\golfing>

1

Perl, 54 + 1 ( -n플래그) = 55 바이트

for$i(0..$_){for$j(0..$_){$i*$i+$j*$j+$i*$j-$_?1:say}}

실행할 필요 -n-M5.010플래그 :

perl -nE 'for$i(0..$_){for$j(0..$_){$i*$i+$j*$j+$i*$j-$_?1:say}}'

숫자가 Loeschian 숫자 인 경우 일부 항목을 출력하고, 그렇지 않은 경우 아무것도 출력하지 않습니다.

이 구현은 상당히 지루하므로 여기에 87 바이트, 정규식 기반의 또 다른 눈이 있습니다.

perl -pE '$_=(1 x$_)=~/^(.*)(??{$1x(-1+length$1)})(.*)(??{$2x(-1+length$2)})(??{$1x length$2})$/'

역 추적에는 많은 메모리가 사용되므로 숫자를 너무 많이 테스트하지 마십시오! (특히 로치 아인이 아닌 숫자)


1

Dyalog APL , 19 바이트

⊢∊(∘.(×-⍨2*⍨+)⍨0,⍳)

0 ≤ i , jk에 대해 k ∊ ( i + j ) ² – ij 인지 확인합니다 .

    되고 케이
의 구성원
    ∘.의 모든 조합
        × 나는J
        -⍨ 감산
        2*⍨의 사각형
        + 내가 플러스 J
     모두를 I J
    0,앞에 추가 제로
    를 통해 정수 한 K

1000은 M540에서 3.3 초가 걸리고 TryAPL에서는 훨씬 더 적습니다 .


1

Matlab, 53 52 바이트

n=input('');[a b]=ndgrid(0:n);find((a+b).^2-a.*b==n)

모든 가능성에 대한 간단한 검색.
빈 배열을 거짓으로, 비어 있지 않은 벡터를 진솔한 값으로 출력합니다.

0이 아닌 모든 행렬을 허위로 간주하고 0이 아닌 것이 아닌 행렬로 간주하면 find함수를 제거 하여 47 46 바이트 솔루션을 얻을 수 있습니다 .

n=input('');[a b]=ndgrid(0:n);(a+b).^2-a.*b==n

@flawr 덕분에 1 바이트 절약


1
(a+b).^2-a.*b==n더 짧습니다.
flawr


1

매스 매 티카, 44 바이트

MemberQ[(+##)^2-##&@@@0~Range~#~Tuples~2,#]&

입력 및 재와 같은 정수 복용 이름 기능 True이상 False. 이 명령 0~Range~#~Tuples~20입력과 입력 사이에 정렬 된 모든 정수 쌍을 만듭니다 #. 이 함수 (+##)^2-##&는 인수의 합에서 인수의 곱을 뺀 제곱을 계산합니다. 두 개의 인수 ij에서 호출 될 때 이는 정확히 i^2+j^2+ij원하는대로입니다. 따라서 해당 함수는 모든 튜플에서 호출 된 다음 MemberQ[...,#]입력이 결과 값 중 하나인지 여부 를 확인합니다.


1

ASP, 39 + 4 = 43 바이트

o:-k=I*I+J*J+I*J;I=1..k;J=1..k.:-not o.

결과 : k가 Loeschian이면 만족할만한 문제입니다.

답변 세트 프로그래밍 은 프롤로그와 유사한 논리적 언어입니다. 나는 여기서 Potassco 구현 , clingo를 사용한다 .

입력은 매개 변수에서 가져옵니다 ( -ck=4 바이트 길이). 전화 예 :

clingo -ck=999

출력 샘플 :

SATISFIABLE

1000으로 시도 :

clingo -ck=1000

출력 샘플 :

UNSATISFIABLE

당신은 당신의 브라우저 에서 그것을 시도 할 수 있습니다 ; 불행히도이 메소드는 호출 플래그를 처리하지 않으므로 #const k=999작동하려면 행을 추가해야합니다 .


언 골프 드 및 설명 된 코드 :

v(1..k).  % predicate v(X) holds for any X in [1..k]
o:- k=I*I+J*J+I*J ; v(I) ; v(J).  % o holds if k is Loeschian.
:- not o.  % discard models where o doesn't holds (make problem unsatisfiable)

1

PHP, 70 바이트

for(;$i++<$k=$argv[1];)for($j=$i+1;$j--;)$i*$i+$j*$j+$i*$j-$k?:die(1);

명령 행 인수에서 입력을받습니다. 1Loeschian 번호로 종료 0합니다.
로 실행하십시오 -nr.

고장

for(;$i++<$k=$argv[1];)     # loop $i from 1 to $k
    for($j=$i+1;$j--;)      # loop $j from $i to 0
        $i*$i+$j*$j+$i*$j-$k?   # if $i,$j,$k do not satisfy the equation, do nothing
        :die(1);                # else exit with return code 1
                            # implicit: exit with code 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.