pengantar
Hujan akhirnya reda. Sebagian besar manusia tenggelam karena bug dalam kode @ user12345 . Korban tersebar di seluruh kepulauan di seluruh dunia. Komunikasi radio meningkat, dan umat manusia siap untuk berkembang sekali lagi. Tanpa alasan apa pun, bajak laut zombie telah berkumpul di Meridian Perdana, dan menyapu ke arah barat. Gerombolan itu melahap semua.
Masalah
Skenario kiamat kami dapat dijelaskan oleh 5 bilangan bulat pada satu garis yang mewakili sekumpulan komunitas pulau yang bekerja sama. Mereka dipesan dari barat (integer paling kiri) ke timur (integer paling kanan).
Dimulai dengan pulau paling jauh ke timur, penduduk pulau berpasangan dengan pulau terdekat berikutnya. Anehnya, untuk setiap pasangan yang memulai, hanya satu dari mereka yang pernah selamat dari perjalanan. Penduduk pulau hanya bepergian berpasangan. Populasi ganjil memilih satu-satunya penghuni untuk tetap tinggal dan memberikan pembaruan radio terbaru tentang kejenakaan gerombolan bajak laut zombie. Populasi menolak untuk melakukan perjalanan sampai semua pulau di sebelah timur mereka menyelesaikan migrasi mereka atau mati. Ketika populasi mencapai pulau terakhir, paling barat, perjalanan berhenti.
Manajer operasi di ujung dunia membutuhkan program yang dapat menampilkan jumlah populasi akhir dari setiap desa.
Contoh Input
3 8 6 0 2
Contoh Output
8 1 0 1 0
Asumsi
- Masukan dapat diberikan melalui stdin, membaca dari file yang dinamai secara sewenang-wenang, atau diterima sebagai argumen
- Untuk setiap pulau, 0 <= populasi <= 1024
- Populasi tidak pernah melewati satu pulau
Jawaban terpendek menang!
Jawaban:
APL, 16 karakter
Input diberikan sebagai string ke blok ini:
atau satu karakter lebih sedikit jika input diberikan sebagai argumen untuk blok ini:
Hal ini didasarkan pada gagasan Ilmari Karonen dalam komentar ini .
2⊥⍵
melakukan konversi basis 2 dari input.(1e9,4⍴2)⊤
dengan demikian mengkonversi angka ini kembali ke basis 2 (untuk empat digit terakhir) dan basis 1e9 untuk yang pertama, yang cukup untuk rentang input yang diberikan di atas. (1e9,4⍴2
membuat daftar1e9 2 2 2 2
.)Perhatikan bahwa barat yang melarikan diri dilakukan secara otomatis oleh konversi basis selama proses ini.
sumber
APL
harus ilegal ...GolfScript,
2322 karakterPendekatan berulang. Array diulang beberapa kali dan setiap kali sejumlah pasangan ditransfer dari kanan ke kiri. Coba contoh online .
Penjelasan singkat tentang kode:
sumber
~]{2base}2*' '*
akan melakukan trik ...GolfScript (25 karakter)
Demo online
Solusi yang sangat mudah: ada pendekatan yang lebih menarik yang mendefinisikan nilai output untuk masing-masing pulau sebagai fungsi dari nilai input, tetapi saya tidak berpikir itu bisa di-golf hampir sejauh mengikuti algoritma redistribusi yang dijelaskan dalam pertanyaan.
sumber
Javascript / ES6 (69)
Bermain dengan operator bitwise:
x&=1
menjaga bit terendah (1 jika ganjil, 0 jika genap)x>>1
adalah pembagian dengan 2 untuk bilangan bulatVersi tanpa ES6:
Contoh:
f("3 8 6 0 2")
mengembalikan[8, 1, 0, 1, 0]
f("0 997 998 999 1000")
pengembalian[935, 0, 1, 1, 0]
sumber
f=a=>{a=a.split(' ');for(x=5;--x;a[x]&=1)a[x-1]-=-a[x]/2|0;return a}
yaitu 68 karakter.Python - 96 Karakter
Pertama kali bermain golf! Masukan dari stdin.
sumber
' '
dari split, membawanya ke 96 dan mengalahkan solusi python2 lainnya.J (26 karakter)
Ini solusi saya di J:
((<.@-:@}.,0:)+{.,2|}.)^:_
Solusi umum ini harus bekerja dengan sejumlah pulau.
sumber
Rubi,
97907472Versi online
Golf sedikit lebih jauh, tidak membalikkan array lagi ...
sumber
C - 121 karakter
Input diambil dari stdin.
sumber
Python2 - 98 karakter
Masukan dari stdin.
Python3 - 79 karakter
Masukan dari stdin.
sumber
Python 2,
8580 byteX orang yang memulai di pulau mana pun setara dengan X * 2 orang yang memulai satu pulau di sebelah kanan. Kode ini mengonversi setiap orang dalam konfigurasi awal ke yang setara di pulau kanan-jauh, kemudian menggunakan representasi biner dari hasilnya untuk menentukan berapa banyak orang yang berakhir di setiap pulau.
EDIT: Mempersingkat kode dengan menginisialisasi
b
ke 1 bukannya 0, memungkinkan penggunaanbin
alih-alih string format.sumber
Python (101)
Kami mengulang daftar dari belakang ke depan dan memindahkan populasi di sekitar sesuai dengan spesifikasi, kemudian mencetak daftar. Inilah tes cepat:
sumber
Mathematica 105
Ini harus bekerja dengan sejumlah pulau.
Contohnya
5 pulau
25 pulau
sumber
270, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0
data uji panjang Anda. Saya pikir saya sudah mengkonfirmasi bahwa saya benar.Jawa -
647533 tetapi berharap untuk beberapa poin brownies untuk Java 8 Streaming.Bentuk terkompresi:
Dengan bantuan:
Sedikit khawatir bahwa uji @ DavidCarraher:
menghasilkan
sumber
Jawa -
196195Saya berkata pada diri sendiri bahwa saya tidak akan mempostingnya jika saya tidak bisa mendapatkannya di bawah 200 ... Jujur saya tidak berpikir saya bisa menyingkirkan hal lain, itu cukup tipis untuk Jawa.
Jeda baris:
Output input sampel:
sumber
Java - 179 karakter
Terkompresi:
Normal:
Output sampel:
sumber
Emacs Lisp 144 karakter
Tidak mungil, tetapi berhasil
sumber
awk - 44 Karakter
sumber
Java - 116 Karakter
Sebagai contoh
int[] i = {2, 33, 16, 5};
(saya kira itu tidak menambah hitungan, karena setiap angka dapat bervariasi) akan menghasilkan23 0 0 1
sumber