이 목록이 동일합니까?


19

아시다시피 파이썬에는 목록이 있습니다. 당신이 알지 못할 수도 있듯이 이러한 목록은 스스로를 포함 할 수 있습니다.

a = []
a.append(a)

파이썬 2

파이썬 3

이들은 시원하고 당신이 그들과 함께 할 수있는 재미있는 것들이 많이 있지만 비교할 수는 없습니다.

a = []
a.append(a)
b = []
b.append(b)
a == b

파이썬 2

파이썬 3

직무

당신의 임무는 파이썬 (또는 파이썬 객체를 직접 처리 할 수있는 모든 언어)으로 함수를 작성하여 자신을 포함하고 비교할 수있는 두 목록을 가져 오는 것입니다.

두 개의 목록이 동일한 길이이고 일련의 숫자가 존재하지 않으면 두 개의 목록이 동일하므로 해당 순서로 두 목록을 모두 인덱싱하면이 정의가 동일하지 않은 두 개의 개체가 생성됩니다. 리스트에 포함 된 모든 비리스트 객체는 단순화를 위해 파이썬 정수이며 파이썬의 내장 정수 정수와 비교해야합니다.

프로그램 파이썬의 재귀 깊이에 의존하여 목록이 무한히 깊은 지 결정 해서는 안됩니다 . 그건:

def isInfinite(a,b):
 try:
  a==b
  return False
 except RunTimeError:
  return True

두 목록이 자체 참조인지 판별하는 올바른 방법이 아닙니다.

테스트 케이스

함수를 정의한다고 가정 equal

a = []
a.append(a)
b = []
b.append(b)
print(equal(a,b))

True

a = []
b = []
a.append(b)
b.append(a)
print(equal(a,b))

True

a = []
b = []
a.append(1)
a.append(b)
b.append(1)
b.append(a)
print(equal(a,b))

True

a = []
a.append(a)
b = [a]
print(equal(a,b))

True

a = []
b = []
c = []
a.append(b)
b.append(c)
c.append(a)
equal(a,b)

True

a=[1,[2]]
b=[1,[2,[1]]]
a[1].append(a)
b[1][1].append(b[1])

True

a = []
a.append(a)
b = [1]
b.append(a)
c = [1]
c.append([c])
print(equal(b,c))

False

a = []
b = []
a.append(1)
a.append(b)
b.append(a)
b.append(1)
print(equal(a,b))

False

a = []
b = []
a.append(a)
b.append(b)
b.append(b)
print f(a,b)

False

17
잠재적 유권자에 대한 보조 메모 : 일반적으로 특정 상황 (예 : 특정 언어에서만 흥미로운 작업)을 제외하고 는 언어 별 문제가 심각합니다 . IMO, 이것은 언어 별 도전의 훌륭한 예입니다.
DJMcMayhem

@WheatWizard 그것은 충분하지 않습니다-중첩 목록도 길이가 같아야합니다.
xnor

@WheatWizard 실제로 비교할 수 있습니다. 파이썬에서는 "재귀 제한 초과"가 동일하지 않은 경우에만 얻을 수 있습니다. tio.run/nexus/…
mbomb007

@ mbomb007 파이썬이 기본적으로 참조를 비교하기 때문입니다. 참조가 다른 두 개의 동일한 객체가 있으면 실패합니다.
밀 마법사

2
이 과제를 목록에 포함 할 수있는 모든 언어로 확장 할 수 있습니까?
CalculatorFeline

답변:


9

파이썬 2 , 94 바이트

g=lambda c,*p:lambda a,b:c in p or all(map(g((id(a),id(b)),c,*p),a,b))if a>[]<b else a==b
g(0)

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

처리되는 목록 쌍 을 저장 하고 동일한 비교가 더 낮은 레벨에있는 경우 동일하게 선언하는 isaacg의 매우 영리한 솔루션 개선 id.

재귀 단계 all(map(...,a,b))있다고 a하고 b그들의 모든 요소 대응 쌍 같으면 같다. 잘리지 않는 것과 달리 map가장 짧은 목록을로 채우 므로 길이가 같지 않습니다. 실제 목록에을 (를) 포함하지 않으므로 이러한 채워진 목록은 항상 거부됩니다.NonezipNone


,후의 목적은 무엇입니까 c?
밀 마법사

그것은 튜플을 만듭니다.
mbomb007

a=[];a+=[a,1];b=[];b+=[b,2];f(a,b)스택을 오버플로하고 a=[1];b=[2];f(a,b);f(a,b)재사용 성 문제처럼 보입니다.
Anders Kaseorg

@AndersKaseorg 목록을 변경하면 문제가 발생했습니다. 나는 이것이 문제를 해결한다고 생각한다.
xnor

1
@AndersKaseorg 그리고 기본적으로 동일한 기능 함수 솔루션을 작성했습니다. 그없이 95 바이트 솔루션이 있습니다 : f=lambda a,b,p=[0]:p[0]in p[1:]or all(map(f,a,b,[[(id(a),id(b))]+p]*len(a)))if a>[]<b else a==b. 를 처리하는 더 좋은 방법이있을 수 있습니다 map.
xnor

5

파이썬 233 218 197 217 바이트

d=id
def q(a,b,w):
 w[(d(a),d(b))]=0
 if d(a)==d(b):return 1
 if(a>[]and[]<b)-1:return a==b
 if len(a)!=len(b):return 0
 for x,y in zip(a,b):
  if((d(x),d(y))in w or q(x,y,w))-1:return 0
 return 1
lambda a,b:q(a,b,{})

마지막 줄의 익명 기능은 원하는 기능을 수행합니다.

이것은 여전히 ​​골프를 치는 과정에 있으며, 이것이 가능하다는 것을 보여주고 싶었습니다.

기본적으로 우리는 주어진 수표로 작업하는 경우 항목을 w에 넣습니다. 동일한 객체이거나, 목록이 아니고, 동일하거나, 모든 요소가 동일하거나 작업중인 경우 두 가지가 동일합니다.


a>[]대신 사용할 수 없습니까 i(a,list)?
mbomb007

@ mbomb007 "모든 것이 목록 또는 정수입니다"규칙이 추가되기 전에 작성되었습니다. 업데이트됩니다.
isaacg

당신은 사용할 수 있습니다 a>[]<blen(a)-len(b)
mbomb007을

@ETHproductions 아, 바이트 수가 잘못되었습니다. 그래서
mbomb007

d(a)==d(b)a is b있습니까? 그것은의 두 가지 용도를 줄일 것입니다 d.
xnor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.