Golf Anda anagram untuk kebaikan!

12

Tugas

Dalam tantangan ini, tugas Anda adalah menulis beberapa kode yang menampilkan salah satu anagram yang dipilih secara acak dengan distribusi yang seragam tetapi tidak boleh menampilkan sendiri.


Elaborasi

Diberikan tanpa input, program Anda harus menampilkan salah satu anagram kode sumbernya. Program Anda seharusnya tidak pernah mengeluarkan sumbernya sendiri, seperti seharusnya tidak menjadi quine.


Memasukkan

Program Anda tidak boleh mengambil input apa pun. Namun, jika bahasa Anda memerlukan input sebagai kebutuhan, Anda dapat menganggap bahwa itu akan diberikan huruf kecil a. Anda tidak harus menggunakan input dengan cara apa pun.


Keluaran

Program Anda dapat menampilkan dengan cara apa pun kecuali menulisnya ke variabel. Menulis ke file, konsol, layar, dll. Diperbolehkan. Fungsinya returnjuga diizinkan.


Aturan tambahan

  • Kode sumber program Anda harus memiliki setidaknya 3 karakter (bukan 3 byte).

  • Kode sumber program Anda harus memiliki setidaknya 3 anagram yang mungkin (tidak termasuk dirinya sendiri). Misalnya, aabtidak dihitung sebagai pengiriman yang valid karena aabhanya memiliki dua anagram selain aab( baadan aba).

  • Program Anda tidak boleh menghasilkan kesalahan.

  • Program Anda harus menampilkan anagramnya dengan tepat .

  • Standar Celah dan aturan Quine standar berlaku.


Contoh

Misalkan kode sumber program Anda abc. Ini harus secara acak menampilkan salah satu dari yang berikut (dengan distribusi seragam):

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

Dan, seharusnya tidak pernah keluar abc.


Kriteria Kemenangan

Ini adalah , jadi kode terpendek dalam byte menang! Dalam hal seri, solusi yang diposting sebelumnya menang!

Arjun
sumber
Terkait .
Arjun
Apakah perlu menjamin bahwa ia berperilaku dengan benar, atau hanya dengan probabilitas 1?
PyRulez
@PyRulez Dalam tantangan ini, tugas Anda adalah menulis beberapa kode yang menampilkan salah satu anagramnya yang dipilih secara acak dengan distribusi seragam ... (Kalimat pertama (di bawah Tugas ))
Arjun
@ Arjun, jadi 0% kemungkinan gagal baik-baik saja?
PyRulez
Kegagalan @PyRulez? Kode seharusnya menghasilkan salah satu anagramnya (kecuali dirinya sendiri) yang dipilih secara acak dengan peluang yang sama dari setiap anagramnya yang dihasilkan. Saya tidak tahu apa yang Anda maksud dengan "Kegagalan".
Arjun

Jawaban:

5

Jelly , 15 byte

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

Hanya untuk memulai sesuatu; ini hampir pasti bisa dikalahkan. Ini pada dasarnya hanyalah kombinasi dari konstruktor quine universal dan fungsi "pilih permutasi acak selain input"; yang terakhir mungkin bisa diperbaiki, yang pertama hampir pasti.

Penjelasan

Konstruktor quine universal

“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}

Ini bisa dilihat sebagai quine jika dijalankan dengan sendirinya. Ini juga quine yang tepat oleh sebagian besar definisi yang saya tahu; itu tidak membaca sumbernya sendiri (melainkan mengandung literal yang "eval" ed, dan diberi salinan dirinya sebagai argumen), ia dapat membawa muatan (seperti terlihat di sini!), dan bagian vluar string literal dikodekan oleh bagian vdalam.

Pilih anagram acak

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

Ini benar-benar tidak efisien pada string selama ini, jadi saya belum bisa menguji program secara keseluruhan, tapi saya sudah mengujinya pada string yang lebih pendek dan tampaknya berfungsi dengan benar.


sumber
Mengapa Thins tidak bekerja di TIO?
Tn. Xcoder
@ Mr.Xcoder Mungkin melewati batas waktu 60-an.
Erik the Outgolfer
Oh ya, kamu benar.
Tn. Xcoder
Meskipun Anda memilikinya di byte Anda menghitung kode Anda melewatkan yang diperlukan Q. Namun saya pikir Anda dapat mengubah ini metode "semua permutasi" dengan sebuah "mengocok" satu menggunakan Ẋ⁼¿, menyimpan byte sementara juga memungkinkan untuk bekerja pada TIO.
Jonathan Allan
4

CJam , 17 byte

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

Ini tidak akan selesai dalam waktu dekat, jadi tidak ada tautan TIO kali ini.

Sebagai pelipur lara, berikut adalah solusi 20 byte yang benar-benar berakhir dengan cepat:

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

Cobalah online!

Penjelasan

{`"_~"+   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.
}_~

Solusi 20 byte malah mengacak kode sumber hingga berbeda dari aslinya.

Martin Ender
sumber
4

Python 2, 117 byte

Anehnya solusi ini lebih pendek dari yang saya harapkan. Mengacak kode sumber, hingga berbeda dari aslinya.

-2 byte, terima kasih kepada @ mbomb007
-3 byte, terima kasih kepada @Wondercricket

Cobalah online

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

Ini adalah salah satu quines dasar dalam python, yang telah saya modifikasi

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

Pembuatan anagram dilakukan dengan modul acak

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

Di mana R berisi kode sumber

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

Diperlukan tiga kutipan karena saya dipaksa untuk menyimpan baris-baris yang sebenarnya dalam kode. Lagipula, anagram akan memiliki 3 baris.

Possum Mati
sumber
1
exec sbukannyaexec(s)
mbomb007
Karena strkekal, Anda dapat menyimpan byte dengan melakukan L=Rdan menggunakan samplepada Ldaripada menggunakan shufflepada list. repl.it . Idenya diambil dari Stackoverflow ini
Wondercricket
@Wondercricket Sample mengembalikan daftar karakter, jadi membandingkan hasilnya dengan R akan selalu menghasilkan False. Tetapi beberapa pengaturan ulang membantu, terima kasih atas idenya!
Dead Possum
3

Java 7, 376 428 426 428 byte

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 dan +2 byte untuk dua perbaikan bug .. Saya tidak memeriksa (dengan benar) apakah String yang dihasilkan secara acak sama dengan kode sumber asli. Kemungkinan ini kecil sekali mengingat jumlah karakter yang terlibat, tetapi saya harus memvalidasinya terlepas dari mematuhi aturan tantangan.

Jawaban pertama saya di Jawa ..
Coba di sini.

Anda dapat menghapus keduanya Collections.shuffle(l)dan menambahkan !di depan keduanya x.equals(s)untuk memverifikasi bahwa output memang sama dengan program:
Coba di sini.

Penjelasan:

  • Ini String sberisi kode sumber yang tidak diformat.
  • %sdigunakan untuk memasukkan String ini ke dalam dirinya sendiri dengan s.format(...).
  • %c, %1$cdan 34digunakan untuk memformat tanda kutip ganda.
  • s.format(s,34,s) menempatkan semuanya bersama-sama

Dan bagian kode ini bertanggung jawab untuk mengeluarkan anagram acak:

// 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);
Kevin Cruijssen
sumber
1

05AB1E , 22 byte

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

Ini membuat daftar yang terlalu besar untuk TIO, jadi tautannya menggunakan string yang lebih kecil, tetapi idenya sama.

Cobalah online!

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

Javascript (ES6), 128 byte

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

Menggunakan sort () mengembalikan acak -1,0, atau 1 untuk mengocok output.

Tim
sumber
0

Bash, 27 96 byte

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

foldmembagi kode dalam garis, shufmengacak garis, dan trmenyatukan kembali kode

memperbaiki masalah itu sendiri, sekarang tidak akan pernah keluar sendiri

Cobalah secara Online!

DrnglVrgs
sumber
1
Apakah ada peluang untuk mengeluarkan kode itu sendiri, tanpa perubahan?
Dead Possum
Tampaknya juga hanya mengocok garis, jadi tidak semua permutasi dimungkinkan, khususnya karena program ini hanya memiliki satu baris ...
Martin Ender
Semua permutasi dimungkinkan, ujilah. Saya memperbaiki masalah itu mungkin ouputing sendiri
DrnglVrgs
1
Itu $0tampak seperti pelanggaran "Program Anda tidak boleh mengambil input apa pun."
manatwork
Saya cukup yakin itu hanya nama file. Oleh karena itu, walaupun bukan input, ini adalah quine kecurangan :(
CalculatorFeline