개미 순열 생성


13

소개

나는 초기 도전 에서 개미 순열의 클래스를 정의했다 . 알림, 순열로서 P 로부터 숫자 0 으로 R-1 마다 엔트리를위한 경우 불안해이며, P [i]를 제 제외한 일부 이전 엔트리가 P [IK] 되도록 P [I] == p는 [ ik] ± 1 입니다. 재미있는 사실로, 나는 또한 r ≥ 1 인 경우 길이 r 의 정확히 2 개의 r-1 개미 순열이 있다고 언급했습니다 . 이것은 길이 r 의 개미 순열 과 길이 r-1 의 이진 벡터 사이에 일대일 대응이 있음을 의미합니다.. 이 도전에서, 당신의 임무는 그러한 서신을 구현하는 것입니다.

작업

당신의 임무는 길이 1 ≤ n ≤ 99 의 이진 벡터를 취하고 길이 n + 1 의 개미 순열을 출력하는 프로그램 또는 함수를 작성하는 것 입니다. 순열은 0을 기준으로 1을 기준으로 할 수 있지만 (일관되어야 함) 입력 및 출력은 적절한 형식으로 될 수 있습니다. 또한 입력이 다르면 항상 출력이 달라야합니다. 그 외에는 원하는 개미 순열을 자유롭게 반환 할 수 있습니다.

가장 낮은 바이트 수가 이깁니다.

길이 4의 (0 기반) 개미 순열은 다음과 같습니다.

0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
2 1 0 3
2 1 3 0
2 3 1 0
3 2 1 0

프로그램은 길이가 3 인 8 비트 벡터 각각에 대해 이들 중 하나를 반환해야합니다.

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

프로그램이 대신 각 이진 벡터의 정수 표현을 취할 수 있습니까?
mbomb007

1
@ mbomb007 아니요. 앞에 오는 0이 중요하기 때문입니다. 0 10 0 1상이한 길이의 출력을 제공한다.
Zgarb

답변:


3

젤리 , 12 11 10 바이트

ḟẋLṭ+
0;ç/

온라인으로 사용해보십시오! 또는 길이 4의 모든 순열을 생성합니다 .

작동 원리

0;ç/   Main link. Argument: B (bit array)

0;     Prepend a 0 to B.
  ç/   Reduce [0] + B by the helper link.


ḟẋLṭ+  Helper link. Left argument: A (array or 0). Right argument: b (bit)

 ẋ     Repeat A b times, yielding A or [].
ḟ      Filter false; remove the elements of A or [] from A.
  L    Get the length of the resulting array.
       This yield len(A) if b = 0 and 0 if b = 1.
    +  Add b to all elements of A.
   ṭ   Tack; append the result to the left to the result to the right.

3

파이썬 2, 62 60 바이트

x=0,
for n in input():x=[t-n+1for t in x]+[n*len(x)]
print x

2 바이트를 골라 낸 @xnor에게 감사드립니다!

Ideone에서 테스트하십시오 .


쉼표가 필요 x=0,합니까?
ETHproductions

0,튜플입니다. 쉼표가 없으면 x를 통한 매핑 이 실패합니다.
Dennis

나는 당신이 플립 수 있다고 생각 n해야 [n*len(x)]하고 목록 빌려에지도를 변경합니다.
xnor

@xnor 실제로. 감사!
Dennis

3

파이썬, 54 바이트

lambda l:[i-i*x+sum(l[i:])for i,x in enumerate([1]+l)]

다음 절차를 사용하십시오.

  1. 목록 앞에 1을 붙입니다.
  2. 각 0 항목에 대해 0 색인 목록에 해당 위치를 씁니다.
  3. 각 항목에 대해 1을 세지 말고 오른쪽에 1을 쓰십시오.
  4. 2 단계와 3 단계의 결과를 항목별로 추가하십시오.

예를 들어, l=[1,0,1,0]제공f(l) == [2,1,3,0,4]

List with prepended 1         1 1 0 1 0

0-indexed position for 0's        2   4
Number of 1's to right        2 1 1 0 0
Sum of above two              2 1 3 0 4

앞에 0을 붙여도 같은 결과가 나타납니다. 는 enumerate그것이 더 나은 재귀 적으로 수행 할 수 있는지 볼 것, 어설픈입니다.


영리한 기술! 각 언어마다 다른 기술이 가장 좋은 방법이 매력적입니다. 이것을 JS로 이식하려고 시도했지만 sum구문 이 부족 하고 슬라이싱 되어 57에서 끝났습니다 .
ETHproductions

3

자바 스크립트 (ES6), 48 47 45 바이트

a=>[h=l=0,...a.map(c=>c?--l:++h)].map(e=>e-l)

이것은 첫 번째 요소를 직접 계산 한 다음 이진 벡터를 사용하여 각 숫자가 새로운 최고인지 새로운 최저인지를 결정하는 것을 제외하고는 @ETHproductions '방법과 비슷합니다. 편집 : @ETHproductions 덕분에 1 바이트가 절약되었습니다. 0으로 시작하고 나중에 조정하여 2 바이트를 절약했습니다. 내 이전 방법은 @Dennis의 방법과 비슷하지만 54 바이트가 소요되었습니다.

a=>a.reduce((r,b)=>[...r.map(e=>b+e),r.length*!b],[0])

2

펄, 33 바이트

에 +1 포함 -p

STDIN에 공백없이 벡터를 문자열로 제공하십시오.

antsy.pl <<< 110

antsy.pl:

#!/usr/bin/perl -p
s%^|.%y/0//+($&?++$a:$b--).$"%eg

2

자바 스크립트 (ES6), 52 바이트

v=>[...v,l=0].map(x=>x?l++:h--,h=v.length).reverse()

그것을 테스트하십시오 :

f=v=>[...v,l=0].map(x=>x?l++:h--,h=v.length).reverse()
g=v=>console.log(f((v.match(/[01]/g)||[]).map(x=>+x)))
<input oninput="g(this.value)" value="010">

설명

이것은 개미 순열이 취소 될 때 각 항목이 이전의 낮은 항목의 최대 값보다 1보다 크거나 이전의 높은 항목의 최소값보다 1이 작다는 사실을 이용합니다. 더 높은 아이템을 a 0로, 더 낮은 아이템을 a로 표시함으로써 1, 길이 n 의 개미 순열 과 길이 n-1 의 이진 벡터 사이에 정확한 일대일 대응을 만들 수 있습니다 .

Dennis의 기술로 할 수있는 최선의 방법은 57 51 바이트입니다.

v=>v.reduce((x,n)=>[...x.map(i=>i+n),!n*++j],[j=0])
v=>v.map(n=>x=[...x.map(i=>i+n),!n*++j],x=[j=0])&&x

xnor의 솔루션은 56입니다 (@Neil 덕분에 1 바이트 절약).

l=>[1,...l].map((x,i)=>i*!x+eval(l.slice(i).join`+`||0))

i-i*x될 수 있습니다 i*!x.
Neil

@ Neil 아 네, 감사합니다.
ETHproductions


0

배치, 127 바이트

@set s=%*
@set/an=h=l=%s: =+%
@for %%b in (%*)do @call:%%b
:0
@echo %n%
@set/an=h+=1
@exit/b
:1
@echo %n%
@set/an=l-=1

입력을 명령 행 매개 변수로 취하고 출력은 행으로 분리됩니다. (추가 비용없이 STDIN에서 공백으로 분리하여 입력 할 수 있습니다.)

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