Mengapa Harus Simulator?
Anak-anak sekarang ini tidak punya waktu atau ambisi untuk benar-benar pergi dan menumpuk kotak-kotak di gergaji atau bermain-main dengan menyeimbangkan benda-benda fisik. Ini menyisakan banyak ruang di pasar perangkat lunak untuk Lever Simulator yang, menurut model saya, akan laku keras!
Bantuan Pemrograman Dicari
Saya telah mengajukan paten untuk game semacam itu (tertunda), tetapi membutuhkan programmer ahli untuk menulis logika game untuk saya. Dari pemahaman saya, itu adalah praktik standar untuk mengkompensasi programmer berdasarkan ukuran dalam byte dari program akhir. Karena itu saya akan memberikan kontrak menguntungkan ini kepada penawar terendah.
Spesifikasi
Tuas adalah serangkaian kotak atau ruang kosong yang diseimbangkan dengan titik tumpu. Setiap kotak memiliki berat satu hingga sembilan dan ruang tidak memiliki bobot. Seperti yang Anda ketahui, berat kotak pada tuas berbanding lurus dengan seberapa jauh kotak itu dari titik tumpu. Sebuah kotak berat 4
yang ada di ruang ketiga dari titik tumpu akan berkontribusi 12
unit kekuatan efektif ke sisi tuas itu.
Saya membutuhkan program yang, diberi tuas masukan, akan menampilkan apakah tuas akan condong ke kiri, kanan, atau seimbang sempurna.
Pedoman I / O
- Anda akan menulis untuk saya sebuah program.
- Input akan berisi satu baris teks.
- Input akan datang dari
stdin
atau sebagai satu string baris perintah. - Kotak akan diwakili oleh karakter '
1
' hingga '9
'. Karakter-karakter ini mewakili bobot masing-masing. Ruang kosong akan diwakili oleh spasi ''. Titik tumpu akan diwakili oleh tanda sisipan '
^
'.
Tuas masukan sampel dapat terlihat seperti: 8 2^ 941
Tuas ini sangat seimbang: (4*8) + 0 + 0 + (1*2) == 0 + (2*9) + (3*4) + (4*1) == 34
- Tidak akan ada ruang depan atau belakang. Tidak akan ada trailing newline.
- Tidak perlu menangani input yang salah, input akan selalu memiliki tepat satu titik tumpu, dan hanya angka dan spasi.
- Output akan menunjukkan apakah tuas kiri-berat, kanan-berat, atau seimbang.
- Program Anda harus memiliki 3 kemungkinan output yang mungkin dihasilkan dari input yang dibentuk dengan baik. Anda dapat memilih apa ini.
- Outputnya harus cetak
stdout
atau kode pengembalian program.
Uji kasus
Di sini saya menggunakan L
, R
, B
berarti kiri-berat, benar-berat, seimbang:
Input:
11 ^9
Keluaran:B
Input:
321^ 12
Keluaran:L
Input:
9^ 1
Keluaran:R
(Jika ada yang memiliki beberapa kasus uji "rumit", silakan mengeditnya).
Bibliografi
Tidak-perlu-terinspirasi-oleh, tetapi terkait dengan Balance serangkaian bobot pada jungkat-jungkit
sumber
The output must either be print to stdout or be the return code of the program.
Nah, sekarang Anda meminta saya untuk membuat distribusi Linux yang menggunakan notasi jungkat-jungkit untuk kode keluar.^16
,16^
atau^
? (Asumsikan itu bisa)Jawaban:
Python 2, 69 byte
Modulus
ord(c)%16
mengekstraksi nilai karakter digit sambil mendapatkan 0 untuk spasi. Untuk setiap karakter, kontribusi torsi dihitung saat bobot dikalikan dengan jarak masuk ke indeni-s.find('^')
, dan ini dijumlahkan dan dibandingkan dengan 0, menghasilkan satu-1,0,1
. Karakter^
dihitung memiliki bobot 14, tetapi itu tidak masalah karena berada di pivot.Sebuah 18-byte Pyth pelabuhan oleh Maltysen:
Untuk kode Python, jika program lengkap diperlukan, ini 79 byte. Idenya adalah untuk memulai indeks
i
dengan bergesers.find('^')
, dan memilikinya mundur.sumber
Javascript ES6, 62 Bytes
-1
jika dibiarkan lebih berat0
jika seimbang1
jika benar lebih beratTidak Disatukan:
Tes berjalan (menugaskan fungsi anonim ke
f
):R B L
menjadi-1 0 1
e.split``
menjadi[...e]
(terima kasih @ Vɪʜᴀɴ)~~'^'
mengevaluasi ke0
...)sumber
f=
dan mengatakan bahwa itu menghasilkan fungsi anonim. (-2 bytes FYI)Japt , 22 byte
Japt adalah versi singkat dari Ja vaScri pt . Penerjemah
Pengembalian
-1
untukL
,0
untukB
, dan1
untukR
.Bagaimana itu bekerja
sumber
APL,
3930 byteSetelah membaca ulang aturan, saya mengubah ini menjadi keluaran
-1
0
1
alih-alihL
B
R
, menghemat sembilan byte.Coba di sini .
sumber
Pyth, 20 byte
Suite uji
-1
untuk bias kiri,0
seimbang,1
untuk bias kanan.Bagaimana itu bekerja:
sumber
Haskell,
116968276 byteOutput adalah
0
untuk seimbang,-1
untuk kiri-berat dan1
kanan-berat.Contoh penggunaan:
f "321^ 12"
->-1
Cara kerjanya: temukan bagian sebelum
^
. Lipat gandakan string input dan daftar bobot yang dimulai dengan- length-of-first-part
. The^
memiliki berat 0 dan tidak menambah jumlah. Saya menggunakan trik mod 16 xnor untuk mengkonversi angka / spasi menjadi nilai integer. Jika jumlahnya negatif (positif), tuas kiri-berat (kanan-berat) dan seimbang jika jumlahnya adalah 0.sumber
TeaScript , 23 byte
25Saya mencoba menulis jawaban Pyth tapi itu berjalan sangat buruk: \
Itu
²
terlihat sangat tidak pada tempatnya tetapi menghemat 1 byte, jadi saya akan menyimpannya.Cobalah online!
Uji semua kasus
Untuk skema hasil yang saya pilih:
-1
jika Kiri lebih berat dari Kanan (L
)0
jika Kiri seberat Kanan (B
)1
is Left lebih ringan dari Right (R
)Penjelasan && Tidak Terkumpul
Ini menggunakan peta dan mengurangi untuk menyelesaikan pekerjaan.
sumber
pb ,
349329 byteIni yang sulit. pb tidak dirancang untuk pandai dalam hal semacam ini.
Bahkan tidak memiliki multiplikasi .Tapi hei, itu berhasil.Bagian tersulit adalah, setelah mendapatkan jumlah (berat * jarak) untuk setiap sisi, sebenarnya menentukan huruf mana yang akan dicetak. pb tidak memiliki
>
atau<
operator, adil==
dan!=
. Tidak ada cara mudah untuk mengetahui nilai mana yang lebih besar. Saya bahkan tidak bisa mengurangi dan membandingkan dengan 0 ... kecuali saya melakukan sesuatu yang sangat konyol.Kemudian, Anda cukup pergi ke X = (sisi kiri - kanan), dan ada jawaban Anda! Hapus semua yang ada di baris itu untuk membersihkan, dan kemudian cetak nilai yang ditemukan di (0, 0).
... Tapi ada cara yang sedikit lebih pendek. Alih-alih menggunakan 'L', 'B' dan 'R', gunakan nilai-nilai itu - 'B' dan tambahkan 'B' kembali saat mencetak. Dengan begitu, Anda tidak perlu menempatkan 'B' di X = 0, Anda cukup membiarkannya seperti 0 sebelumnya. Satu-satunya masalah adalah bahwa setelah Anda melakukan ini, program menjadi sangat konyol dalam mode tontonan.
'L'-'B'==76-66==10=='\n'
. Semuanya tampak berfungsi dengan baik, sampai tiba-tiba sejumlah besar baris baru dicetak dan tidak mungkin untuk melacak apa yang terjadi: D Dalam mode eksekusi reguler pbi, meskipun, semuanya bekerja dengan baik karena baris baru dihapus sebelum segala sesuatu dicetak ke menghibur.sumber
Perl 5, 72 byte
sumber
MATLAB 91, 57, 55Oktaf, 50 byteSaya tidak berharap untuk bermain golf ini lebih jauh, tetapi beralih ke Oktaf memungkinkan untuk menghemat 5 byte tambahan! Wow, ini butuh waktu ...
Output
-Inf, NaN, Inf
untukL, B, R
masing - masing.Suite uji!
Penjelasan:
Ini jelas kode yang sulit dibaca, tetapi saya akan mencoba menjelaskan sebaik mungkin. Saya akan beralih antara penjelasan blok kode dan teks.
Mari kita lihat apa yang terjadi di dalam kurung:
Yang ini agak rumit:
Angka-angka di setiap sisi tangga harus dikalikan dengan jarak dari tanda sisipan. Jika kita menggunakan angka negatif di sisi kiri, dan angka positif di sisi kanan kita cukup menjumlahkan vektor untuk melihat sisi mana yang terberat.
Misalkan input string adalah:
'321^ 12'
. Kami ingin berikut:3*(-3)+2*(-2)+1*(-1)+1*3+2*4
. Vektor yang kami buat di dalam tanda kurung dimulai1-i
, yang dalam hal ini adalah-3
, karena tanda sisipan berada di posisi ke-4. Naik satu deminnz(x)-i
satu. Kita bisa menggunakannnz(x)
alih-alihnumel(s)
, karenax
string tidak mengandung nol.Karena itu:
Sekarang, kita bisa melakukan penggandaan elemen-bijaksana
s.*[...]
, dan mengambil jumlah ini. Tetapi, karena kita memiliki dua vektor, kita juga dapat secara acaks
mengubah[...]
dan menghitung jumlah menggunakan perkalian matriks:Ini memberi kita angka negatif, artinya sisi kiri lebih berat, nol, berarti seimbang, atau angka postive, artinya sisi kanan lebih berat. Alih-alih menggunakan pendekatan naif
sign(...)
, kami melipatgandakannya denganinf
, yang akan memberi kita masing-Inf
- masing atauInf
untuk masing-masing kiri dan kanan. Kami mendapatkanNaN
untuk0*inf
, karena itu tidak terdefinisi.Ini memberi kita tiga nilai berbeda untuk tiga kemungkinan hasil.
sumber
𝔼𝕊𝕄𝕚𝕟, 22 karakter / 38 byte
Try it here (Firefox only).
sumber
JavaScript, 146 byte
Cukup besar.
Demo .
sumber
function t(s){
bisa menjadit=>{
dansplit('^')
bisa menjadisplit`^`
Ruby,
111108 bytePenjelasan
Ringkas nilai tertimbang dari setiap angka di setiap sisi. Kemudian ia menggunakan operator pesawat ruang angkasa ruby untuk memberikan 1,0, -1 dari kesetaraan / ketidaksetaraan dari dua sisi, yang merupakan indeks dari array dengan output yang benar.
sumber
PowerShell,
8373 BytesTerima kasih kepada TessellatingHeckler untuk golfnya.
Pada dasarnya menggunakan algoritma yang sama dengan kode lama di bawah ini, tetapi di sini kita beralih melalui karakter dalam string input satu per satu alih-alih mengulangi melalui indeks, yang menyimpan beberapa byte. Masih melempar pesan kesalahan spektakuler yang sama ketika algoritma mencapai
^
- tidak memengaruhi STDOUT.Sebelumnya
Menggunakan algoritma luar biasa yang sama dengan jawaban Dendrobium yang sangat baik , dan karenanya menggunakan output yang sama
-1 / 0 / 1
jika inputnyaleft-heavy / balanced / right-heavy
.Ugh. Lama karena fitur casting
quirkyang dimiliki PowerShell. Yang paling relevan di sini adalah bagaimanachar
dikalikan denganint
fungsi. Mengambil array-indeksstring
hasil dalam suatuchar
objek. PowerShell mengonversichar
untuk nilai ASCII yang sesuai (bukan nilai literal) sebelum perkalian. Jadi, sesuatu seperti$a='012'[0];[int]$a*2
menghasilkan96
.Itu berarti kita perlu melemparkannya kembali sebagai string. Namun, sekadar melakukan
string
waktuint
memberi kitastring
berulang yang berkali-kali. Misalnya,$a='0';$a*2
akan menghasilkan00
.Ini berarti kita harus melempar bagian
char
belakangstring
sebelum menyiarkan ulangint
, kemudian multiplikasi dapat terjadi, sebelum kita menambahkannya ke dalam akumulator kita$x
.Pasangan itu dengan cara panjang untuk beralih melalui string, dan panggilan .NET untuk menampilkan tanda, dan kami mendapatkan sepotong kode yang cukup panjang.
NB - Ini akan menghasilkan kesalahan spektakuler ketika mencapai
^
dalam string, menyatakan bahwa itu tidak dapat mengubahnya menjadiint
. Tidak memengaruhi STDOUT.sumber
param($b)$i=-$b.indexOf('^');[char[]]$b|%{$x+=$i++*+"$_"};[math]::Sign($x)
74 byte. Ini membutuhkan waktu yang lama dan beberapa upaya pendekatan. math :: sign terlihat sangat panjang, tapi saya tidak bisa melihat cara untuk meningkatkannya.$i++*+"$_"
setara dengan$i++*"$_"
jika$i
int.CJam, 29 byte
Cobalah online
Hasil
-1
untuk kiri-berat,0
seimbang,1
untuk kanan-berat.Ini sepertinya agak panjang, tapi saya mencoba banyak alternatif, dan mereka semua berakhir antara 29 dan 33 byte. Satu masalah adalah bahwa saya tidak dapat menemukan cara mengubah string ke nilai yang secara otomatis menghasilkan 0 untuk spasi. Jadi saya akhirnya secara eksplisit mengganti spasi dengan '0 karakter, yang jelas menambah panjang kode.
Alternatif mencoba:
ee
operator untuk menambahkan indeks ke daftar nilai.Penjelasan:
sumber
Python 3,
196114 byteKode reguler:
Penjelasan:
stdin
.Terima kasih banyak kepada @ThomasKwa untuk memangkas 82 byte (lebih dari 40%)!
sumber
print('LBR'[(B>D)-(B<D)])
untuk yang terakhir, danB=D=0
di awal.^
. Itu menghemat Andaabs()
juga.C,
140139138134100 byteKembali:
Lari:
Seperti yang kita miliki ASCII:
Kita mendapatkan:
Kemudian jumlah dengan faktor jarak ke
^
.sumber
SpecBAS - 140 byte
t
adalah total berjalan, nilainya negatif ketika posisi karakter lebih dari posisi karat. Pada akhirnya ia melihat apakah total negatif, nol atau positif dan mencetak karakter yang sesuai dari R, B atau L.Saya bisa mencukur beberapa byte dengan hanya mengeluarkan -1, 0 atau 1 seperti beberapa jawaban lainnya.
sumber
Java, 83 byte
sumber