Ikhtisar
Diberikan string 3 baris, cari tahu apakah struktur jatuh ke kiri, keseimbangan, atau jatuh ke kanan.
Struktur input
Anda dapat membayangkan strukturnya sebagai batang logam dengan benda-benda di atasnya, semuanya seimbang di atas batang vertikal.
1 7 4 a
===============
|
Baris pertama adalah item. Bobot masing-masing item dihitung sebagai nilai ascii dari karakter minus 32. (Karakter di bawah 32 tidak dipertimbangkan dan spasi menimbang 0). Perlu diingat bahwa kekuatan item pada batang adalah beratnya kali jarak ke titik pivot.
Baris kedua adalah tongkat. Setiap batang memiliki berat 1 unit dengan sendirinya. Baris ini secara eksklusif sama dengan tanda ( =
).
Baris ketiga adalah titik pivot. Ini dapat ditempatkan di mana saja, dan diwakili oleh sejumlah spasi diikuti oleh karakter pipa tunggal ( |
).
Contohnya
Memasukkan:
===== |
Output: Saldo
Memasukkan:
===== |
Output: Jatuh ke kiri
Memasukkan:
% ===== |
Keluaran: Saldo (Karena %
beratnya cukup untuk menetralkan bobot sisi kiri batang)
Memasukkan:
A A ======= |
Output: Jatuh tepat (karena a
di sebelah kanan lebih jauh dari titik pivot)
Memasukkan:
1 7 4 A
===============
|
Output: Jatuh ke kiri
Memasukkan:
1 7 4 a
===============
|
Output: Jatuh tepat (huruf kecil berat!)
Memasukkan:
$ ~
===============
|
Output: Saldo
Catatan
- Trailing whitespace diizinkan, whitespace terkemuka tidak diizinkan.
- Program Anda dapat menampilkan dalam format apa pun yang Anda suka, selama ada 3 keluaran berbeda untuk kiri, keseimbangan, dan kanan.
- Program Anda harus menerima format yang ditampilkan sebagai input.
Jawaban:
JavaScript (ES6),
116111108106 byte-5 byte dengan menjumlahkan melalui
eval(array.join`+`)
alih-aliharray.reduce()
.-3 byte secara default menjadi
1
alih-alih32 - 31
, memungkinkan tanda kurung dihapus.-2 byte karena titik pivot adalah panjang dari baris terakhir - 1
Output
-1
,0
atau1
, untuk meninggalkan, seimbang, atau kanan, masing-masing. Akhirnya mirip dengan jawaban python Chas Brown , jadi kredit masuk ke sana.Dapat menghemat 4 byte jika baris pertama diisi agar sesuai dengan panjang batang dengan menggunakan
(31-t.charCodeAt(i))*(b.length+~i)
.Cuplikan Tes
Termasuk output tambahan (
Left
/Balanced
/Right
) bersama dengan jumlahnya.Metode 106 byte lainnya
Alih-alih
join
menggunakan array di+
s, kami membuat string angka, masing-masing diawali oleh+
. Pemimpin+
diabaikan.sumber
(b.length+~i)
mungkin membantu menghemat satu byte. (Juga saya tidak mengerti mengapa Anda memilikinya||1
.)b.length+~i
mengembalikan negatif darii-b.length+1
; itu bisa membantu jika saya bisa meniadakan bagian lain. Adapun||1
, itu karena saya berasumsi baris pertama tidak empuk untuk mencocokkan panjang batang, jadit.charCodeAt(i)
akan kembaliNaN
melampaui ujung baris pertama.Python 2 ,
112110 byteCobalah online!
EDIT: Akhirnya berhasil menghilangkan
enumerate
danrjust
untuk 2 byte ... meh!Dibawa dalam sebuah string; output -1,0, atau 1 untuk jatuh ke kiri, saldo, jatuh ke kanan, masing-masing.
Pass pertama pada 112 byte adalah:
sumber
(ord(c)-31)
Butuh beberapa saat untuk menyadari bahwa ini sebenarnya menggabungkan berat batang itu sendiri bersama dengan barang-barang. Sangat pintar!return
denganprint
untuk -1 byte (meskipun tidak benar-benar bermain baik dengan kode TIO saat ini).Haskell,
212171 byte (188 jika mengambil input sebagai satu string)Varian 171 byte
Varian 188 byte
Penjelasan
sumber
fromEnum
bukannyaord
menjatuhkanimport
.c
dapat disederhanakan menjadic p=max(ord p-32)0
(atau denganfromEnum
) dan karena Anda hanya menggunakannya sekali, sebariskan.c
ini bahkan dapat disederhanakan (karakter di bawah 32 tidak dianggap) lebih jauhc p=ord p-32
. Jugap
pada dasarnyalength
(minus 1), jadip x=length x-1
akan bekerja juga (dan Anda bisa inline juga). Juga lihat solusi saya, bagaimana saya menggunakansignum
- Anda bisa melakukanr o l s = signum $ 2 * z ...
yang mengembalikan0,1,-1
untuk B, L, R.[3,4,7]
dan mengambil 3 Strings daripada satu (lihatlines
).Jelly , 30 byte
Test Suite
Output 0 untuk seimbang, 1 untuk kanan, dan -1 untuk kiri.
Bagaimana itu bekerja
sumber
Jelly , 24 byte
Cobalah online!
-1
untuk jatuh ke kiri,0
untuk menyeimbangkan,1
untuk jatuh ke kanan (program penuh).[-1]
untuk jatuh ke kiri,[0]
untuk menyeimbangkan,[1]
untuk jatuh ke kanan (fungsi).Baris pertama harus memiliki spasi tambahan, baris terakhir tidak boleh.
Penjelasan (kami mulai dengan garis bawah):
Pertama-tama, kami bekerja dengan masing-masing jalur, jadi kami harus mendapatkannya entah bagaimana. Itu pekerjaan untuk
Ỵ
. Kemudian, kita perlu memperlakukan\n
versi -split dari input seolah-olah itu adalah input asli, jadi kita gunakanµ
untuk membuat rantai monadik yang diterapkan pada nilai saat ini.Sekarang kita mulai pekerjaan nyata, dan pekerjaan pertama kita akan menghitung faktor-faktor bobot. Pada dasarnya ini adalah kisaran [jarak dari paling kiri ke pivot.0.0. Jarak dari pivot ke ujung kanan]. Pertama-tama, kita harus menemukan indeks pivot berbasis 1, yang pada dasarnya adalah panjang dari baris terakhir tanpa spasi tambahan. Jadi kami menghapus baris terakhir (pivot line) dari daftar asli kami dengan
Ṫ
, karena kami tidak akan membutuhkannya lagi, dan kemudian kami memanjangnyaL
. Kita kemudian perlu mengambil panjang batang, yang dengannya kita melakukan hal yang sama dengan garis sekarang-terakhir (garis batang) denganṪL$
. Akhirnya, untuk mendapatkan jangkauan, kami memetakan | x - y | ke [1..panjang produk], di mana x adalah indeks pivot dan yadalah setiap elemen dari daftar yang kita petakan. Kami melakukan ini menggunakanạЀ
, di manaạ
menghitung | x - y | danЀ
membuat rentang dari 1 hingga dan termasuk panjang batang. Sekarang kita akan memiliki rentang yang kita inginkan.Setelah itu, kita harus melipatgandakan setiap bilangan bulat, mewakili sepotong batang, dengan bobot yang sesuai. Untuk menghitung bobot, kami menggunakan
Ç
, pergi ke baris teratas dari kode kami. Kami mengambil baris yang tersisa denganṪ
, kode kodenyaO
, dan kemudian kami menghitung x - 31 menggunakan_31
, x menjadi masing-masing karakter sandi. Kami kemudian menetapkan ruang untuk bobot 1 (0 + potongan batang = 1),!
untuk bobot 2 (1 + 1), dll. Kami selesai dengan baris teratas, jadi sekarangÇ
akan mengembalikan daftar bobot, yang kami kalikan dengan yang sesuai bilangan bulat mewakili potongan batang dengan×
.Setelah itu, kami berpisah dengan
ṣ0
pada pivot point, diwakili oleh 0 (karena bobot apa pun tidak akan mempengaruhi hasilnya), menghasilkan daftar bentuk [[bobot 1, bobot 2 ... berat sesaat sebelum poros] , [berat setelah pivot, berat setelah pivot sebelum ... berat terakhir]]. Daftar itu mewakili sisi-sisi batang, kiri dan kanan. Kami sekarang menjumlahkan setiap daftar yang digunakanS€
untuk mendapatkan bobot total di setiap sisi, dan menggunakanI
untuk mengambil delta, yang akan menjadi negatif jika sisi kiri lebih berat, nol jika bobotnya sama, dan positif jika sisi kanan lebih berat . Jadi, untuk mengembalikan hasil akhir menggunakan ini dengan benar untuk keuntungan kami, kami menerima tandanyaṠ
.sumber
APL (Dyalog) , 43 byte *
Cobalah online!
⊆⊢
mempartisi argumen menjadi karakter yang dijalankan⎕TC[2]∘≠
berbeda dengan 2 nd T erminal C ontrol karakter (linefeed) **{
...}
terapkan fungsi anonim berikut pada daftar string:⊃⌽⍵
dalam string pertama dari daftar terbalik (yaitu yang terakhir)'|'⍳⍨
temukan ɩ ndex dari titik pivot(
...)-
kurangi itu dari daftar berikut:⊃⍵
string pertama≢
panjangnya⍳
semua d saran dari itu(
...)+.×
jumlah tertimbang dengan bobot tersebut dan nilai berikut:⊃⍵
string pertama⎕UCS
poin kode dalam U niversal C haracter S et¯31+
tambahkan negatif tigapuluh satu (32 untuk offset yang dibutuhkan minus satu untuk batang)×
signum itu* Untuk 1 byte per karakter, gunakan
{×(¯31+⎕UCS↑⍵)+.×(⍳≢↑⍵)-'|'⍳⍨↑⌽⍵}⎕TC[3]∘≠⊂⊢
dengan⎕ML←3
. Cobalah online!**
⎕TC
sudah usang dan digunakan di sini hanya untuk tujuan bermain golf. Dalam kode produksi, seseorang harus menggunakan⎕UCS 10
.sumber
Haskell (Lambdabot), 142 byte
Cobalah online!
Versi tidak disatukan:
sumber
Python 2 , 90 byte
Mengharapkan jalur input akan diisi (dengan spasi) dengan panjang yang benar. Output
-1
untuk jatuh kiri ,0
untuk seimbang , dan1
untuk jatuh tepat .Cobalah online!
94 byte
Untuk +4 byte kita dapat memiliki versi yang, menggunakan
while
loop, membutuhkan garis-garis yang dilucuti daripada garis-garis empuk :Cobalah online!
sumber
Ruby, 543 byte
sumber
C (gcc) , 106
107121123124129131byteKembalikan 0 untuk jatuh ke kiri, 1 untuk keseimbangan dan 2 untuk jatuh ke kanan.
Memerlukan ketiga garis untuk memiliki panjang yang sama dan selesai dengan
\n
untuk menentukan panjang tali.Cobalah online!
sumber
Mathematica, 91
92byteBaris pertama harus memiliki panjang yang sama dengan batang. Baris ketiga tidak boleh mengandung spasi tambahan.
Kembali -1, 0, 1 untuk jatuh ke kiri, keseimbangan dan jatuh ke kanan.
sumber
C # (.NET Core) ,
1279590 + 18 = 108 byteUntuk fungsi ini, baris pertama harus empuk dengan spasi yang sama dengan panjang batang dan baris ketiga tidak boleh memiliki ruang trialing. Ketentuan ini diizinkan (lihat komentar pertanyaan).
Cobalah online!
Output:
-1 untuk tip kiri
0 untuk saldo
1 untuk tip kanan
sumber
Python 3, 217 byte
Juga berfungsi di Python 2.7
Mengembalikan 1 untuk sisi kiri, -1 untuk sisi kanan, atau nol jika seimbang.
Versi yang dapat dibaca:
sumber
sum([...])
, Anda cukup memilikisum(...)
i[c:].find(e)
bisai.find(e,c)
, gunakani,m,n=s.split('\n')
dan hindari kebutuhans
sama sekali, gunakanreturn 2*(r>l) or l>r
untuk secara dramatis mengurangi biaya pengujian pada akhir (nilai pengembalian setara secara numerik, tetapiTrue
alih - alih1
danFalse
bukan0
), atau benar-benar, gunakan rangkaian pengembalian yang berbeda nilai dan lakukanreturn (l>r)-(r>l)
untuk mengembalikan 1, 0 atau -1 seperticmp
fungsi lama lakukan.i[c:]
karena cara yang lebih pendek menyebabkan masalah off-by-one yang aneh untuk beberapa input kasus sudut (coba letakkan|
tepat di tengah - di atas bilah).PHP, 105 byte
mencetak
-1
/0
/1
untuk kiri / keseimbangan / kanan. Jalankan sebagai pipa dengan-nR
atau coba online .kerusakan
sumber
Arang , 31 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Output 0 untuk saldo atau -1 atau 1 untuk jatuh ke kiri atau kanan. Sunting: Perubahan dalam Arang sekarang berarti itu
≔ΣEθ×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
berfungsi selama 24 byte: Cobalah secara online! Tautan adalah untuk mengucapkan versi kode. Catatan: Kedua jawaban memerlukan input empuk, tetapi dapat diadaptasi untuk menerima input tidak empuk dengan biaya 3 byte:≔⁰ξFLη≔⁺ξ×⁻ι⌕ζ|⁻℅§◨θLηι³¹ξI⁻›ξ⁰‹ξ⁰
Coba online!≔ΣE◨θLη×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
Cobalah online! Tautan adalah untuk mengucapkan versi kode.sumber