당신에게 큰 이익을 위해 anagram을 골프!


12

작업

이 도전에서, 당신의 임무는 균일하게 분포하여 무작위로 선택된 아나그램 중 하나를 출력하는 코드를 작성하는 것이지만 절대로 출력되지 않아야합니다.


동화

입력이 없으면 프로그램은 소스 코드의 아나그램 중 하나를 출력해야합니다. 프로그램은 자체 소스를 그대로 출력해서는 안됩니다.


입력

프로그램은 입력을 받아서는 안됩니다. 그러나 필요한 언어를 입력해야하는 경우 소문자가 있다고 가정 할 수 있습니다 a. 그래도 입력을 사용해서는 안됩니다.


산출

프로그램은 변수에 쓰는 것을 제외하고 어떤 방식 으로든 출력 할 수 있습니다. 파일, 콘솔, 화면 등에 쓰기가 허용됩니다. 기능 return도 허용됩니다.


추가 규칙

  • 프로그램의 소스 코드는 3 이상이 아닌 3 이상이어야합니다 .

  • 프로그램의 소스 코드에는 최소한 3 개의 가능한 아나그램이 있어야합니다 (자체 제외). 예를 들어, ( 및 ) 이외의 두 개의 anagram 만 가지고 aab있으므로 유효한 제출로 계산되지 않습니다 .aabaabbaaaba

  • 프로그램에서 오류가 발생하지 않아야합니다.

  • 프로그램은 아나그램을 정확하게 출력해야 합니다 .

  • 표준 허점표준 퀴니 규칙이 적용됩니다.


프로그램의 소스 코드가이라고 가정하십시오 abc. 균일하게 분포 된 다음 중 하나를 임의로 출력해야합니다.

  1. acb
  2. bca
  3. bac
  4. cba
  5. cab

그리고 출력해서는 안됩니다 abc.


승리 기준

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다! 동점 인 경우, 이전에 게시 된 솔루션이 승리합니다!



올바르게 작동하는지, 아니면 확률 1로 보장해야합니까?
PyRulez

@PyRulez 이 과제에서, 당신의 임무는 균일 한 분포 로 무작위로 선택된 아나그램 중 하나를 출력하는 코드를 작성하는 것입니다 ... (첫 번째 문장 ( The Task ))
Arjun

@Arjun은 0 %의 실패 확률이 좋습니까?
PyRulez

@PyRulez 실패? 코드는 임의의 아나그램이 출력 될 확률과 동일하게 임의로 선택된 아나그램 (자체 제외) 중 하나를 출력해야합니다. "실패"란 무슨 뜻인지 모르겠습니다.
Arjun

답변:


5

젤리 , 15 바이트

“v0¡µṾ;ḢŒ!QḊX”v

일을 시작하는 것; 이것은 거의 확실히 이길 수 있습니다. 이것은 기본적으로 범용 quine 생성자와 "입력 이외의 임의 순열 선택"함수의 조합 일뿐입니다. 후자는 즉흥적으로 할 수 있지만 전자는 거의 확실합니다.

설명

범용 퀴네 생성자

“v0¡µṾ;Ḣ”v
“       ”v   Evaluate the following, given {itself} as argument:
 v0¡µ          No-op (which starts with "v")
     Ṿ         Escape string
      ;Ḣ       Append first character of {the argument}

자체적으로 실행되는 경우 이는 퀴인 것으로 볼 수 있습니다. 또한 내가 아는 대부분의 정의에 따르면 적절한 퀴네입니다. 자체 소스를 읽지 않습니다 (오히려, "eval"인 리터럴을 포함하고 인수로 자신의 사본이 제공됨), 페이로드 (여기에서 볼 수있는 것처럼!) 및 v문자열 외부를 전달할 수 있습니다. 리터럴은 v내부에 의해 인코딩됩니다 .

임의의 아나그램을 선택하십시오

Œ!QḊX
Œ!     All permutations
  Q    Discard duplicates
   Ḋ   Discard the first (i.e. the string itself)
    X  Choose random element

이것은 오랫동안 문자열에서 비효율적이므로 프로그램 전체를 테스트 할 수는 없지만 짧은 문자열에서 테스트했지만 올바르게 작동하는 것으로 보입니다.


TIO에서는 왜 얇은 것이 작동하지 않습니까?
Mr. Xcoder

@ Mr.Xcoder 아마도 60 초의 시간 제한을 무시할 것입니다.
Outgolfer Erik

네, 맞습니다.
Mr. Xcoder

바이트 수에 있지만 코드가 필요한 것을 놓칩니다 Q. 그러나이 "모든 순열"방법을 사용 하여 "셔플" 방법을 사용하여 Ẋ⁼¿바이트를 저장하고 TIO에서도 작동하도록 할 수 있다고 생각합니다.
Jonathan Allan

4

CJam , 17 바이트

{`"_~"+m!(a-mR}_~

이것은 곧 끝나지 않을 것이므로 이번에는 TIO 링크가 없습니다.

위로로, 매우 빠르게 종료되는 20 바이트 솔루션이 있습니다.

{`"_~"+:S{mr_S=}h}_~

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

설명

{`"_~"+   e# Standard quine framework, leaves a string equal to the source
          e# code on the stack.
  m!      e# Get all permutations. The first one will always be the original order.
  (a      e# Remove that copy of the source code and wrap it in a new list.
  -       e# Remove all copies of the source code from the list of permutations.
  mR      e# Pick a random permutation.
}_~

대신 20 바이트 솔루션은 소스 코드가 원본과 다를 때까지 소스 코드를 섞습니다.


4

파이썬 2, 117 바이트

놀랍게도이 솔루션은 예상보다 짧습니다. 원본과 다를 때까지 소스 코드를 섞습니다.

@ mbomb007 덕분에 -2 바이트 @Wondercricket 덕분에
-3 바이트

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

s=r"""from random import*;R='s=r\"""'+s+'\"""'+';exec s';L=R
while L==R:L=''.join(sample(R,len(R)))
print L""";exec s

이것은 파이썬에서 기본 quines 중 하나입니다.

s = r"print 's = r\"' + s + '\"' + '\nexec(s)'"
exec(s)

아나그램 생성은 임의 모듈에 의해 수행됩니다.

L=R
while L==R:L=''.join(sample(L,len(L)))

R이 소스 코드를 포함하는 곳

s=...
R='s=r\"""'+s+'\"""'+'\nexec s'

실제 줄 구분 기호를 코드로 유지해야하기 때문에 트리플 따옴표가 필요했습니다. 어쨌든 아나그램에는 3 줄이 있습니다.


1
exec s대신exec(s)
mbomb007

A는 이후 str불변, 당신은 수행하여 바이트를 저장할 수 있습니다 L=R및 사용 sampleL보다는 사용하여 shufflelist. repl.it . 아이디어는 이 Stackoverflow
Wondercricket

@Wondercricket Sample은 문자 목록을 반환하므로 결과를 R과 비교하면 항상 False가 반환됩니다. 그러나 일부 정리가 도움이됩니다. 아이디어를 주셔서 감사합니다!
Dead Possum

3

자바 7, 376 428 426 428 바이트

import java.util.*;class M{public static void main(String[]a){String s="import java.util.*;class M{public static void main(String[]a){String s=%c%s%1$c,x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(%1$c%1$c));x.equals(s);s=s.join(%1$c%1$c,l))Collections.shuffle(l);System.out.print(s);}}",x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(""));x.equals(s);s=s.join("",l))Collections.shuffle(l);System.out.print(s);}}

두 개의 버그 수정에 대한 +52 및 +2 바이트. 무작위로 생성되는 문자열이 원래 소스 코드와 같은지 확인하지 않았습니다. 등장 인물의 수를 고려할 때 이것은 천문학적으로 작지만 도전 규칙을 준수하지 않더라도 검증해야합니다.

Java의 첫 번째 답변
. 여기서 시도해보십시오.

둘 다 제거하고 두 앞에 Collections.shuffle(l)추가 하여 출력이 실제로 프로그램과 같은지 확인할 수 있습니다. 여기에서 시도하십시오.!x.equals(s)

설명:

  • String s포맷되지 않은 소스 코드가 포함되어 있습니다.
  • %s를 사용하여이 문자열을 자체에 입력하는 데 사용됩니다 s.format(...).
  • %c, %1$c그리고 34이중 따옴표를 포맷하는 데 사용됩니다.
  • s.format(s,34,s) 다 합쳐

이 코드 부분은 임의의 아나그램을 출력합니다.

// Strings `s` and `x` now both contain the source-code:
x=s=s.format(s,34,s);

// Create a list with the characters of this source-code-String and loop
for(List l=Arrays.asList(x.split(""));
    // as long as String `x` equals String `s`
    x.equals(s);
    // Shuffle the list, and set it to `s` in every iteration of the loop:
    s=s.join("",l))Collections.shuffle(l);
// End of loop (implicit / single-line body)

// And then print the random anagram to STDOUT:
System.out.print(x);

1

05AB1E , 22 바이트

"34çìDJœ¦.R"34çìDJœ¦.R

이렇게하면 TIO에 비해 너무 큰 목록이 만들어 지므로 링크는 더 작은 문자열을 사용하지만 아이디어는 동일합니다.

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

"34çìDJœ¦.R"           # Push this string
            34ç        # Push "
               ì       # Prepend
                DJ     # Duplicate and join 
                  œ¦   # Push all permutations except the original
                    .R # Pick a random element

1

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

!function a(){b="!"+a+"()",c=b.split(""),c.sort(()=>Math.round(Math.random())-.5),c!=b.split("")?console.log(c.join("")):a()}();

sort ()를 사용하여 임의의 -1,0 또는 1을 반환하여 출력을 섞습니다.


0

배쉬, 27 96 바이트

i=`cat $0`&&e=`fold -w1 $0|shuf|tr -d '\n'`&&while [ "$e" = "$i" ]; do `$0`; exit; done&&echo $e

fold코드를 줄로 나누고 줄을 shuf섞은 다음 tr다시 코드를 넣습니다.

자체 출력 문제가 해결되었습니다. 이제는 자체 출력되지 않습니다.

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


1
변경하지 않고 코드 자체를 출력 할 기회가 있습니까?
Dead Possum

또한 라인을 섞는 것만으로, 특히 프로그램에 단일 라인 만 있기 때문에 모든 순열이 가능하지는 않습니다.
Martin Ender

모든 순열이 가능하며 테스트하십시오. 나는 아마도 그 자체의 문제를 해결할 수도있다
DrnglVrgs

1
$0위반 같은 외모 "당신의 프로그램이 어떤 입력을하지 않아야합니다."
manatwork

나는 그것이 파일 이름 일 것이라고 확신합니다. 따라서 입력되지 않았어도 이것은 부정 행위입니다 :(
CalculatorFeline
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.