Pertanyaan ini berasal dari utas reddit ini oleh pengguna reddit taho_teg tetapi diperluas ke 'teka-teki' yang lebih umum.
Anda memiliki centrifuge dengan 24 lubang untuk vial yang terdistribusi secara seragam dalam lingkaran di sekitar poros tengah. Jika Anda sekarang memiliki sejumlah vial dan Anda ingin memulai centrifuge, Anda perlu memastikan bahwa mereka ditempatkan secara seimbang. Satu-satunya jumlah botol yang Anda tidak dapat menyeimbangkan adalah 1 dan 23. Misalnya Anda dapat menyeimbangkan 4, tetapi Anda juga dapat menyeimbangkan 5 dengan membuat 'segitiga' dengan 3 botol dan menempatkan dua lainnya di dua situs yang berlawanan.
Tujuan
Anda harus menulis sebuah program yang menerima jumlah lubang (yang terdistribusi secara merata dalam lingkaran di sekitar poros putar) centrifuge Anda sebagai input, dan yang menghasilkan daftar jumlah vial yang tidak dapat diseimbangkan dalam centrifuge.
Anda harus melakukan perhitungan dan tidak bisa hanya meng-hardcode solusi yang sudah dikomputasi.
Input dan output harus diimplementasikan sedemikian rupa sehingga kode program tidak harus diubah untuk memanggil program untuk input yang berbeda. Anda juga dapat menulis fungsi (atau konstruksi serupa dalam bahasa Anda) yang dapat dipanggil melalui konsol.
Perlu diketahui juga bahwa jika Anda memiliki 6 lubang di centrifuge Anda, Anda bisa centrifuge 2 dan 3 vial, tetapi Anda tidak dapat menyeimbangkan 5 karena 'segitiga' dan dua yang berlawanan akan tumpang tindih pada satu titik. Contoh lain adalah untuk n = 15 Anda tidak dapat menyeimbangkan 11 vial, Anda dapat menyeimbangkan 6 dan 5 vial, tetapi kombinasi dari solusi tersebut akan tumpang tindih (ini tentu saja belum kriteria bahwa tidak mungkin untuk melakukannya).
Memperbarui
Sepertinya beberapa orang tidak mengerti contoh yang diberikan, jadi saya membuat grafik di sini. TOLONG tulis deskripsi singkat tentang bagaimana algoritma Anda bekerja serta beberapa contoh keluaran untuk verifikasi. Harap sertakan contoh-contoh berikut:
n = 1, 6, 10, 24, 63, 100 = 10^2, 163 (prime), 40320 = 8!, 65536=2^2^2^2^2, 105953 (prime)
Perhatikan bahwa 40320 dan 65536 akan menghasilkan daftar besar, mungkin akan menjadi ide yang baik untuk hanya menunjukkan panjangnya daftar tersebut.
Jika Anda tahu beberapa angka menarik untuk ditambahkan ke daftar itu, beri tahu saya! Algoritma harus bekerja setidaknya hingga n = 1'000'000.
Output contoh:
Ini adalah beberapa contoh keluaran - tapi mungkin salah karena saya hanya menghitungnya secara manual.
1: 1
2: 1
3: 1,2
4: 1,3
5: 1,2,3,4
6: 1,5
7: 1,2,3,4,5,6
8: 1,3,5,7
9: 1,2,4,5,7,8
10:1,3,7,9
11:1,2,3,4,5,6,7,8,9,10
12:1,11
13:1,2,3,4,5,6,7,8,9,10,11,12
14:1,3,5,9,11,13
15:1,2,4,7,8,11,13,14
Petunjuk
Jika Anda memiliki centrifuge dengan n lubang, dan Anda tidak dapat menyeimbangkan misalnya 6 botol, Anda juga tidak akan dapat blance n-6 botol - pada dasarnya adalah tugas yang sama untuk keseimbangan m botol pada centrifuge kosong atau untuk menyeimbangkan centrifuge diisi dengan mengambil m botol. Jadi Anda jika Anda memiliki nomor m dalam daftar Anda, Anda juga harus memasukkan nm .
7 spoke wheel
dan melihat-lihat.Jawaban:
Sage -
102104/115Mengapa menggunakan teori bilangan, ketika ada kekuatan kasar?
Untuk sejumlah botol, diberikan semua cara untuk menempatkan botol dan menghitung pusat massanya dengan menggunakan aritmatika kompleks. Jika pusat massa adalah nol untuk semua cara ini, angkanya dikembalikan.
Sayangnya, ini tidak berfungsi dalam kasus-kasus tertentu (10,14), karena Sage gagal menyederhanakan beberapa ekspresi menjadi nol (yang mungkin terkait dengan bug ini ). Orang bisa menganggap ini sebagai cacat penerjemah dan bukan program dan masih mengatakan bahwa algoritma dan program itu baik-baik saja.
Alternatif 113 karakter berikut ini bergantung pada pelampung sebagai ganti simbol dan tidak mengalami masalah ini:
Hasil uji versi 113 karakter (
for n in range(14): print n,v(n)
):Saya tidak ingin menunggu runtime lebih tinggi
n
.Ini berasal dari solusi Python berikut. Aritmatika yang tepat dan tidak harus mengimpor beberapa modul adalah sesuatu yang cukup.
Python -
173 154156Uji keluaran varian ini (
for n in range(24): print n,v(n)
):Saya tidak ingin menunggu runtime lebih tinggi
n
.sumber
Lua - 197
Metode non brute force, ia membuat daftar faktor dan menyingkirkannya. Ini juga mengesampingkan angka yang bisa didapat dengan penambahan faktor-faktor tersebut selama faktor terbesar yang digunakan kurang dari jumlah lubang yang tidak terisi. Satu selalu dicetak dan tidak digunakan dalam algoritma.
Contoh output: (beberapa diletakkan sebagai rentang jadi saya tidak melebihi batas karakter)
sumber
Pyth -
3937 byteTerjemahan langsung dari jawaban python @ Wrzlprmft.
Penjelasan dan mungkin golf lebih lanjut segera hadir.
Cobalah online di sini .
sumber