Deskripsi tantangan
"Gangguan" dari urutan adalah permutasi di mana tidak ada elemen yang muncul di posisi aslinya. Misalnya ECABD
adalah kekacauan ABCDE
, tetapi CBEDA
tidak:
ABCDE
| | <- B and D are in their orignal positions
CBEDA
Dengan diberi urutan, hasilkan kekacauan acak.
Catatan
Anda dapat mengambil string sebagai input atau array / daftar elemen (integer, karakter, objek ...)
Alih-alih mengembalikan objek baru, Anda dapat memodifikasi yang sudah ada dengan menukar elemen-elemennya
Setiap kekacauan harus memiliki probabilitas yang sama untuk dihasilkan
Anda dapat mengasumsikan bahwa ada lebih dari satu elemen dalam urutan dan tidak ada yang muncul lebih dari sekali
Jawaban:
CJam , 14 byte
Cobalah online!
Terus mengocok input sampai kekacauan.
Penjelasan
sumber
Jelly , 6 byte
Cobalah online!
Penjelasan
Jonathan Allan menyimpan satu byte.
sumber
Ẋ=³S$¿
menghemat satu byte.$
. Terima kasih!Python, 85 byte
Mengubah daftar yang diteruskan (diizinkan oleh meta dan dalam pertanyaan).
Coba online di sini!
sumber
def D(l):
denganl=input()
dan kemudian menyimpan ruang lekukan di baris berikut (jadi Anda memiliki program alih-alih fungsi). Tapi tidak downvote!ES6 (Javascript),
71, 69 byteInput dan output adalah array, harus bekerja dengan semua jenis elemen (string, angka, dll), selama mereka dapat dibandingkan dengan "==".
Golf
Uji
Cuplikan Interaktif
sumber
Perl 6 , 33 byte
Lambda yang mengambil daftar bilangan bulat atau karakter sebagai input, dan mengembalikan daftar baru.
Jika harus mendukung daftar nilai arbitrer ,
ne
harus diganti dengan!eqv
(+2 byte).( Cobalah online. )
Penjelasan:
{ }
: Mendefinisikan lambda..pick(*)
: Menghasilkan acak acak dari daftar input..pick(*) xx *
: Membuat urutan tak terbatas malas dari pengocokan tersebut.(* Zne $_).all
: Sebuah lambda yang zip dua daftar (argumennya*
, dan argumen lambda luar$_
) denganne
operator (kesetaraan string negatif), menghasilkan daftar boolean, dan kemudian membuatall
persimpangan untuk mengelompokkannya ke satu negara boolean.first PREDICATE, SEQUENCE
: Mengambil elemen pertama dari urutan permutasi tak terbatas kami yang memenuhi tes "kekacauan".sumber
Brachylog ,
19181513 byteCobalah online!
Penjelasan
sumber
Perl 6 , 45 byte
Cobalah
Input adalah Array apa pun.
Diperluas:
sumber
MATL, 7 byte
Ini adalah terjemahan dari pos Oktaf saya (dan mirip dengan beberapa kiriman lainnya di sini). Saya memposting posting MATL pertama saya kemarin (CNR crack), jadi saya kira ini tidak optimal, tapi itu yang terbaik yang saya dapatkan sejauh ini.
Sejujurnya, saya tidak sepenuhnya yakin
t
diperlukan di sana, tapi itu satu-satunya cara saya bisa membuatnya bekerja. Ini digunakan sehingga saya bisa membandingkan input pengguna (diambil denganG
), dengan permutasi acak. Saya akan berpikir saya bisa membandingkan keduanya tanpa itu, tapi ...?Bagaimanapun, ini dia:
Cobalah online!
sumber
t
sana atau dapatkah saya menyingkirkannya? Sangat menyenangkan mencoba bermain golf di MATL ... :)t
(atau yang lainnya setaraG
) Anda harus meninggalkan sesuatu di tumpukan untuk iterasi berikutnya atau sebagai hasil akhirSebenarnya , 13 byte
Cobalah online!
Penjelasan:
sumber
Oktaf,
5655 byteKita harus menggunakan
input('')
karena ini bukan fungsi. Juga, karena saya dapat memilih untuk memiliki input sebagai string, kita dapat menggunakan trik itunnz(x)==numel(x)
.Penjelasan:
Terima kasih kepada Luis karena memperhatikan bahwa input dapat berupa string, jadi saya dapat menggunakan
nnz
alih-alihnumel
menghemat dua byte.sumber
MATL, 13 byte
Ini adalah upaya bersama dari @LuisMendo dan saya. Berbeda dengan banyak jawaban lain di sini, yang satu ini bersifat deterministik dalam arti bahwa ia tidak mengambil sampel permutasi acak sampai mendapat derangement, tetapi ia menghasilkan semua derangement dan memilih satu secara acak.
Cobalah secara Online!
Penjelasan
sumber
Pyth -
109 byteIni terus mengocok input sementara salah satu karakter sama dengan karakter pada indeks mereka di input.
Cobalah online di sini .
sumber
Mathematica, 57 byte
Fungsi yang tidak disebutkan namanya mengambil daftar whatevers sebagai input dan keluaran daftar. Setelah menghasilkan semua permutasi
#
inputx
, kami hanya menyimpan yang set#-x
elemen-perbedaan tidak mengandung a0
; lalu kita membuat pilihan acak (seragam) dari set itu.sumber
#/.x_:>NestWhile[RandomSample[#,Length@#]&,#,Not@FreeQ[#-x,0]&]&
jelas lebih cepat dalam praktik untuk string panjangPHP, 85 byte
Menyalin argumen string ke dua array, mengocok salah satunya hingga perbedaan di antara keduanya (juga membandingkan indeks elemen) sama dengan yang lainnya. Jalankan dengan
-r
.sumber
R, 59 byte
Membaca daftar elemen ke STDIN, mengambil panjang daftar dan mulai rentang pengambilan sampel dari 1 hingga panjang, hingga menemukan yang tidak berbagi tempat dengan daftar yang dipesan. Kemudian cetak daftar itu.
sumber
Bertanya-tanya , 32 byte
Pemakaian:
Penjelasan
Lebih mudah dibaca:
Fungsi rekursif
f
. Apakah perbandingan elemen antaraf
daftar input dan dan versi daftar input yang dikocok. Jika perbandingan menghasilkan nilai yang sama, makaf
disebut pada daftar shuffled. Jika tidak, kami cukup mengembalikan daftar yang dikocok.sumber
Ruby, 67 byte
sumber
Oktaf,
5453 byteHasilkan semua permutasi
a
dan pilih secara acak baris yang tidak memiliki elemen umuma
.Catatan: Secara tidak sengaja sama dengan @flawr MATL answer!
sumber
Clojure,
949079 byte-4 byte dengan mengubah kondisional di dalam reduksi menjadi
and
, dan inliningdone?
.-11 byte dengan mengonversi reduksi menjadi
some
.WOOT! Kalahkan PHP.
Metode brute-force. Mengacak daftar saat tidak valid. Ini selesai cepat bodoh mengingat ini adalah metode brute force yang tidak melakukan apa pun untuk mencegah duplikat mencoba. Itu menemukan 1000 dearangments dari daftar elemen 1000 dalam waktu kurang dari satu detik.
Tidak Disatukan:
sumber
Clojure, 56 byte
Perhatikan bahwa string tidak dapat dikocok, harus melewati
seq
atauvec
.Awalnya saya mencoba
#(first(remove(fn[s]((set(map = % s))true))(iterate shuffle %)))
tetapirecur
pendekatannya memang lebih pendek dariiterate
.Ajaibnya adalah
(set(map = % s))
mengembalikan seperangkat false, set true atau set true dan false. Ini dapat digunakan sebagai fungsi, jika mengandungtrue
maka jawabannya adalahtrue
, jika tidak palsunil
.=
dengan senang hati mengambil dua argumen input, tidak perlu membungkusnya dengan sesuatu.Mungkin ada cara yang lebih pendek untuk memeriksa apakah ada nilai yang benar?
sumber
APL, 11 byte.
Dengan string dalam argumen yang benar:
⍵[⍋(⍴⍵)?⍴⍵]
Penjelasan
ρ⍵
mendapatkan panjang (atau bentuk) dari argumen yang benar.?
mengembalikan array acak(⍴⍵)
dari angka-angka ini.⍋
mengembalikan urutan mereka untuk memastikan tidak ada duplikat.⍵[..]
mewakili bermacam-macam string secara acak menggunakan indeks ini.sumber
⍵
.