llhuii는 어떻게 42 바이트의 파이썬으로 이블 넘버를 출력 했습니까?


71

이것은 Anarchy GolfEvil Numbers 질문 과 관련하여 Python에서 골프를 치기위한 팁 질문입니다 .

이진 확장의 짝수가 1이면 숫자는 악의 입니다. 문제는 0,3,5,...,795,797,798한 줄에 하나씩 첫 400 개의 악한 숫자를 인쇄하는 것입니다.

Python 2 제출물 은 42 바이트 솔루션으로 llhuii가 주도합니다. 그 다음으로 가장 좋은 것은 46 바이트, mitchs, 5 바이트는 47 바이트입니다. llhuii는 2 년 넘게 많은 강력한 Python 골퍼들을 뛰어 넘어 온 정말 놀라운 것을 발견 한 것 같습니다. 이러한 짧은 골프는 4 또는 5 바이트를 절약 할 수 있습니다.

Python 2 점수 표

여전히 47 바이트입니다. 나는 우리가이 퍼즐을 공동체로서 깨뜨릴 수 있기를 바라고있다. 공동으로 답변을 받으면 기여한 모든 사람의 이름으로 답변을 제출합니다. 이 질문에 대한 답은 코드 조각이나 새로운 아이디어 또는 분석 조각 일 수 있습니다. 당신이 llhuii 인 경우, 아직 우리를 위해 그것을 망치지 마십시오.

이 문제는 끝이 없기 때문에 제출 내용이 공개되지 않지만 몇 가지 단서가 있습니다. 당첨 된 출품작은 0.1699 초가 소요되었으며 다른 방법보다 훨씬 길 었으며 비효율적 인 방법을 제안했습니다. 바이트 통계에서 42 자 중 23자는 영숫자 [0-9A-Za-z]이고 19는 ASCII 기호입니다. 이것은 llhuii의 솔루션에 공백이 없음을 의미합니다.

언어 페이지 에서 Python을 선택하거나 .py파일을 업로드 하여 문제 페이지 에서 코드를 테스트 할 수 있습니다 . 참고 :

  • 파이썬 2.7이 사용됩니다
  • 코드는 인쇄하는 전체 프로그램이어야합니다
  • 문제에 대한 입력이 없습니다
  • 프로그램은 더 큰 값에서 벗어날지라도 주어진 400 값을 인쇄해야합니다.
  • 프로그램 실행 시간은 2 초입니다
  • 프로그램이 오류와 함께 종료 될 수 있습니다
  • 당신은 사용할 수 있습니다 exec; "exec is denied"는 쉘 exec를 나타냅니다.

2
이 시퀀스가 ​​"Tue-Morse 시퀀스 A010060에서 0의 인덱스"임을 주목할 가치가 있습니다. (출처 : oeis )
코너 오브라이언

답변:


51

이것은 llhuii와 같은 해결책은 아니지만 길이는 42 바이트입니다.

n=0;exec'print n;n^=(n^n+2)%3/2;n+=2;'*400

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

@JonathanFrech 덕분에 이제 40 바이트입니다.

n=0;exec'print n;n=n+2^(n^n+2)/2%3;'*400

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

총 39 개의 다른 바이트를 저장할 수 있습니다.

n=0;exec'print n;n=n+2^-(n^n+2)%3;'*400

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


1
호기심에서 42 바이트 버전이 llhuii와 동일하지 않다는 것을 어떻게 알 수 있습니까? (나는 무정부 상태 골프에 참여한 적이 없다)
Luis Mendo

6
@LuisMendo 통계 탭에는 23 개의 영숫자 바이트와 19 개의 ASCII 기호가 표시되므로 공백이 없습니다. llhuii가 글을 쓰지 않는 한 print+n, 그들의 해결책은 나의 것과 달라야합니다.
Dennis

아 코드를 모르더라도 정보를 얻을 수 있습니다. 좋은 데요 감사!
Luis Mendo

당신은 38에 대한 기회가 있다고 생각합니까? 이론적으로 가능성에 자유의 일부도이 제거가 -로 이동하여 기호 print~nprint-n하고 사용 &또는 ~내가 일을 아무것도 못 했어하지만. 또한 n=0;exec"print n;d=n^n+2;n^=d^-d%3;"*40040 바이트이지만 꽤 좋습니다.
xnor

print-nn및 의 세트 비트간에 쉬운 관계가 없기 때문에 가능성이 낮습니다 -n. print~n이론적으로는 더 유망한 것으로 들리지만이 방법으로는 40 바이트 미만을 얻을 수 없습니다.
Dennis

28

39 바이트 얻기

이것은 Dennis와 JonathanFrech 가 별도로 찾은 39 바이트 솔루션을 얻는 방법에 대한 설명입니다 . 또는 오히려, 그것은 내 실제 경로보다 훨씬 더 좋은 방법으로 어떻게 뒷받침으로 대답에 도달 할 수 있는지 설명합니다.

n=0
exec"print n;n=n+2^-(n+2^n)%3;"*400

약간 덜 골퍼하고 더 많은 양의 스패닝으로 작성하면 다음과 같습니다.

n=0
for _ in range(400):
  print n
  n=(n+2)^(-((n+2)^n))%3

비트 패리티

우리는 내에서 아이디어로 시작하는 47 바이트 솔루션 출력 형태의 모든 숫자 까지 계산 하고 하나의도의 전체 수를 만드는 패리티 비트이다.n=2*k+bk0,1,...,399b

의 작성하자 par(x)에 대한 비트 패리티x배타적 논리합 (이다 ^)의 모든 비트를 x. 짝수의 1 비트가 있으면 0이고 (숫자는 사악함) 홀수의 1 비트가 있으면 1입니다. 들어 n=2*k+b우리가 가진, par(n) = par(k)^b그래서 악을 달성하기 위해 par(n)==0우리가 필요로하는을 b=par(k)의 마지막 비트 즉, n앞의 비트의 비트 패리티가 될 수 있습니다.

골프에서 나의 첫번째 노력은 표현에 있었다 par(k), 처음으로 직접시bin(k).count('1')%2함께 다음과 비트 조작 .

패리티 업데이트

그럼에도 불구하고 짧은 표현은 없었습니다. 대신 작업 할 정보가 더 많다는 것을 인식하는 데 도움이되었습니다. 현재 숫자의 비트 패리티를 계산하는 대신

k  ---->  par(k)

우리가 증가로 우리는 비트 패리티를 업데이트 할 수 있습니다 kk+1.

k   ---->  par(k)
      |
      v
k+1 ---->  par(k+1)

즉, 카운트 업 k=0,1,2,...하기 때문에 매번 처음부터 계산하지 않고 현재 비트 패리티를 유지하면됩니다. 비트 패리티 업데이트 par(k+1)^par(k)에서가 뒤집혀 비트 수이다 패리티 kk+1해당이다 par((k+1)^k).

par(k+1) ^ par(k) = par((k+1)^k)
par(k+1) = par(k) ^ par((k+1)^k)

형태 (k+1)^k

이제 계산해야합니다 par((k+1)^k). 계산 비트 패리티는 우리가 해결하려는 문제이기 때문에 우리가 아무데도없는 것처럼 보일 수 있습니다. 그러나 숫자 는 2의 거듭 제곱보다 1이 적은 (k+1)^k것으로 표현되며 숫자는 비트 핵에서1,3,7,15,.. 종종 사용됩니다 . 왜 그런지 보자.

우리가 증가 할 때 k, 이진 캐리의 효과는 마지막 0과 모든 1것을 오른쪽 으로 뒤집는 것 0입니다. 예를 들어k=43=0b101011

      **
  101011  (43)
 +     1
  ------
= 101100  (44)

  101011  (43)
 ^101100  (44)
  ------
= 000111  (77)   

캐리를 발생시키는 열은로 표시되어 *있습니다. 이것은 a로 1변경하고의 0캐리 비트를 전달합니다.이 비트 10in k에 도달 할 때까지 왼쪽으로 전파 되고로 변경됩니다 1. 더 왼쪽에있는 비트는 영향을받지 않습니다. 그래서, k^(k+1)비트 위치를 확인 변경 kk+1, 그것은 가장 오른쪽의 위치를 발견 0하고 1그 오른쪽에의합니다. 즉, 변경된 비트는 접미사를 형성하므로 결과는 0 다음에 하나 이상의 1이옵니다. 선행 0이 없으면 1, 11, 111, 1111, ...2의 거듭 제곱보다 작은 이진수가 있습니다 .

컴퓨팅 par((k+1)^k)

이제 (k+1)^k로 제한됨을 이해 1,3,7,15,...했으므로 이러한 숫자의 비트 패리티를 계산하는 방법을 찾으십시오. 여기에, 유용한 사실은 즉 1,2,4,8,16,...다른 모듈 3사이 12, 이후 2==-1 mod 3. 따라서 1,3,7,15,31,63...모듈로를 3사용하면 1,0,1,0,1,0...비트 패리티가됩니다. 완전한!

따라서 업데이트를 다음 par(k+1) = par(k) ^ par((k+1)^k)과 같이 수행 할 수 있습니다.

par(k+1) = par(k) ^ ((k+1)^k)%3

b패리티를 저장하는 변수로 사용 하면 다음과 같습니다.

b^=((k+1)^k)%3

코드 작성

코드에서 이것을 함께 퍼팅, 우리는 시작 k과 패리티 비트 b에 모두 0다음 반복적으로 인쇄, n=2*k+b업데이트 b=b^((k+1)^k)%3k=k+1.

46 바이트

k=b=0
exec"print 2*k+b;b^=(k+1^k)%3;k+=1;"*400

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

우리는 주위에 괄호를 제거 k+1((k+1)^k)%3있기 때문에 파이썬의 우선 순위는 첫째, 어쨌든 보이는 이상한로 추가한다.

코드 개선

단일 변수로 직접 작업하고 직접 n=2*k+b업데이트를 수행하면 더 잘할 수 있습니다 . 에 k+=1해당합니다 n+=2. 그리고 업데이트는에 b^=(k+1^k)%3해당합니다 n^=(k+1^k)%3. 여기서 k=n/2업데이트하기 전에 n.

44 바이트

n=0
exec"print n;n^=(n/2+1^n/2)%3;n+=2;"*400

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

우리는 다시 작성하여 단축 할 수 있습니다 n/2+1^n/2(이것을 기억하십시오 (n/2+1)^n/2)

n/2+1 ^ n/2
(n+2)/2 ^ n/2
(n+2 ^ n)/2    

/2마지막 비트를 제거 하므로 xoring 전이나 후에 비트를 제거해도 문제가되지 않습니다. 그래서 우리는 있습니다 n^=(n+2^n)/2%3. 우리는 모듈이 있음을 지적하여 다른 바이트를 저장할 수 있습니다 3, /2에 해당 *2에 해당 -즉 지적, n+2^n분할은 바닥없이 실제 반감이도 그래서입니다. 이것은 준다n^=-(n+2^n)%3

41 바이트

n=0
exec"print n;n^=-(n+2^n)%3;n+=2;"*400

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

마지막으로, 우리는 작업을 결합 할 수 있습니다 n^=c;n+=2n=(n+2)^c, 여기서 c조금이다. 이것은 ^c마지막 비트에서만 작동 하고 마지막 비트 +2는 신경 쓰지 않기 때문에 작동하므로 작업이 출퇴근합니다. 다시, 우선 순위는 parens를 생략하고 씁니다 n=n+2^c.

39 바이트

n=0
exec"print n;n=n+2^-(n+2^n)%3;"*400

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


13

이것은 내 (xnor 's) 47 바이트 솔루션과 그것을 이끌어 낸 사고를 제공합니다. 직접 알아 내려면이 글을 읽지 마십시오.

당연한 첫 번째 아이디어는 0에서 799까지의 숫자를 반복하여 짝수의 1을 가진 이진수로만 인쇄하는 것입니다.

52 바이트

for n in range(800):
 if~bin(n).count('1')%2:print n

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

여기서, 카운트 ~는 비트를 보완 even<->odd하여 카운트 를 전환 하고 짝수 카운트에서만 진실한 가치를 부여합니다.

필터링하는 대신 모든 값을 생성하여이 방법을 개선 할 수 있습니다. 출력 값은 0에서 399까지의 숫자이며 각각 1 비트의 숫자를 고르게하기 위해 비트가 추가되어 있는지 확인하십시오.

0 = 2*0 + 0
3 = 2*1 + 1
5 = 2*2 + 1
6 = 2*3 + 0
...

그래서, n일 수는 중입니다 2*n+b중 하나와 b=0b=1. 비트 b1비트 n수로 비트 수를 세고 모듈로 2 카운트를 취하여 찾을 수 있습니다 .

49 바이트

for n in range(400):print 2*n+bin(n).count('1')%2

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

우리의 2 바이트를 줄일 수 2*이상 반복에 의해 0,2,4,..., 어떤 아닌 기회 횟수 않습니다 1'들. exec400 회 실행 되는 루프를 사용하고 n각 루프마다 2 씩 증가시켜 이를 수행 할 수 있습니다 .

47 바이트

n=0;exec"print n+bin(n).count('1')%2;n+=2;"*400

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

그리고 이것이 47 바이트 솔루션입니다. 다른 47 바이트 솔루션이 모두 같은 것은 아니라고 생각합니다.


1
47 바이트 길이가 exec접근이 허용됩니까?
Jonathan Frech

1
@JonathanFrech 예, 페이지에 "exec is denied"라고 표시되면 Python이 exec아니라 명령 행을 참조하는 것 exec입니다.
xnor

9

llhuii의 Python 3 제출

글을 쓰는 시점에서 이블 번호에 대한 Python 3 제출은 다음과 같습니다.

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

llhuii는 아마도 그들의 트릭을 Python 3으로 이식하고 해결책을 제시했습니다.

  • Python 2 솔루션보다 3 바이트 더 길며
  • 45-(25 + 18) = 2 바이트의 공백이 있습니다.

xnor의 47B를 문자 그대로 Python 3으로 이식하면 다음 50B를 얻습니다.

n=0;exec("print(n+bin(n).count('1')%2);n+=2;"*400)

로 제출했습니다 ppcg(xnor). ( exec과에 괄호를 추가 하고 print이제는 함수입니다.) 다른 Python 3 답변과 다른 코드 통계가 있으며 모두 공백이 있습니다. 흥미 롭습니다!

다시 작성하는 더 짧은 방법이 있습니다 ( execPython 3에서 경쟁 우위를 잃는 경향이 있습니다).

n=0
while n<800:print(n+bin(n).count('1')%2);n+=2

49 바이트입니다. 로 제출했습니다 ppcg(xnor,alternative). 이것은 llhui의 대답과 같이 2 바이트의 공백이 있습니다! 이것은 llhuii의 Python 3 답변이 다음과 같이 보인다고 생각합니다 (줄 바꿈 다음 while루프). 따라서 llhuii는 아마도 우리와 마찬가지로 execPython 2와 whilePython 3에서 사용되었을 것입니다 . 이것은 공백 차이를 설명합니다.


우리 47B는 파이썬 3에서 49B가되었습니다. 이제 흥미로운 것은 llhuii의 42B가 44B가 아니라 45B가 된 것입니다! llhuii의 솔루션에 대해서는 파이썬 3에서 1 바이트가 더 필요합니다. 이것은 다양한 것을 의미 할 수 있습니다.

  • 마음에 오는 첫번째 것은이다 부문 : 어쩌면 llhuii이 사용 /되었다 파이썬 2에서 //파이썬 3에서 (그들은 우리와 같은 조로으로 계산하는 경우, 다음 n/2이동하는 데 사용할 수있는 n하나의 비트에 의해 다시 오른쪽으로?)

  • 염두에 두어야 할 다른 것은 인쇄 후 단항 연산자 입니다. 우리 print blahprint(blah)(1 바이트 추가)가되었지만 llhuii print~-blah가 Python 2 와 같은 것을 쓰면 print(~-blah)Python 3이됩니다.

  • 다른 아이디어가있을 수도 있습니다. 알려주세요.

내 것을 포함하여 모든 Py3 솔루션에 대한 코드 통계 :

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


1
내가 흥미로운 점은 Python 3 솔루션이 Python 2 솔루션보다 훨씬 빠르다는 것입니다. 그들은 파이썬 3에서 더 효율적인 파이썬 기능을 사용하거나 결국 간단한 포트가 아닙니다 (직접 포트보다 짧은 파이썬 3 솔루션을 찾았을 수도 있습니다).
Jonathan Frech

2
anagol의 런타임은 차이가 있습니다. 저는 llhuii의 런타임이 Py2 런타임이 단지 빨간 청어 / 이상치라고 생각하게 만드는 OP에 대해 언급했습니다
Lynn

또한 xnor가 매우 유사한 트릭을 발견하고 개선했다고 가정합니다 ( 악한 숫자를 인쇄 하는 많은 방법 이있을 수는 없습니다 !?). 그 해결책은 매우 빠릅니다!
Lynn

7

다른 접근법

1) A001969의 공식 사용

이진으로 변환하는 대신 다음 공식 ( OEIS ) 을 활용할 수 있습니다 .

a(1) = 0
for n > 1: a(n) = 3*n-3-a(n/2) if n is even
           a(n) = a((n+1)/2)+n-1 if n is odd

나는 파이썬에서 골프를 치는 것이 매우 나쁘기 때문에 시도조차하지 않을 것입니다. 그러나 여기 JS에서 빠른 시도가 있습니다.

NB : 배열을 표시하지 않고 채울 뿐이므로 유효한 JS 제출이라고 생각하지 않습니다. 그럼에도 불구하고 현재 최고의 JS 솔루션 (45 바이트)보다 5 바이트 더 깁니다. 그러나 그것은 여기서 중요한 것은 아닙니다.

for(a=[n=0,3];n<199;)a.push(2*++n+a[n],6*n+3-a[n])

희망이 약간의 영감을 줄 수 있습니다.

배열을 초기화하고 업데이트해야하므로 배열을 사용하는 것은 좋지 않습니다. 그것은 (코드 크기 현명한)가 사용하는 것이 더 효과적 일 수 재귀 함수 승리의 솔루션입니다 이유를 설명하는 것 대신에, 더 많은 시간을 가지고 다른 사람보다 더합니다.

2) 치환으로 Thue-Morse 시퀀스 구축

이론적 으로이 코드는 다음과 같이 작동합니다.

n=0;a="1";b="0";exec"t=a;a+=b;b+=t;print(int(b[n]))+n;n+=2;"*400

온라인으로 사용해보십시오! (실행 가능한 버전은 20 개로 제한됨)

연속 된 대체로 Thue-Morse 시퀀스를 계산하고 동일한 루프에서 1의 위치 (사악한 숫자)를 찾습니다.

그러나:

  • 현재 형태로는 너무 길다
  • 빠르게 메모리 오버플로가 발생합니다.

3) 비트 단위 연산으로 Thue-Morse 시퀀스 구축

Thue-Morse 시퀀스 의 Wikipedia의 Direct Definition 에서 시작 하여이 알고리즘을 사용했습니다 (JS로 다시 전환 ... 미안합니다).

for(e=n=0;n<799;)(e^=!(((x=n++^n)^x/2)&170))||console.log(n)

여기서 우리 는 e 에서 시퀀스 의 현재 을 추적 하고 바이트에서 홀수 비트의 비트 마스크로 170 을 사용 합니다.


나는 재귀 함수의 아이디어를 좋아하지만 파이썬은 상용구에 대해 매우 나쁩니다. f=lambda n:_ for n in range(400):print f(n)이미 43 바이트가 걸립니다. 자신을 참조하는 배열 또는 미래의 요소를 끝에 추가하는 배열을 만들어서 재귀를 시뮬레이션하는 방법이있을 수 있습니다.
xnor

2
또한, llhuii의 솔루션은 자신이 사용하지 않은, 그래서 거기에 공백이없는 def, for, while, lambda(매개 변수 적어도) 등
스티븐

@Stephen 같은 while~0:print~1것은 공백이 필요하지 않습니다.
Jonathan Frech

방법 번호 3에서는 ((x=n++^n)^x/2)가장 낮은 세트 비트를 찾는 것만으로도 장황하게 보입니다. 그 전체 혼란은로 대체 될 수 있습니다 ++n&-n. 온라인으로 사용해보십시오!
프리모

@primo 나는 여기서 내가 무엇을 생각하고 있었으며 어떻게이 성가신 공식에 왔는지 전혀 모른다. ¯ \ _ (ツ) _ / ¯
Arnauld

5

중첩 카운터 접근

나는 다른 접근 방식에 대한 아이디어가 있지만 파이썬 골프에는 경험이 충분하지 않으므로 여기 골프 클럽의 다른 출발점으로 생각할 것입니다.

골치 아픈 아이디어 :

n=0
i=1
for _ in"01":
 i^=1
 for _ in"01":
  i^=1
  for _ in"01":
   i^=1
   for _ in"01":
    i^=1
    for _ in"01":
     i^=1
     for _ in"01":
      i^=1
      for _ in"01":
       i^=1
       for _ in"01":
        i^=1
        for _ in"01":
          i^=1
          if n<800:print i+n
          n+=2

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

9 단계 중첩 깊이, 모든 루프는 동일하므로 내 마음에 의해 작성되어야합니다 exec"something"*9+"deepest stuff". 실제로 나는 for cycle로 이와 같은 것을 할 수 있는지 모른다.

골프를 위해 고려해야 할 사항 :

  • 어쩌면 for 루프 이외의 두 번 순환 할 수있는 다른 가능성이있을 수 있습니다 (문자열 인수로 두 번 실행 된 문자열로 quine과 비슷한 접근법을 시도했지만 머리가 폭발했습니다).

  • 에 대한 더 좋은 대안이있을 수도 있습니다. if n<800:여기서는 우리가 2 ^ 10까지 악의 숫자를 계속 인쇄하기 때문에 여기에 필요합니다.



아마도 중첩 for 루프 대신 중첩 목록 이해를 시도해보십시오.
Sparr

@Sparr 문제는 실제로 숫자를 인쇄하는 것입니다. 파이썬 2에서 print함수가 아닌 문장이므로 이해 안에 나타날 수 없습니다.
Jonathan Frech

아마print '\n'.join([[[[[[[[[foo]foo]foo]foo]foo]foo]foo]foo]foo])
Sparr

@Sparr 그러면 문제는 목록을 평탄화하는 데 있습니다. str.join문자열이 포함 된 목록에서만 작동하며 추가 목록 문자는 인쇄하지 않아야합니다. 서식 만 지정하면 많은 양의 바이트가 필요합니다.
Jonathan Frech

5

아이디어 : 짧은 비트 패리티

bin(n).count('1')%2비트 수의 패리티를 계산하려면 많은 문자가 필요 합니다. 아마도 비트 길이가 제한된 경우 산술 방식이 더 짧을 수 있습니다.

같은 길이의 귀여운 방법은 int(bin(n)[2:],3)%2이진수 값을 기수 3(또는 홀수 기수) 로 해석하는 것 입니다. 불행히도, 4 바이트의 바이트는 0b접두사를 제거하는 데 소비 됩니다. 또한 작동합니다 int(bin(n)[2:])%9%2.

또 다른 아이디어는 xor를 사용하여 비트를 결합하는 것입니다. 경우 n이진 표현을 가지고 abcdefghi다음,

n/16 = abcde
n%16 =  fghi

r = n/16 ^ n%16 has binary representation (a)(b^f)(c^g)(d^h)(e^i)

따라서 r=n/16^n%16악한 경우에만 n악입니다. 우리는 다음과 같이 그것을 반복 할 수 있습니다 s=r/4^r%4, 값 s에을 0,1,2,3, 그 중 12와 체크 가능, 악하지 않습니다 0<s<3.

52 바이트

n=0;exec"r=n/16^n%16;print(0<r/4^r%4<3)+n;n+=2;"*400

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

이것은 더 좋은 거래로 밝혀졌습니다. 숫자를 나누는 방법, 최종 숫자를 확인하는 방법 (비트 기반 조회 테이블 일 수 있음)을 사용하여 돌리는 노브가 많이 있습니다. 나는 이것들이 지금까지만 갈 수 있다고 생각합니다.


to_bytes정수 기능 을 사용할 수 있습니까? 의심 스럽지만 고려해야 할 사항 :)
HyperNeutrino

@HyperNeutrino 나는 그것이 Python 3 일 뿐이라고 생각합니까?
xnor

yup my bad : / rip
HyperNeutrino

9
단순히 사용 0b: int(bin(n),13)%2! : D
Noodle9

3
진행! Noodle9의 트릭은 44 바이트 솔루션을 제공합니다.n=0;exec"print~int(bin(n),13)%2+n;n+=2;"*400
Lynn

4

구성에 의해, n+n^n항상 악하지만, 내 가난한 파이썬 기술은 61 바이트 솔루션 만 얻을 수 있습니다.

for n in sorted(map(lambda n:n+n^n,range(512)))[:400]:print n

5 바이트를 저장 한 @Peilonrayz와 1 바이트를 저장 한 @ Mr.Xcoder에게 감사합니다.

for n in sorted(n^n*2for n in range(512))[:400]:print n

55 바이트 : for n in sorted(n^n*2for n in range(512))[:400]:print n. n+n^nn^n*2
Xcoder 씨

3

아이디어 : A006068 ( "a (n)은 n으로 회색으로 코딩 됨")

Neil은 모든 2n XOR n호기심을 불러 일으켰다는 생각 때문에 이런 종류의 배후에있는 지수를 찾으려고 노력했습니다. 이 코드를 작성했으며 다음과 같이 작성할 수 있음을 보여줍니다.

for n in range(400):x=a(n);print 2*x^x

a(n)A006068 (n)은 어디에 있습니까 ? 온라인으로 사용해보십시오!

그러나 이것은 우리가 A006068을 계산하는 짧은 방법이 있다고 가정합니다. 4 바이트 ( a(n)부분)로 계산할 수 있다고 가정하면 이미 38 바이트 입니다. 실제 구현 (TIO 헤더)은 그보다 훨씬 깁니다. 나는 이것에 대한 희망이별로 없다고 생각합니다.


3

아이디어 : XOR 이상 감소

당신이 n함께 모든 비트를 XOR한다면 , 그것은 0악과 비악을 1위한 것입니다. 다음과 같이 재귀 함수를 사용하여이 작업을 수행 할 수 있습니다.

f=lambda n:f(n/2^n&1)if n>1else-~-n

악에 대해 1을 반환합니다.

35 바이트이며 숫자가 악한 지 여부를 확인합니다. 불행히도, filter이미 6 바이트이므로 이것이 최적의 솔루션이 아니었지만이 아이디어는 골치 아픈 것일 수 있습니다.


나는 당신이 f=lambda n:n>1and f(n/2^n&1)or-~-n-1 바이트를 할 수 있다고 생각합니다 .
Outgolfer Erik

@EriktheOutgolfer 내가 시도했지만 f(n/2^n&1)0을 반환 하면 오류가 발생 합니다 ...
HyperNeutrino

2

대체 방법 : {1-> {1, -1}, -1-> {-1, 1}}

이 치환을 {1-> {1, -1}, -1-> {-1, 1}}로 10 번 반복 한 다음 1을 평평하게하고 위치를 확인할 수 있습니다

수학 코드는 다음과 같습니다.

(F = Flatten)@
Position[F@Nest[#/.{1->{1,-1},-1->{-1,1}}&,1,10],1][[;; 400]] - 1

파이썬에서 어떻게 할 것입니까?
Aneesh Durg

2
@AneeshDurg이 솔루션에서 흥미로운 점이 있습니까? 상자 밖에서 생각하면 인생의 의미로가는 길을 찾을 수 있습니다 AKA 42
J42161217
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.