Apakah memecahkan Sudoku terlalu sulit? Bahkan versi brute force ? Inilah latihan coding yang sedikit lebih mudah. Saya harap. :-P
Tulis fungsi terpendek untuk mengimplementasikan bogosort. Secara khusus, fungsi Anda harus:
- Ambil sebuah array (atau bahasa Anda yang setara) sebagai input
- Periksa apakah elemen-elemennya dalam urutan diurutkan; jika demikian, kembalikan array
- Jika tidak, kocok elemen, dan mulai lagi
Entri terpendek menang. Dalam kasus seri, fungsi yang mendukung komparator khusus (dan / atau generator nomor pseudorandom) disukai. Ikatan yang tersisa diselesaikan dengan mendukung pengajuan sebelumnya.
Klarifikasi: Anda dapat menggunakan jenis elemen apa pun yang Anda inginkan, asalkan ada beberapa cara untuk memesannya, tentu saja. Juga, pengocokan harus seragam; tak satu pun dari ini "Aku hanya akan cepat-cepat dan menyebutnya terseret" bisnis. :-)
Jawaban:
APL (Dyalog), 20
Penjelasan
⍵
adalah argumen (kanan)⍵≡⍵[⍋⍵]
: Memeriksa apakah⍵
diurutkan sama dengan⍵
dirinya sendiri:⍵
: Jika ya, lalu kembali⍵
∇⍵[?⍨⍴⍵]
: Lain, buat array 1 hingga⍴⍵
(panjang⍵
) secara acak, susun ulang⍵
sesuai dengan itu (⍵[...]
), dan terapkan fungsi itu (∇
)Tiba-tiba meninjau kembali masalah ini dan ...
APL (Dyalog), 19
Hanya berpikir tentang mengurutkan array di cek membuatnya menjadi tidak berguna (tidak mengatakan bahwa Bogosort bermakna), implementasi yang lebih akurat akan terjadi
∧/2≤/⍵
, dan itu terjadi untuk menurunkan jumlah char.sumber
Perl 6: 23 karakter
sumber
[<=]
periksa apakah daftar diurutkan :,[<=] (1, 2, 3,) == (1 <= 2 <= 3) == (1 <= 2) and (2 <= 3)
dan.pick(n)
pilih n elemen acak dari daftar, dan.pick(*)
biarkan Perl memilih semua elemen. use.perl.org/~masak/journal/40459pick
digunakan sebelumnya, apalagi[<=]
. Di mana dalam dokumentasi itu?[]
adalah mengurangi operator yang mengambil operator antara tanda kurung. Misalnya,[<=] 1, 2, 3
adalah1 <= 2 <= 3
(dan ya, Anda melakukan rentang seperti ini di Perl 6). Dalam hal ini, ini digunakan untuk menentukan apakah elemen sesuai..pick(*)
Metode mengocok daftar (pick(N)
mengambilN
elemen dari daftar)..=
memanggil metode, dan menetapkan hasilnya ke variabel. Adapun dokumentasi - well, untuk saat ini hanya spesifikasi Perl 6 yang ada - feather.perl6.nl/syn , tetapi itu ada.APL (22)
Pemakaian:
Penjelasan:
⍋⍵
: mengembalikan indeks item dalam urutan, jadi⍋30 10 20
beri2 1 3
(⍳X←⍴⍵)≡⍋⍵:⍵
Menyimpan panjang daftar input dalam X. Jika rentang[1..X]
sama dengan urutan indeks yang diurutkan, daftar diurutkan, jadi kembalikan.⋄∇⍵[X?X]
: jika ini tidak terjadi, kambuh dengan array yang dikocok.sumber
Ruby - 33 karakter
sumber
g=proc{|l|0until l.sort==l.shuffle!}
f=->l{l.sort!=l.shuffle!?redo:l}
(Ruby 1.9)redo
bekerja denganproc
tetapi tidak dalam metode klasik dengandef...end
? Saya pikirredo
hanya bekerja dengan loop?redo
[...] mentransfer kontrol kembali ke awal proc atau lambda". Sederhananya seperti itu.Mathematica ,
4037Dengan spasi putih:
sumber
#//.l_/;Sort@l!=l:>RandomSample@l&
J -
3427misalnya:
Bagian {~? ~ @ # Mengocok input:
sumber
Python 61
Urutkan di tempat.
sumber
from random import*
bisa menghemat char.Python 94
Jawaban python lainnya menggunakan random.shuffle (). Dokumentasi modul python random menyatakan:
sumber
return[x...
sebaliknyareturn [x...
. Sama denganpermutations(a) if
- bisa jadipermutations(a)if
.lambda a: [x for x in __import__("itertools").permutations(a) if x==tuple(sorted(a))][0]
adalah 88 byteK,
3125{while[~x~x@<x;x:x@(-#x)?#x];x}
.
.
sumber
Python (69 karakter)
Mengurutkan bilangan bulat dalam meningkatkan urutan numerik. Perhatikan bahwa solusi rekursif, seperti
from random import*;f=lambda a:a>sorted(a)and(shuffle(a)or f(a))or a
akan gagal karena stack overflow bahkan untuk input kecil (katakanlah N> 5), karena Python tidak melakukan optimasi panggilan-ekor.
sumber
D tanpa pembanding khusus: 59 Karakter
Lebih Jelas:
D dengan pembanding khusus: 69 Karakter
Lebih Jelas:
sumber
Scala 73:
Di Scala, kita dapat memeriksa apakah kompiler melakukan optimasi panggilan-ekor:
dan ya, benar. Namun, untuk Daftar singkat 100 nilai:
butuh hampir 4 bulan untuk menyelesaikannya. ;)
sumber
C # (184 karakter)
Ini tidak benar-benar baik untuk melakukan ini dalam C #. Anda harus mendukung obat generik untuk mendukung tipe nilai dan referensi. Tidak ada fungsi atau fungsi array shuffle untuk memeriksa apakah ada sesuatu yang diurutkan.
Adakah yang punya tips untuk membuat ini lebih baik?
Edit Versi yang hanya memilah int (134 karakter):
sumber
GNU / BASH 65
sumber
C ++ 11, 150 karakter
Hanya .. dibuat untuk bersenang-senang.
sumber
Python - 61 karakter
Rekursif
sumber
from random import*
mungkin lebih pendek.PowerShell ,
8582565552 byte-26 byte berkat saran mazzy
-1 byte terima kasih kepada AdmBorkBork
-3 byte berkat mazzy
Cobalah online!
PowerShell memang memiliki perbandingan array yang relatif murah dengan melemparkannya ke string dan membandingkannya.
sumber
param
inisialisasi Anda ke inisialisasi Andafor
untuk menyimpan byte -for($l=$args;
-ne
melemparkan operator kanan ke jenis skalar dari operator kiri. jadi, Anda dapat menyimpan beberapa byte: Cobalah secara online!Javascript 291 karakter
min
batalkan
sumber
var
itu. Jadikan semuanya global tersirat, ini hanya tentang membuat kode sesingkat mungkin.Matlab, 59 byte
Pendekatan yang relatif lurus ke depan:
sumber
J, 22 byte
Ini adalah monad rekursif, diam-diam menggunakan agenda. Begini cara kerjanya:
Biarkan
y
menjadi daftar kami. Pertama, kata kerja di sebelah kanan agenda adalah-:/:~
. Kata kerja ini dengan anggun disediakan oleh Leaky Nun . Cocok dengan (-:
) terlepas dari apakah input diurutkan (/:~
) menggunakan hook monadic atau tidak . ((f g) y = y f (g y)
) Ini mengembalikan satu atau nol sesuai. Sisi kiri agenda adalah gerund dari dua kata kerja: di sebelah kanan adalah kata kerja identitas]
, dan di sebelah kiri adalah tempat terjadinya rekursi. Yang ditunjuk oleh agenda baik identitas kata kerja pada posisi1
jika daftar yang diurutkan, dan semakin lama kerja di posisi0
jika daftar tidak diurutkan.$:@({~?~@#)
panggilan$:
(kata kerja terpanjang yang ada di dalamnya) di atas hasil{~?~@#
ony
. Ini mengocok daftar, seperti yang?~@#
mengambil permutasi dari panjangy
, menjadi indeks diurutkan secara acaky
.{~
, dalam hook monadik, mengembalikan daftar dariy
indeks mana yang merupakan arg yang tepat. Daftar acak ini kemudian dipanggil kembali dengan agenda, dan diulang sampai diurutkan.sumber
C ++ 14, 158 byte
sumber
Jelly , 6 byte, tantangan tanggal kiriman bahasa
Cobalah online!
Penjelasan
Œ¿
memberikan nomor untuk setiap permutasi daftar; 1 diurutkan, 2 memiliki dua elemen terakhir yang dipertukarkan, dll., Hingga faktorial panjang daftar (yang merupakan daftar dalam urutan terbalik). Jadi untuk daftar yang diurutkan, ini memiliki nilai 1, dan kita dapat mengurangi menggunakan’
untuk menghasilkan tes "tidak diurutkan" yang dapat digunakan sebagai Boolean dalam kondisi loop sementara. Ini$
menyebabkan kondisi tersebut diurai sebagai sebuah grup.sumber
C ++, 166 byte
Ah.
Ini harus bekerja pada semua wadah STL yang memiliki
begin()
danend()
.Tidak Terkumpul:
sumber
APL (Dyalog Extended) , 15 byte
Cobalah online!
sumber
?⍨∘≢⍛⊇⍨⍣{⍺≡∧⍺}
Brachylog , 5 byte
Cobalah online!
Ketika saya pertama kali melihat jawaban Brachylog ais523 (yang bertentangan dengan jawaban Jelly-nya, karena jika saya tidak salah, user62131 juga adalah dia), saya bertanya-tanya, bagaimana jika itu digunakan untuk melacak mundur alih-alih rekursi? Jadi pada awalnya, saya mencoba
ṣ≤₁
. Ternyata, karena memilih sesuatu secara acak tidak menghasilkan banyak output sebanyak itu hanya menghasilkan satu output secara tidak pasti, predikat shuffleṣ
tidak dapat dilacak ke belakang, jadi menjalankan itu hanya akan gagal kecuali Anda cukup beruntung untuk mengocoknya dengan benar pada percobaan pertama. Setelah itu, saya mencobapṣ≤₁
, yang bekerja sebagian besar waktu, tetapi karena daftar yang panjang memiliki banyak permutasi, itu kadang-kadang masih gagal secara acak. Setelah mengabaikan tujuan mencapai pengurangan panjang, saya akhirnya menemukan ini:(Demonstrasi keacakan)
Meskipun sebenarnya bisa sedikit lebih pendek jika kita mengambil beberapa kebebasan dengan I / O ...
Brachylog , 4 byte
Cobalah online!
Agar output berguna, input tidak boleh mengandung elemen duplikat, karena selain mengurutkan input, predikat bogosort ini menambahkan sejumlah acak elemen duplikat dan nol. (Secara hipotetis, itu bisa menambah apa saja, tapi sepertinya tidak.) Biasanya saya tidak akan repot-repot menyebutkan sesuatu yang jauh dari berfungsi dengan benar, tetapi saya merasa itu adalah semangat tantangan.
sumber
Perl 6 , 28 byte
Cobalah online!
Blok kode anonim yang mengacak daftar sampai diurutkan. Perhatikan bahwa ia mengurutkan daftar setidaknya sekali, yang diizinkan. Dan tidak, itu
{.pick(*)}
tidak bisa diganti*.pick(*)
sumber
Pyth , 11 byte
Cukup senang dengan ini, mungkin bisa bermain golf sedikit lebih
Penjelasan
Cobalah online!
sumber
=Q.SQ
menjadi=.SQ
-1 byte (bekerja dengan operator lain juga, seperti=QhQ
->=hQ
)Japt ,
119 byteCobalah
sumber
Brachylog (v2), 5 byte
Cobalah online!
Pengiriman fungsi. (TIO link menggunakan argumen baris perintah yang secara otomatis membungkus fungsi menjadi program lengkap.)
Penjelasan
Prolog (bahasa yang dikompilasi oleh Brachylog) adalah ekor-rekursif, sehingga fungsi ini akhirnya dikompilasi menjadi loop ketat.
sumber
C (203 karakter, tanpa loop input: hanya fungsi)
Ini sama dengan yang berikut, di mana kita juga membaca array dari stdin dan menulis array yang diurutkan. Karena Q meminta fungsi dan bukan keseluruhan program ...
C (296 karakter)
Kompilasi dapat memberikan peringatan (deklarasi implisit). Batas ukuran array hardencoded dari 999 elemen. Rapuh.
jika tidak perlu pra-periksa apakah array diurutkan, itu bisa dilakukan pada 284.
C (251 karakter, dulu 284)
(menggunakan global bukan fungsi args).
sumber