あなたのためにアナグラムをゴルフしてください!


12

タスク

この課題では、ランダムに選択されたアナグラムの1つを均一な分布で出力するコードを作成しますが、それ自体は出力しないでください。


精緻化

入力がない場合、プログラムはソースコードのアナグラムのいずれかを出力する必要があります。あなたのプログラムは、それ自身のソースをそのまま出力するべきではありません。つまり、それは決して馬であってはなりません。


入力

プログラムは何も入力してはいけません。ただし、必要に応じて言語で入力が必要な場合は、小文字が入力されると想定できますa。ただし、入力を使用しないでください。


出力

プログラムは、変数に書き込む以外の方法で出力できます。ファイル、コンソール、画面などへの書き込みが許可されています。機能returnも許可されています。


追加の規則

  • プログラムのソースコードには、少なくとも3 文字(3バイトではない)が必要です。

  • プログラムのソースコードには、少なくとも3つのアナグラムが含まれている必要があります(それ自体を除く)。たとえば、(および)以外のアナグラムが2つしかaabないため、有効な送信としてカウントされません。aabaabbaaaba

  • プログラムはエラーを生成してはなりません。

  • あなたのプログラムはアナグラムを正確に出力するはずです。

  • 標準の抜け穴標準のクインルールが適用されます。


プログラムのソースコードがであるとしますabc。次のいずれかをランダムに出力する必要があります(均一な分布):

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

そして、それは決して出力すべきではありませんabc


受賞基準

これはなので、バイト単位の最短コードが勝ちです!同点の場合、以前に投稿されたソリューションが勝ちです!



それが正しく動作することを保証する必要がありますか、それとも確率1でのみですか?
PyRulez

@PyRulez この課題では、あなたのタスクは、一様分布でランダムに選択されたアナグラムの1つを出力するコードを書くことです...(最初の文(タスクの下))
Arjun

@Arjunでは、失敗の可能性は0%で十分ですか?
-PyRulez

@PyRulezの失敗?コードは、アナグラムのいずれか(それ自体を除く)をランダムに選択して出力し、アナグラムのいずれかが出力される可能性が等しいことを想定しています。「失敗」とはどういう意味かわかりません。
アルジュン

回答:


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}

単独で実行すると、これは馬のように見えます。また、私が知っているほとんどの定義では適切な馬です。独自のソースを読み取らず(むしろ、「評価」されたリテラルを含み、引数として自分自身のコピーを与えられます)、ペイロード(ここにあるように!)、およびv文字列の外側を運ぶことができますリテラルはv内部でエンコードされます。

ランダムなアナグラムを選ぶ

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

これはこれほど長い文字列では本当に非効率的であるため、プログラム全体をテストすることはできませんでしたが、短い文字列でテストし、正しく機能しているように見えます。


TIOでThinsが機能しないのはなぜですか?
ミスターXcoder

@ Mr.Xcoderおそらく60年代の時間制限をバイパスします。
エリックアウトゴルファー

ああ、はい、あなたは正しいです。
ミスターXcoder

あなたのバイトカウントにそれがある間、あなたのコードは必要なものを逃しますQ。ただし、この「すべての順列」メソッドをを使用して「シャッフル」メソッドで変更できると思いますẊ⁼¿。また、バイトを保存しながら、TIOで動作させることもできます。
ジョナサンアラン

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

Python 2、117バイト

驚くべきことに、この解決策は予想よりも短いものです。元のコードと異なるまで、ソースコードをシャッフルします。

-mbyte007のおかげで-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

これは私が変更したPythonの基本的なクインの1つです

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

以来str不変である、あなたが実行してバイトを保存することができますL=Rし、使用sampleLではなく、使用 shufflelistrepl.it。アイデアはこのStackoverflow
-Wondercricket

@Wondercricket Sampleは文字のリストを返すため、その結果をRと比較すると常にFalseが返されます。しかし、いくつかの再配置が役立ちます、アイデアに感謝します!
デッドポッサム

3

Java 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);}}

2つのバグ修正で+52および+2バイト。ランダムに生成される文字列が元のソースコードと等しいかどうかを(正しく)チェックしていませんでした。これの可能性は、関与するキャラクターの量を考慮すると天文学的には小さいですが、チャレンジルールに準拠しているかどうかに関係なく検証する必要があります。

Javaでの私の最初の答え
。ここで試してみてください。

両方Collections.shuffle(l)を削除し、両方の!前に追加しx.equals(s)て、出力が実際にプログラムと等しいことを確認でき
ます。ここで試してください。

説明:

  • String sは、未フォーマットのソースコードが含まれています。
  • %sを使用して、このStringをそれ自体に入力するために使用されます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

Javascript(ES6)、128バイト

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

ランダム-1、0、または1を返すsort()を使用して、出力をシャッフルします。


0

Bash、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
変更せずにコード自体を出力する機会はありますか?
デッドポッサム

プログラムは、単一のラインを持っているので、また...特に、そうではないすべての置換が可能であり、唯一の行をシャッフルするようだ
マーティン・エンダー

すべての順列が可能です。テストしてください。私は多分それ自身の問題を修正しています
-DrnglVrgs

1
それ$0は「あなたのプログラムは何も入力してはいけません」という違反のように見えます。
マナトワーク

これは単なるファイル名だと確信しています。したがって、それが入力されなかったとしても、これは不正行為のクインです:(
CalculatorFeline
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.