Usaha menyeimbangkan
Sebuah gergaji (yang diduga berasal dari bahasa Prancis 'ci-ça', yang berarti 'ini-itu') membentuk sepertiga dari trinitas suci peralatan bermain, bersama dengan luncuran dan ayunan yang serupa di mana-mana. Melihat-lihat adalah dalam keseimbangan sempurna jika, dan hanya jika, jumlah momen di setiap sisi adalah setara. Karenanya, gergaji dapat diseimbangkan dengan menambahkan jumlah berat tertentu ke samping dengan jumlah momen yang lebih rendah; mencapai ini adalah tujuan Anda untuk tantangan ini.
Tantangan
Tantangan Anda adalah mengambil penggambaran gergaji sebagai input dan menghasilkannya lagi, dengan bobot ditambahkan ke salah satu ujung gergaji untuk menyeimbangkannya.
Memasukkan
Program Anda harus, dalam format apa pun yang masuk akal, melihat-lihat ASCII seperti berikut ini:
100 100
-------------------
^
Baris pertama berisi dua angka, masing-masing mewakili bobot pada gergaji. Persis satu bobot hadir di setiap sisi, masing-masing bekerja di ujung sisi papannya. Bobot dijamin bilangan bulat, dan selalu sejajar dengan ujung papan yang sesuai. Angka-angka ini tidak akan pernah tumpang tindih dengan titik tumpu ( ^
).
Baris kedua mewakili 'papan' dari tahta. Setiap tanda hubung ( -
) menunjukkan panjang yang sama dengan tanda hubung lainnya, dengan pengecualian tunggal tanda hubung langsung di atas titik tumpu ( ^
), yang tidak memiliki panjang.
Baris ketiga mewakili titik tumpu dari gergaji. Titik tumpu ini ditandai oleh satu-satunya karakter yang bukan spasi pada baris ini, sirkumfleks ('^'). Titik tumpu dapat diposisikan di mana saja di sepanjang papan dalam input yang valid selama masih ada ruang yang cukup sehingga angka yang mewakili bobot tidak tumpang tindih dengan titik tumpu baik dalam input maupun output.
Input dijamin memiliki tiga baris, dan tidak memiliki ruang putih sebelum atau setelah karakter yang membentuk gergaji (kecuali, tentu saja, baris ketiga, yang memerlukannya).
Keluaran
Untuk output, penggambaran gergaji yang sama harus dicetak ke stdout, tetapi dengan satu (dan hanya satu) dari bobot diganti dengan bobot yang lebih besar, sehingga dapat menyeimbangkan gergaji. Input dijamin memungkinkan ini menggunakan integer saja. Oleh karena itu, bobot harus ditunjukkan tanpa titik desimal atau notasi serupa lainnya. Jika bahasa Anda tidak menggunakan stdout, Anda harus menggunakan konsensus komunitas / meta tentang hasil. Mengejar baris baru baik-baik saja tetapi perubahan lain pada format penggambaran mungkin tidak OK.
Contoh
Input Tes dan Output yang Sesuai
Input 1
12 22
--------------------
^
Output 1
12 26
--------------------
^
Input 2
42 42
-----------
^
Keluaran 2
42 42
-----------
^
Input 3
3 16
----------------
^
Keluaran 3
14 16
----------------
^
Masukan 4
1 56
-------------------
^
Keluaran 4
196 56
-------------------
^
Implementasi Referensi - Python 3
# Takes a list of strings as input
def balance_seesaw(lines):
weights = [int(w.strip()) for w in lines[0].split()]
length = len(lines[1])
pivot = lines[2].find("^")
left_length = pivot
right_length = length - 1 - pivot
left_torque = weights[0] * left_length
right_torque = weights[1] * right_length
if left_torque > right_torque:
weights[1] = left_torque // right_length
elif right_torque > left_torque:
weights[0] = right_torque // left_length
weights = [str(w) for w in weights]
string_gap = " " * (length - sum(len(w) for w in weights))
lines[0] = weights[0] + string_gap + weights[1]
print("\n".join(lines))
balance_seesaw(["1 56",
"-------------------",
" ^ "])
Aturan
Ini adalah kode-golf , jadi kode terpendek yang menang dihitung dalam byte. Periksa meta jika menghitung byte canggung dalam bahasa Anda.
Aturan standar / celah berlaku.
Masukan harus diambil dalam format yang masuk akal. Daftar format yang sesuai tidak lengkap diberikan sebagai berikut:
- String tunggal dengan garis yang dipisahkan oleh karakter baris baru
- Daftar string, setiap string mewakili garis
- Array atau Matriks karakter 2D
Tantangan Terkait
- Saldo satu set bobot pada gergaji - Diusulkan Agustus 2015 oleh samgak
Jawaban:
05AB1E ,
605150494745 byteDisimpan 10 byte berkat Emigna dan 1 byte terima kasih kepada Adnan.
Semua jalur input harus memiliki jumlah karakter yang sama.
Cobalah online!
Seharusnya ada aturan praktis, seperti "jika kode 05AB1E Anda lebih panjang dari 40 byte, Anda mungkin salah melakukannya". Tampaknya begitu golf, ada ide yang menyambut!
sumber
¬s¤s\‚
bisaõK
.kD²g->(‚
bisa¡€g
jika Anda menambahkan spasi yang hilang di baris bawah test case31SÍ
dengan1®‚
:)/ ï
dengan÷
?JavaScript (ES6), 136
Mungkin tidak berfungsi di Chrome, karena menggunakan penugasan yang dirusak dan parameter default.Perhatikan bahwa metode output JS standar
alert
tidak cocok untuk tugas tersebut, karena font proporsional yang digunakan.Kurang golf
Uji
sumber
Perl, 149 + 2 = 151 karakter
Membutuhkan opsi baris perintah
-p0
(ini memberi saya penalti 2 byte di atas 149 byte dalam program itu sendiri).Penjelasan:
-p0
beralih membaca seluruh masukan hingga byte NUL pertama atau EOF. Masalah ini tidak memungkinkan NUL, jadi kami akan mendapatkan seluruh input dalam variabel$_
yang digunakan untuk regex, dll., Secara default..+?
), Tetapi saya tidak bisa mendapatkannya di bawah 3 karakter jadi saya mungkin juga menggunakan yang sudah jelas\d+
. Angka kedua adalah di akhir baris sehingga dapat diuraikan sebagai.+
(2 karakter). Garis tengah digunakan untuk menentukan seberapa lebar skala; itu diuraikan sebagai-+
(banyak representasi lain akan bekerja). Ruang sebelum tanda pada baris terakhir adalah+
. Setelah tanda sisipan (atau memang nonspace) muncul, kita mengabaikan sisa input.$1
,$2
,$3
,$4
. Memberikan regex sebagai argumen untukmap
tambahan menggunakan array dari kelompok-kelompok sebagai array untuk memetakan. Karena itu kami berusaha keras; ini adalah cara yang nyaman untuk menyimpan panjang$3
dan$4
tanpa harus menulislength
dua kali. Kami juga menimpa$_
dengan panjang$1
; kami tidak terlalu peduli dengan nilai ini (jumlah digit pada input kiri agak tidak berguna), tetapi kenyataan bahwa itu pendek ($_
panjangnya sekarang adalah jumlah digit dalam jumlah digit pada Berat pertama, yang tentu sangat kecil dibandingkan dengan lebar timbangan).$r
di mana skala dibagi.$1*$r>$2
memeriksa untuk melihat sisi mana yang lebih berat. Kami menyimpan bobot baru di$x
dan$y
; ini memiliki perhitungan yang sangat sederhana setelah rasio bobot diketahui.$x
,,$,
dan$y
menjadi$_
untuk menghasilkan baris atas, kemudian terus menambahkan spasi ($"
berisi ruang tunggal secara default, dan lebih pendek dari spasi literal' '
) ke$,
hingga panjangnya sama dengan baris tengah (yaitu memiliki panjang$c
). (Saya memilih variabel$,
karena merupakan variabel bawaan yang dapat diubah dengan aman dalam konteks ini dan mulai kosong secara default.) Saatlength
beroperasi$_
secara default, kita tidak perlu memberikan argumen secara eksplisit. Saya menggunakan kondisional Yoda karena membutuhkan sintaks yang tidak terlalu membingungkan untuk menguraikan dengan benar.$\
) untuk mengandung sisa set skala (yang sama seperti pada input, jadi saya cukup menggunakan$3
dan$4
langsung memproduksi sebagian besar dari Perl ). Perhatikan bahwa ini berarti tidak ada spasi spasi di baris ketiga; menambahkannya akan membuat program sedikit lebih lama dan sepertinya tidak melayani tujuan apa pun, jadi saya meninggalkannya.-p
saklar memicu lagi; kali ini, output$_
diikuti oleh "baris baru" ($\
). Karena saya mendefinisikan ulang baris baru keluaran, dua cetakan tersirat ini menghasilkan set skala baru di antara mereka (meskipun sebagai efek samping, tidak ada baris baru pada output).-p
beralih sekarang mencoba untuk membaca masukan lagi, tapi kita sudah menghirup seluruh file, sehingga berbunyi EOF dan berakhir program.sumber
PHP,
212209205 bytemungkin golf
Mengambil input dari argumen baris perintah; melarikan diri dari baris baru. Jalankan dengan
-r
.Mengganti dengan placeholder tidak berfungsi seperti yang diharapkan; jadi saya harus menambahkan lebih banyak parens ke regex pertama.
sumber
Befunge,
223217 byteCobalah online!
sumber
>
saya pikir hanya dibiarkan karena alasan estetika. Yang mengatakan, saya tampaknya memiliki solusi 215 byte dalam catatan saya, jadi mungkin saja (itu saya juga memiliki bug yang akan menjelaskan mengapa saya tidak pernah mengirimkannya - tidak punya waktu untuk mengujinya sekarang).Python 2,
184183 byteJelas golf
Cukup mudah. Ambil saja bobot yang disesuaikan untuk menyesuaikan kedua sisi, lihat mana yang lebih besar dari aslinya, dan ubah yang itu, dan hasilkan.
EDIT Beralih multiplikasi dan pembagian karena divisi integer adalah jahat (terima kasih kepada @JonathanAllan untuk memperhatikan ini)
EDIT -1 byte Diubah
i().index('^')
menjadii().find('^')
(terima kasih kepada @JonathanAllan [lagi!])sumber
a=[w[1]*R/I,w[0]*I/R]
(contoh sederhana yang tidak akan berhasil adalah a1
dan2
denganI
danR
keduanya3
). Saat ini 194 tidak 184 karena baris baru dihitung sebagai byte masing-masing, tetapij
dank
biaya lebih banyak byte daripada menghemat.I=i().find('^')
, dan bentuk pendek dari__repr__
, backticks untuk membuat baris terakhirprint`w[0]`+' '*(W-len(`w`)+4)+`w[1]`+'\n'+'-'*W+'\n'+' '*I+'^'
dan turun ke 182 - repl.it/EW8fC ++ 14, 482 byte
versi yang lebih mudah dibaca:
sumber
Python 3,
235230 byte (referensi diperkecil)Saya hanya meminimalkan referensi, karena saya sangat baru dalam bermain golf kode.
Anda menggunakannya persis sama dengan contoh, tetapi fungsinya
s
bukanbalance_seesaw
.sumber
w[o>p]=[o//k,p//t][o>p]
. Juga, sebagian besar garis dapat digabungkan untuk menghilangkan ruang kosong tambahan.