Kredit
Terima kasih saya untuk pertanyaan berbasis surat Rand Al'Thor untuk inspirasi untuk tantangan golf kode ini.
Latar Belakang
Sifat tantangan ini didasarkan pada algoritma yang disebutkan oleh Rand dalam bukunya "A Triangle Formed of Three Letters":
- Mulailah dengan urutan 10 huruf yang masing-masing X, Y, atau Z.
- Di bawah setiap baris, buat baris berikutnya sebagai berikut. Jika dua huruf yang berdekatan adalah sama, tulis huruf yang sama di bawahnya; jika berbeda, tulis huruf ketiga di bawahnya.
Anda kemudian akan mengulangi langkah sebelumnya sampai Anda memiliki satu huruf di baris kesepuluh Anda.
Tantangan
Kita akan meletakkan putaran matematika pada algoritma di atas:
- Mari kita mulai dengan urutan 10 digit, masing-masing dipisahkan oleh spasi, dan masing-masing adalah 1, 2 atau 3.
- Di bawah setiap baris, buat baris berikutnya sebagai berikut. Jika dua digit yang berdekatan adalah sama, tulis angka yang sama di bawahnya; jika mereka berbeda, tulis angka ketiga di bawahnya.
- Ulangi langkah sebelumnya hingga Anda memiliki satu angka terakhir.
Jadi, mengikuti algoritma ini, jika dimulai dengan baris 1 2 3 3 1 3 1 3 1 2
, misalnya, segitiga berikut dihasilkan:
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1 2 3 3 1 3 1 3 1 2
3 1 3 2 2 2 2 2 3
2 2 1 2 2 2 2 1
2 3 3 2 2 2 3
1 3 1 2 2 1
2 2 3 2 3
2 1 1 1
3 1 1
2 1
3
Saya juga ingin tahu mengetahui jumlah semua digit dalam segitiga angka, jadi tambahkan semua digit ini, dan letakkan total ini dalam baris kesebelas, dibenarkan dengan benar ke digit terakhir di baris pertama. Jadi, segitiga angka kita akan terlihat seperti berikut ini (spasi dalam contoh saya diwakili di bawah ini oleh .
karakter untuk menampilkan pemformatan.)
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109
Tantangan Anda adalah menulis kode yang dapat dimulai dengan string / array / yang diinput. sepuluh digit, sesuai contoh saya, dan kemudian menerapkan algoritma untuk menghasilkan sepuluh baris yang akan membuat segitiga angka, diikuti oleh baris ke-11 yang akan menampilkan total semua digit dengan justifikasi-kanan.
Pengujian
Pengujian string ini dapat dilakukan dengan string sepuluh digit yang Anda pilih secara acak, atau yang dihasilkan dari snipet di bawah ...
c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");
$("#btn").click(function(){
$("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.
Aturan
- Aturan kode-golf berlaku, sehingga jumlah byte terendah memenangkan tantangan. Jika ada dua entri dengan skor rendah yang sama, pemenang akan diberikan berdasarkan jumlah suara terbanyak.
- Pada dasarnya yang kita kejar adalah 11 baris, panjang 19 karakter ... Bagaimana Anda membuat output akhir sepenuhnya terserah Anda: array, konsol, output file, STDOUT, dll., Jadi silakan gunakan metode output apa pun yang Anda suka yang akan bekerja untuk keuntungan Anda. Satu-satunya aturan dalam output adalah bahwa kita memiliki 11 baris dengan 19 karakter di setiap baris dalam format yang mirip dengan di atas ...
- Jika ini membantu kode Anda, gunakan pemisah apa pun untuk digit ... Ingatlah bahwa keterbacaan dapat menjadi faktor penyumbang.
- Tidak ada celah konyol .
- Pengkodean input tidak dibolehkan. Tujuan dari kode ini adalah sedemikian rupa sehingga dapat digunakan untuk menghasilkan hasil yang berbeda setiap kali dengan input yang bervariasi. Hard-coding
1 1 1 1 1 1 1 1 1 1
misalnya, sepenuhnya meniadakan seluruh titik algoritma.
Nantikan melihat apa yang Anda semua dapat lakukan!
Jawaban:
05AB1E ,
3226 bytePenjelasan
Cobalah online!
sumber
Mathematica,
104979094 bytePenjelasan
Mempartisi input menjadi panjang 2, mengimbangi 1 partisi.
Mengambil setiap partisi, dan menghitung output yang sesuai.
Trik yang terlibat di sini. Saya menambahkan dua angka, mengambil mod 3, dan mengurangi hasil itu dari 3. Itu memberikan angka yang diinginkan. (mis. 3 - ((2 + 1) mod 3) = 3)
Mengulangi proses di atas sembilan kali, memberikan semua iterasi sebagai output.
Format setiap iterasi menjadi baris, dan letakkan semuanya dalam satu kolom (rata tengah), buat segitiga.
Ambil total semua angka.
Gabungkan segitiga dan total, dan luruskan ke kanan seluruh benda (segitiga sudah sejajar, sehingga perataannya tidak terpengaruh).
sumber
JavaScript (ES6),
143142 byteDisimpan 1 byte berkat @Neil
Saya mencoba menggabungkan berbagai bagian, tetapi berakhir 5 byte lebih lama:
sumber
3-((x+y)%3)
membantu mengurangi kode ini?p^c||p
sudah agak lebih pendek :-)i?p^(p=c)||p:c
dapat Anda gunakani&&p^(p=c)||c
?Ruby,
134101 byteMenggunakan trik modulo JHM.
Lihat di eval.in: https://eval.in/649993
sumber
CJam ,
4440 byteCobalah online!
Penjelasan
sumber
Python 2, 164 byte
Solusi iteratif yang relatif sederhana.
Cobalah online
sumber
PHP, 143 Bytes
sumber
JavaScript (ES6),
11210096 byteMengambil array sebagai input dan secara rekursif membangun segitiga yang dipisahkan koma.
sumber