재정렬 된 재배치


14

당신의 임무는 줄로자를 때 (줄 바꿈 문자에 쪼개 질 때) 줄의 모든 배열이 1n 사이에서 다른 숫자를 출력하도록 컴퓨터 프로그램을 작성하는 것입니다 ! (여기서 n 은 총 줄 수입니다). 두 가지 배열로 숫자를 출력 할 수 없으며 모든 배열은이 범위에서 숫자를 출력해야합니다. n 이 있기 때문에 ! 프로그램의 라인을 배열하는 방법 이것은 각 번호가 하나의 재정렬로 출력되어야 함을 의미합니다.

예를 들어 파이썬 프로그램

print 1;"""
print 2;"""

두 가지 배열이 있습니다

print 1;"""
print 2;"""

print 2;"""
print 1;"""

첫 번째 출력 1과 두 번째 출력 2.

사용중인 언어의 표준 출력 형식을 사용할 수 있습니다. 당신은 어떤 종류의 상용구도 사용할 수 없습니다. 언어가 주장하는 모든 형식을 해결 해야하는 경우이 도전이 더 흥미 롭습니다.

채점

당신의 점수는 프로그램에서 높은 점수를 가진 줄의 수입니다. 원하는 경우 0 에서 n! -1 사이의 숫자를 출력하도록 선택할 수 있습니다 .


3
어떤 작업에 적합한 구조를 나타내는 답변은 n어떻습니까? 그들은 모두 ∞의 점수에 묶여 있습니까?
Martin Ender

@MartinEnder 예. ∞는 좋은 점수입니다. 그런 구조를 찾으면 이깁니다.
Post Rock Garf Hunter

@AdmBorkBork 예, 각 배열은 하나의 숫자를 출력해야합니다. 더 명확 할 수 있습니까?
Post Rock Garf Hunter

1
@totallyhuman 사용하는 언어에 대한 표준 출력 규칙. 나는 이것에 대해 완전히 명확하게 질문을 업데이트 할 것입니다.
Post Rock Garf Hunter

1
@EriktheOutgolfer 타이 브레이커가 없습니다. Martin은 CJam에서 무한대 점수를 매기는 방법을 찾았지만 시도 할 다른 언어가 많이 있습니다.
Post Rock Garf Hunter

답변:


7

CJam 점수 : ∞

각 줄의 형태는

];Lx+:L{__(f<0+:+\,,(;1+:**\(;}h]:+

어디 x에서 0까지 의 숫자입니다 n-1. 결과 범위 0n!-1입니다.

온라인으로 사용해보십시오! (의 경우 n=3)

실제 순열 인덱스를 계산하는 코드에 대해 jimmy23013 으로 인정 합니다. 나는 ];Lx+:L이전 줄에서 결과를 버리는 입력을 읽는 비트 만 교체했으며 현재 줄의 색인을 변수 L(처음에는 빈 배열)에 추가합니다.


아, 나는 그것을 썼다. 그러나 골프처럼 보이지 않습니다 ... (예를 들어 0+:+) 나는을 사용하여 훨씬 짧은 버전을 얻을 수 있다고 생각합니다 ,m!#.
jimmy23013

4

펄 : ∞

$z.="-1,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-2,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-3,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}

원하는 길이로 확장

메모리 사용량이 O (n ^ n)과 같으므로 메모리가 빨리 소진됩니다. 그러나 순열 인덱서를 O (n) 코드로 더 쉽게 대체 할 수 있습니다. END{}펄에서이 작업에 사용할 수있는 방법을 보여주고 있습니다 . 모든 END{}블록은 종료 시간에 실행되지만 코드에서 마지막으로 호출되는 첫 번째 블록 만/A/ 테스트 한 번만 출력됩니다.

주목하십시오 $m 카운터 때문에 오버 플로우 것이다 숫자로 문자열로 계산해야한다 (나중에보다 우주의 끝이 아니라 그것을 계산하는 원리이다). 같은 이유로 나는 A이 오버플로가 나중에 발생할지라도 실제 카운터를 사용하는 대신에 s 문자열을 구성하여 행 수를 "계산"합니다 .

펄에서 이것을하는 또 다른 방법 :

@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"1".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"2".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"3".!($a.=A),

이것은 in foo = bar bar이 다음에 실행 된다는 사실을 사용합니다.foo . 그런데이 버전은 시간과 공간에 열중하지 않지만 코드를 더 길게 만듭니다.

또 다른 아이디어는 DESTROY하나만 실행된다는 이점이있는 사용 하는 것입니다. 이미 두 가지 예를 제시 한 순열 색인 코드를 반복하지 않겠습니다.

push@F,"1";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"2";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"3";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }

또는 사용 BEGIN:

BEGIN{push@F,"1"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"2"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"3"} print"Work out permutation index of @F\n"; exit;

3

젤리 , ∞

;3ÇQŒ¿$⁼Q$?
;2ÇQŒ¿$⁼Q$?
;1ÇQŒ¿$⁼Q$?

(예 n=3 )

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

23 13라인 당 11 바이트.

n줄이 있는 프로그램의 경우 줄의 형식은

; <i> ÇQŒ¿$⁼Q$?

여기서 <i>숫자 리터럴을 나타내며 i각 행의 i범위는 1~ 범위입니다 n. (값은 i실제로 이러한 특정 숫자 일 필요는 없으며 고유 한 양수 값만 있으면됩니다.)이 프로그램은 더 이상 사용하지 않습니다.n 선 구조에서 .

어떻게?

  • 논쟁없이 젤리는 시작합니다 0 .
  • ;1추가 10또는 활성 목록입니다.
  • ⁼Q$?목록 요소가 고유한지 여부를 확인 하는 if 문 ( ) 의 조건부 모나드입니다 . 이 경우 위의 링크를 ( Ç) 라고 하고 다른 번호가 목록에 추가됩니다. 그것들이 독특하지 않다면, 우리는 첫 번째 링크를 감쌌습니다. 반복 된 요소가 목록에서 제거되고 ( Q) 순열 인덱스가 발견됩니다 ( Œ¿). 참고 A가 있다는 것을 0때 목록의 시작 부분에 Œ¿촬영하지만이에 대한 값부터 출력에 영향을주지 않습니다 i모든 긍정적이다.

새로운 젤리 기능

새로 추가와 함께 Ƒ빠른, 우리는 줄일 수 ⁼Q$바이트를 저장.

10 바이트 / 라인 (한 자리)

;1ÇQŒ¿$QƑ?

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


2

브레인 플락 , 3

(({}){})
({}())
(()(){([()()]{})()(){[()()](<{}>)}}{})

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

나는 이것을 채팅에 일찍 게시했지만 여기에 게시함으로써 사람들이 그것을 만들 수 있기를 바랍니다.

설명

기본 프로그램으로 시작합니다

(({}){})
({}())

이 점수는 2 점입니다. 다음 단계로 올라가려면 새 줄을 추가하고 싶습니다. 내 시작 추측은

(()(){[()()]{}(<()>)}{})

이것은 TOS 2가 0이면 설정하고 그렇지 않으면 아무것도 수행하지 않습니다. 이것은 실제로 좋은 시작입니다. 다른 두 줄을 사용하면 출력 하는 방법이 있기 때문에 16제외하고 모든 숫자를 얻을 수 있습니다 .422

({}())
(({}){})
(()(){[()()]{}(<()>)}{})

({}())
(()(){[()()]{}(<()>)}{})
(({}){})

이를 해결하기 위해 라인도로 설정 2합니다 4. 이것은 할 수 있습니다

(()(){([()()]{})()(){[()()](<{}>)}}{})

명확성을 위해 기본적으로 Haskell 함수를 구현합니다.

f 0 = 2
f 2 = 4
f x = x

이 문제 해결 우리는 이전에 출력 된 프로그램들 중 하나 때문에, 2현재는 출력 4다른 프로그램으로 변경하지.


2

자바 7, 점수 : ∞

public class DerangedRearrangements implements B{public void a(){System.out.println("0");}public static void main(String[]a)throws Exception{java.util.regex.Pattern p=java.util.regex.Pattern.compile("^(?:public )?class ([\\w]+).*");java.io.BufferedReader r=new java.io.BufferedReader(new java.io.FileReader("./DerangedRearrangements.java"));String line; while((line=r.readLine())!=null){java.util.regex.Matcher m=p.matcher(line);if(m.matches()){((B)Class.forName(m.group(1)).getDeclaredConstructor().newInstance()).a();}}}}interface B{void a();}
class b1 implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

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

0 ~ n! -1 을 출력 할 수 있습니다 . 추가 행은 다음 형식입니다 (여기서 INDEX는 1 에서 n! -1 사이의 숫자입니다 ).

class b<INDEX> implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

이 방법은 주문 클래스가 나열되어 있는지 확인하기 위해 자체 소스를 읽어서 작동합니다. 불행히도 java가 JIT 컴파일을 수행하는 방법 덕분에 컴파일 된 파일을 구문 분석하거나 사용자 정의 ClassLoader를 생성하여 찾을 수있는 더 멋진 방법이 없었습니다. 나는 각각의 추가 클래스가 정적으로 정의 된 숫자를 인쇄 할 수 있다고 생각하지만 이것은 더 재미있게 보였다. 그것은 또한 B인터페이스를 제거 할 수 있도록 만들지 만 점수는 바이트를 기반으로하지 않으므로 재미있게 남겨 두겠습니다.

작동 방식 (높은 수준) :

자체 소스 코드를 한 줄씩 읽습니다. 각 줄은 새 클래스를 선언하므로 리플렉션을 사용하여 새 클래스의 인스턴스를 만들고 인터페이스를 a구현하기 때문에 필요한 메소드를 호출합니다 B.


1

루비 , 점수 : ∞

(a||=[])<<2;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<1;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<3;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))

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

이 프로그램은 한 줄에 61 바이트를가집니다 (n <10의 경우). Dylnan의 솔루션 과 기본 형식이 같습니다. . 각 행의 첫 번째 숫자 사이의 다른 값이 될 것이다 1하고 n, 각 행에서 두 번째 숫자는 것이다 n.

n프로그램에 포함하지 않는 방법을 찾고 있었지만 찾을 수 없었습니다.



0

05AB1E , 점수 : 1,114,112

0ˆ¯JD{œsk
1ˆ¯JD{œsk
2ˆ¯JD{œsk

온라인으로 사용해보십시오! 인덱스가 0입니다. 각 줄의 시작에서 ˆ는 고유 문자를 전역 배열로 푸시합니다. 마지막 코드를 제외하고 나머지 코드는 쓸모없이 실행됩니다. 여기서 마지막 값은 문자열로 값을 연결 한 다음 순열 인덱스를 찾습니다. 1,114,112는 쓸 때 가능한 유니 코드 문자의 수입니다 (코드 포인트 48-57은 물론 가장 쉽게 보여줄 수 있습니다).

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