파이썬 3 , 480 433 406 364 309 299 295 바이트
내 PPCG 경력을 시작하기에 좋은 시점처럼 보였습니다.
def C(s):
S,*a={''},0,1;n=d=r=1
for c in s:d=c*d*1jor d;n+=d;a+=n,;r*=not{n}&S;x,*a=a;S|={x+t+u*1jfor t in A for u in A}
return r
from itertools import*;A=-1,0,1;n,y=int(input())-2,0;x={*filter(C,product(*[A]*n))}
while x:s=x.pop();S=*(-u for u in s),;x-={s[::-1],S,S[::-1]}-{s};y+=1
print(y)
온라인으로 사용해보십시오!
편집 :
- 인라인
D
및 X
, 골프 가능 지점을 약간 조정했습니다.
- 더 많은 트릭, 주로 세트 관련 트릭을 적용했습니다.
- 프로그램 형식으로 변경되었으며 임의의 숫자 대신 복소수를 사용하도록 변경되었습니다
m
. (복잡한 숫자는 실제로 강력하지만 종종 무시되는 골프 기능입니다. xnor의 솔루션에서 다른 도전에 맞게 조정되었습니다 )
LFR
문자열 표현을 -1,0,1
튜플로 변경하고 미친 양의 바이트 축소 (!)에 대한 실행 시간을 희생했습니다. 이제 솔루션은 이론적으로 정확하지만 결과를 15로 출력하기 전에 시간 초과됩니다.
- Jonathan Frech 덕분에 루프를 한 줄로 나눈 다음 계산을위한 훨씬 더 나은 대안을 찾았습니다
r
. 마지막으로 300 바이트 미만 !!!
- 놀랍게도
1j
파서 (-2B)를 혼동하지 않고 다른 것에 고착 할 수 있으며, not
우선 순위 (2B)는 미미합니다.
더 이상 사용되지 않는 버전 (480 바이트) :
def C(s):
m=999;a=[0,1];n=d=1
D={'F':{},'L':{1:m,m:-1,-1:-m,-m:1},'R':{1:-m,-m:-1,-1:m,m:1}}
X=lambda x:{x+~m,x-m,x-m+1,x-1,x,x+1,x+m-1,x+m,x-~m}
for c in s:
d=D[c].get(d,d);n+=d;a+=n,
if n in set().union(*map(X,a[:-3])):return 0
return 1
def f(n):
if n<3:return 1
x={*'LF'}
for _ in range(3,n):x={s+c for s in x for c in({*'LRF'}-{s[-1]})|{'F'}}
y={*x}
for s in x:
if s in y:S=s.translate(str.maketrans('LR','RL'));y-={s[::-1],S,S[::-1]}-{s}
return sum(map(C,y))
온라인으로 사용해보십시오!
주석이 달린 언 골프 솔루션 :
t = str.maketrans('LR','RL')
# hole checking function
def check(s):
m = 999 # (imaginary) board size enough to fit all generated polyominoes
a = [0,1] # previous path
n = 1 # current cell
d = 1 # current direction
# dict for direction change
D = {'F':{}, 'L':{1:m, m:-1, -1:-m, -m:1}, 'R':{1:-m, -m:-1, -1:m, m:1}}
# used to 'blur' all cells in path into 3x3
X = lambda x: {x-m-1,x-m,x-m+1,x-1,x,x+1,x+m-1,x+m,x+m+1}
for c in s:
d = D[c].get(d,d) # change direction
n += d # move current cell
# the polyomino has a hole if the current cell touches previous cells (including diagonally; thus the blurring function)
if n in set().union(*map(X,a[:-2])): return False
a.append(n) # add current cell to the path
return True
# main function
def f(n):
if n < 3: return 1
x = {*'LF'}
# generate all polystrips using the notation similar to the reference
for _ in range(3, n): x = {s+c for s in x for c in ({*'LRF'}-{s[-1]})|{'F'}}
y = {*x}
# remove duplicates (mirror, head-to-tail, mirror of head-to-tail) but retain self
for s in x:
if s in y:
S = s.translate(t)
y -= {s[::-1], S, S[::-1]} - {s}
# finally filter out holey ones
return sum(map(check,y))
온라인으로 사용해보십시오!
m = 999
은 모든 것을 계산하는 데 시간이 걸리고 계산하기 위해 이미 ~ 8 초가 걸리기 때문에 선택됩니다 n = 1..15
. 99 대신 1 바이트를 저장하는 것이 좋습니다. 더 이상 필요하지 않으며 복잡한 숫자가 내장되어 있기 때문에 임의의 입력 크기에 맞도록 보장됩니다.