Tugas
Anda akan diberi bilangan bulat positif dan Anda harus menampilkan " grafik pelengkap diri " dengan banyak node. Jika Anda tidak tahu apa itu grafik pelengkap diri adalah artikel wikipedia tidak akan banyak membantu Anda jadi di bawah ini adalah dua penjelasan, satu teknis dan non-teknis.
Non-Teknis
Grafik adalah sekumpulan node yang dihubungkan oleh garis. Setiap pasangan poin dapat dihubungkan oleh satu garis atau tidak sama sekali. "Komplemen" dari grafik adalah hasil dari mengambil grafik dan menghubungkan semua node yang tidak terhubung dan memutuskan semua node yang ada.
Grafik pelengkap diri adalah grafik yang komplemennya dapat disusun ulang menjadi bentuk aslinya. Di bawah ini adalah contoh dari grafik pelengkap diri dan demonstrasi bagaimana.
Berikut ini adalah grafik dengan 5 node:
Kami akan menyoroti semua tempat koneksi dapat dilakukan dengan garis putus-putus merah:
Sekarang kita akan menemukan komplemen grafik dengan menukar tepi merah dan hitam:
Ini tidak terlihat seperti grafik asli tetapi jika kita memindahkan node seperti itu (setiap langkah menukar dua node):
Kami mendapatkan grafik asli! Grafik dan komplemennya adalah grafik yang sama
Teknis
Grafik pelengkap diri adalah grafik yang isomorfis untuk pelengkapnya.
Spesifikasi
Anda akan menerima bilangan bulat positif melalui metode apa pun yang paling sesuai untuk Anda. Dan Anda akan menampilkan grafik dalam metode apa pun yang Anda anggap tepat, ini termasuk tetapi tidak terbatas pada kedekatan Matrix Form , kedekatan Daftar Form , dan tentu saja gambar! Grafik yang dihasilkan haruslah komplemennya sendiri dan memiliki simpul sebanyak input integer. Jika tidak ada grafik seperti itu, Anda harus menampilkan nilai falsy.
Ini adalah kode-golf dan Anda harus berusaha meminimalkan jumlah byte Anda.
Uji Kasus
Di bawah ini adalah gambar-gambar dari kemungkinan keluaran untuk beberapa n
4
5
9
sumber
GraphData@{"SelfComplementary",{#,1}}&
, saya percaya bahwa hanya memuat beberapa contoh untuk rendahn
dari database Wolfram, jadi ini tidak akan bekerja untuk input besar yang sewenang-wenang.Jawaban:
Haskell , 77 byte
Cobalah online!
Ini menggunakan kriteria eksplisit yang mudah dihitung untuk memutuskan apakah suatu edge
(a,b)
termasuk dalam grafik. Instantiates algoritma ini , dengan permutasi siklus antara nilai-nilai modulo 4Kami menyertakan tepi yang dua simpul titik akhirnya menambah 0 atau 1 modulo 4. Perhatikan bahwa simpul bersepeda sesuai permutasi ini menambahkan 2 modulo 4 ke jumlah simpul pada masing-masing, dan juga menukar tepi dan non-tepi. Ini memberikan permutasi simpul yang melengkapi tepi.
Jika grafik memiliki simpul tambahan di luar kelipatan 4, grafik itu diletakkan dalam satu siklus saja. Kami menyertakan tepi dengan itu ketika kemudian titik lainnya genap. Mengganti simpul membalik paritas, dan grafik tetap saling melengkapi.
Jika jumlah simpul bukan 0 atau 1 modulo 4, tidak mungkin ada grafik pelengkap diri karena ada jumlah tepi yang ganjil dalam grafik lengkap
Secara keseluruhan, berikut ini kondisinya:
(a,b)
dengana<b
dana+b
sama dengan 0 atau 1 modulo 4.(a,n)
ketika a adalah genap.Kode menggabungkan kasus kedua dan ketiga dengan mengganti kondisi
mod(a+b)4<2
denganmod(a+a)4<2
saat keduanyaodd n
danb==n
.sumber
Brachylog 2 , 24 byte
Cobalah online!
Ini adalah fungsi yang mengembalikan pasangan yang terdiri dari dua daftar adjacency: satu untuk grafik, satu untuk grafik komplemen. (Dalam penerjemah Brachylog pada TIO, Anda dapat memintanya untuk mengevaluasi suatu fungsi, bukan program lengkap, melalui pemberian
Z
sebagai argumen baris perintah.) Misalnya, output untuk input5
adalah:Inilah yang terlihat seperti gambar (menampilkan dua grafik):
Seperti biasa dalam bahasa berbasis Prolog, fungsi ini mendukung lebih dari satu pola panggilan. Khususnya, jika Anda mencoba menggunakannya sebagai generator, itu akan menampilkan semua kemungkinan grafik pelengkap diri dengan jumlah simpul yang diberikan (meskipun saya tidak melakukan upaya apa pun untuk membuat case ini dapat digunakan, dan terutama itu akan menampilkan masing-masing masing-masing grafik berkali-kali).
Penjelasan
Ini pada dasarnya hanya deskripsi masalah, meninggalkan implementasi Prolog untuk menemukan metode terbaik untuk menyelesaikannya. (Namun, saya ragu itu akan menggunakan algoritma yang lebih baik daripada brute force dalam kasus khusus ini, jadi sepertinya cukup tidak efisien, dan pengujian tampaknya mengkonfirmasi hal ini, menunjukkan kinerja yang semakin buruk semakin besar grafiknya.)
Kebetulan, saya akhirnya harus menghabiskan seluruh 6 byte (¼ dari program, karakter
(∨?<2)
) berurusan dengan kasus-kasus khusus 0 dan 1. Frustasi, tetapi itulah sifat kasus khusus.The
\\ᵐcdl?
Bagian agak sulit untuk memahami, jadi di sini adalah contoh dikerjakan. Tujuannya adalah untuk memeriksa apakah sesuatu adalah grafik dan komplemennya, dengan tepi yang sesuai dalam grafik dan komplemen berada dalam urutan yang sama dalam daftar. Pasangan grafik / pelengkap menjadi hasil akhir dari program. Berikut ini contoh kasusnya:Transposing ini memberi kita daftar pasangan tepi yang sesuai antara grafik dan komplemen:
Selanjutnya, kita transpos di dalam elemen daftar dan ratakan satu tingkat; yang memberi kita daftar pasangan elemen yang sesuai antara grafik dan komplemen:
Jelas, apa yang kita inginkan di sini adalah agar tidak ada lebih dari 1 pasangan yang dimulai dari setiap elemen (dengan demikian membuktikan bahwa elemen-elemen dari grafik dan komplemen ada dalam korespondensi 1-ke-1). Kita hampir dapat memverifikasi bahwa hanya dengan menyatakan bahwa daftar memiliki
?
elemen yang persis berbeda (yaitu sejumlah elemen berbeda sama dengan jumlah simpul). Dalam hal ini, tes berhasil; elemen yang berbeda adalah:Namun, ini menyisakan ruang untuk masalah potensial; jika sebuah simpul sepenuhnya terputus dalam grafik asli, korespondensinya tidak akan disebutkan, menyisakan ruang untuk korespondensi duplikat dari beberapa simpul lainnya. Jika hal ini terjadi, grafik pelengkap harus memiliki keunggulan antara titik yang (tanpa kehilangan umum, katakanlah itu
1
), dan setiap vertex lainnya, sehingga daftar korespondensi akan berisi[1,2]
,[1,3]
, ...,[1, ?]
. Ketika?
besar, ini akan menyebabkan total korespondensi lebih dari yang kita miliki, jadi tidak ada masalah. Satu-satunya masalah terjadi ketika?
3 atau lebih rendah, dalam hal ini kami hanya menambahkan satu korespondensi tambahan (sambil menghapus satu dari1
tidak muncul di input); Namun, ini bukan masalah dalam praktiknya, karena ada 3 kemungkinan tepi pada grafik 3-elemen, yang merupakan angka ganjil (demikian juga, 1 tepi yang mungkin pada grafik 2-elemen juga merupakan angka ganjil), dan dengan demikian tes akan gagal pada\
langkah (Anda tidak dapat mengubah daftar yang kasar, yaitu orang-orang yang elemen-elemennya memiliki panjang yang berbeda).sumber
z
dan\
adalahz
zip siklik, artinya[[1,2,3],["a"]]
akan berakhir[[1,"a"],[2,"a"],[3,"a"]]
bersamaz
, sedangkan akan gagal\
.\
saat ini hanya bekerja pada matriks persegi; implementasi di masa depan akan membuatnya bekerja sepertiz
, kecuali tidak secara siklis.BBC BASIC, 161 byte
File Tokenised berukuran 140 byte
Unduh juru bahasa di http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Kode tidak dikunci
Penjelasan
Ini menggunakan algoritma yang sama dengan Xnor, tetapi menghasilkan output diagram.
Di mana
n
bentuk4x+2
atau4x+3
tidak ada solusi karena jumlah tepi aneh.Di mana
n
dari bentuk 4x kami mengatur semua simpul dalam lingkaran dan menggambar ujung-ujungnya di mana(a+b) mod 4
2 atau 3 (bukan 0 atau 1 seperti dalam kasus Xnor, karena alasan bermain golf. Oleh karena itu, ini adalah pelengkap dari solusi yang diberikan oleh Xnor.)Untuk melihatnya dalam pengertian yang lebih piktural, kami mengambil setiap titik kedua dan menarik ujung-ujungnya ke titik 1 dan 2 ke arah yang berlawanan arah jarum jam. Ini mendefinisikan
n
arah paralel, setengah dari total. Kemudian kami menambahkan semua tepi lainnya sejajar dengan ini.Komplemen dapat ditemukan dengan menambahkan 1 ke a dan b di setiap spesifikasi tepi, atau secara gambar dengan memutar diagram dengan
1/n
belokan.Di mana
n
dari bentuk 4x + 1 kita menambahkan simpul lain, yang terhubung ke setiap simpul kedua dari grafik 4x. Jika ditempatkan di tengah, simetri diagram akan dipertahankan, tetapi saya memilih untuk meletakkannya di luar lingkaran utama poin untuk kejelasan.Keluaran
Berikut ini adalah beberapa kasus pertama untuk 4x + 1. kasing 4x dapat dilihat dengan menghapus titik di kanan bawah dan tepi yang terkait.
sumber
JavaScript (ES6), 191 byte
Fungsi ini mengembalikan daftar adjacency. Ini menggunakan dua algoritma, dan membedakan antara grafik komplementer kosong dan non-output dengan mengembalikan
0
bukan[]
ketika tidak ada. Algoritme pertama didasarkan pada Grafik Rado yang dibangun menggunakan predikat BIT , dan menciptakan grafik komplementer yang sesuai dengan urutan 0, 1-, 4-, dan 5. Algoritme lain, yang ditemukan oleh teman-teman kami di matematika , membuat grafik pelengkap verteks V + 4 yang valid dengan menerapkan penambahan 4 jalur ke grafik pelengkap vertex V yang valid.Itu dimulai dengan memvalidasi input untuk mengonfirmasi keberadaan grafik komplementer yang valid (menggunakan
n*~-n/4%1
), dan jika itu gagal, kembali0
. Kemudian memeriksa apakahn>5
dan berulang ken-4
kasus untuk membangun solusi urutan rendah yang valid, kemudian menerapkan 4-penambahan ke daftar adjacency kembali dalam perjalanan kembali rantai rekursi. Terakhir, jikan>5
tidak benar, ia beralih dari0
ken-1
untukx
dany
, dan memeriksa apakah(y>>x)&1
itu benar. Jika demikian, maka simpul-simpul tersebut dipasangkan.Berikut ini adalah format fungsi yang lebih mudah dibaca, dengan operator ternary diperluas ke if-else statement dan
eval()
s inlined:Demo
sumber