Angka seimbang jika jumlah angka pada setiap setengah angka sama, jadi: 1423
seimbang karena 1+4 = 2+3
, begitu juga: 42615
karena 4+2=1+5
. Perhatikan bahwa digit tengah tidak termasuk di kedua sisi (atau itu termasuk di kedua sisi) jika ada jumlah digit ganjil.
Tantangan:
Ambil bilangan bulat positif sebagai input, dan hasilkan nilai yang benar jika itu seimbang dan nilai yang salah jika tidak seimbang.
Uji kasus (benar)
1
6
11
141
1221
23281453796004414
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
Uji kasus (salah)
10
12
110
15421
5234095123508321
6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
Tidak akan ada angka yang dimulai dengan nol, misalnya 00032
bukan 32
. Anda harus mendukung angka hingga setidaknya 100 digit (lebih besar dari 2^64-1
). Seperti biasa, format input opsional, sehingga Anda dapat mengelilingi angka dengan apostrof jika diinginkan.
Ë
bukan`Q
?Ë
adalah perintah yang berbeda saat tantangan ini dibuat, jadi sayangnya tidak.> <> ,
3129 byteCobalah online!
Baris 1: Loop input standar
Baris 2: Buang -1 di atas tumpukan, tekan dua 0 dan putar satu ke bawah tumpukan (ini memastikan bahwa input dengan panjang <3 jangan buang tumpukan nanti dalam program)
Baris 3: Jika panjang tumpukan adalah> 3, tambahkan dua elemen teratas dan paling bawah tumpukan.
Baris 4: Jika bagian atas dan bawah tumpukan sama, output 1, 0 sebaliknya.
Sunting: menyadari bahwa tidak perlu membawa karakter mod 12, 2 byte disimpan
sumber
Haskell,
6463 byteSatu Byte Disimpan berkat nimi
sumber
b(a:t@(r:s))=a-last t+b(init t);b _=0
Brachylog , 20 byte
Cobalah online!
Penjelasan
sumber
Java, 85 byte
Catatan: input diberikan karena
String
Java tidak dapat menangani tanpaBigInteger
(danBigInteger
s dibangun menggunakan ....String
)Pengujian dan ungolfed:
sumber
for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));
.Mathematica, 57 byte
Penjelasan
Saya benar-benar berharap saya bisa menggunakan pendekatan ini dalam beberapa bahasa, dan tampaknya cukup baik di Mathematica. Idenya adalah untuk menghindari mendapatkan bagian depan dan belakang dengan menggabungkan daftar dengan terbalik dan hanya melihat bagian depan.
Pertama, kami mengubah input menjadi daftar angka desimal dan meneruskan hasilnya ke fungsi yang tidak disebutkan namanya di sebelah kiri.
Sekarang kita kurangi kebalikan dari daftar dari daftar itu sendiri. Jika digitnya maka hasilnya akan menjadi .
{a1,a2,...,an}
{a1-an,a2-an-1,...,an-a1}
Kami mengekstrak paruh pertama daftar ini (tidak termasuk digit tengah meskipun itu sebenarnya tidak masalah, karena perbedaannya
0
tetap saja).Dan kemudian kita menjumlahkan daftar ini. Jadi itu:
Mengatur ulang:
Input seimbang jika kedua bagian memiliki jumlah yang sama. Oleh karena itu, ungkapan ini nol jika inputnya seimbang. Jadi itulah yang kami periksa:
sumber
JavaScript (ES6),
5955514442 byteTernyata saya menggunakan strategi yang salah sepenuhnya. Versi ini secara rekursif menemukan jumlah babak pertama dikurangi jumlah babak kedua, lalu mengembalikan BUKAN logis dari hasilnya.
Jika kita dapat mengembalikan falsy sebagai pengganti truey dan sebaliknya, ini akan menjadi 35 byte:
Cuplikan tes
Tampilkan cuplikan kode
sumber
n[i*2]
! Bagusf=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)
?PowerShell v2 +, 85 byte
Mengambil input
$a
sebagai string (diperlukan untuk mendukung angka>2^64-1
tanpa masuk ke[biginteger]
casting yang sangat kikuk di baris perintah).Untuk penjelasannya, mari kita asumsikan masukan dari
'1423'
. Kami kemudian membangun string baru. Dua potong array adalah jelas ($a[...]
), dan itu dikelilingi oleh tiga senar tambahan(
,0)-(
dan0)
, merumuskan berbagaichar
s danstring
s. Catat,
di bagian depan untuk menerapkan rangkaian array, bukan rangkaian string.Seluruh array itu
-join
diedit bersama+
, menghasilkan string seperti(+1+4+0)-(+2+3+0)
, dan Anda dapat melihat bahwa0
s diperlukan untuk mencegah kesalahan sintaks. Itu dimasukkan ke dalam|iex
(kependekanInvoke-Expression
dan mirip denganeval
), yang akan menghitung hasil matematika. Selama string seimbang, Anda akan mendapatkan0
sebagai output, yang kami enkapsulasi dalam parens dan mengambil Boolean-bukan daripadanya!(...)
, ke outputTrue
. Jika bilangan bulat bukan nol, itu akan keluarFalse
.Uji Kasus
sumber
Perl, 29 byte
Termasuk +5 untuk
-lpF
Berikan nomor pada STDIN
balanced.pl
:sumber
C #, 83 byte
Cobalah online!
Sumber lengkap, termasuk test case:
Tipe data BigInteger memungkinkan panjang angka apa pun. Jika angkanya terlalu besar, kompiler mengeluh ( kesalahan CS1021: Konstanta integral terlalu besar ), jadi metode BigInteger.Parse (String) digunakan sebagai gantinya.
Solusinya sebenarnya dapat dikurangi menjadi 72 byte mengingat inputnya adalah string (dan memperbarui program yang sesuai):
sumber
t[l-++i]
bukant[l-1-i++]
, danreturn !r
bukanreturn r==0
?Python 3,
10710276 byte-26 bytes oleh @Rod !
sumber
floor(l/2)
denganl//2
danceil(l/2)
denganl//2+l%2
untuk menyimpan 7 byte, dan kemudian menghapus impor matematika, menyimpan lebih banyak 180
padan[0:l//2]
dann[l//2+l%2:]
hanya bisan[-(l//2):]
. Atau Anda dapat memindahkan//2
kel=len(n)//2
dan menggunakann[:l]
dann[-l:]
Ruby, 63 byte
Catatan: arg
s
harus berupa string.Pengujian (minimal diperlukan 5+):
sumber
Haskell, 55 byte
Fungsi rekursif
g
membuka bungkus string nomor dari kedua ujung dengan berulang-ulang mengambil kepala, lalu membalikkan. Ini mengurangi hasil rekursif dari kepala, yang menyebabkannya koefisien alternatif +1 dan -1, dengan +1 diterapkan pada paruh pertama dan -1 ke babak kedua.Jadi, dibutuhkan jumlah babak pertama dikurangi jumlah babak kedua. Ini memiliki masalah yang dengan angka ganjil digit, pusat tiebreak ke kiri, tetapi fungsi utama memperbaikinya dengan
(<*"xx")
, yang menggandakan setiap karakter, yaitu "12345" menjadi "1122334455". Dengan cara itu digit tengah terbagi rata di kedua sisi dan dibatalkan.sumber
Retina,
6444 byteCobalah online
Tahap pertama membagi string di tengah, menghilangkan karakter tengah jika ada satu (
diambil dan dimodifikasi dari sini .Courtesy of Martin.) Kemudian, ganti digit dengan representasi unary mereka, dan cocokkan jika kedua bagian memiliki panjang yang sama.sumber
(.)*?
(setiap iterasi mendorong tangkapan ke tumpukan 2). Kemudian kami mencoba mencapai ujung dengan muncul kembali dari tumpukan dengan(?<-2>.)*$
(setelah digit tengah opsional). Pertama kali ini mungkin adalah ketika kami telah menangkap tepat setengah digit (dibulatkan ke bawah) ke dalam kelompok 2.JavaScript (ES6),
7467...5950 byteSecara rekursif merangkum perbedaan digit pertama dan terakhir hingga tersisa kurang dari dua digit:
sumber
(s-=i<0?v:-v)
.Math.sign()
ternyata.R,
10596 byteTernyata R sangat bertele-tele. Mengambil input sebagai karakter.
Diformat dengan baik:
Penjelasan
y<-as.numeric(unlist(strsplit(x,"")))
Pisahkan input (string_, dan paksakan ke vektor alih-alih daftar, lalu ubah kembali menjadi bilangan bulat.sum(tail(y,
:tail
mengambil n elemen terakhir , ditemukan oleh:length(y)%/%2))
, Di mana%/%
adalah pembagian bilangan bulat, untuk mendapatkan langit-langit hasil bagi, di mana panjangnya aneh.sum(head(y,length(y)%/%2))
: sepertitail
,head
mengambil elemen n pertama dari vektor, ditemukan dengan cara yang sama.Suntingan
=
alih-alih<-
, menyimpan dua byte lagi.sumber
length(y)%/%2
entah bagaimana ke variabel dan menggunakannya dalam panggilantail
danhead
?Brain-Flak ,
410206204178 + 3 = 181 byteIni adalah versi 178 byte yang menggunakan
-a
flag.26 byte golf dari DJMcMayhem
Cobalah secara Online
Ini adalah versi yang lebih panjang 410 byte yang tidak menggunakan
-a
flag.Cobalah secara Online
Penjelasan
Berikut ini penjelasan tentang solusi yang lebih pendek
Untuk memulai, angka dikonversikan ke semua nilai ASCII oleh
-a
bendera.Kami mendorong ketinggian tumpukan (yaitu jumlah digit) dan membaginya dengan dua.
Untuk setiap nomor kurang dari jumlah yang baru saja kami dorong, kami memindahkan satu digit ke tumpukan lainnya
Jika ketinggian tumpukan berbeda, kami menghapus item teratas dari tumpukan saat ini
Kami ingin perbedaan antara jumlah setiap tumpukan. Jadi kami menggunakan algoritma berikut untuk menjumlahkan setiap tumpukan.
Ini mengasumsikan tidak ada digit yang memiliki nilai ASCII nol, yang merupakan asumsi yang valid.
Kami menjalankan ini untuk kedua tumpukan dan mengambil perbedaan (Hal
<(())>
ini diperlukan untuk bagian selanjutnya.Kami sekarang ingin meniadakan jumlahnya. Jika jumlahnya nol, maka akan muncul bagian atas yang memperlihatkan yang kita dorong sebelumnya, jika tidak maka akan menghapus nomor dan yang satu dan menempatkan nol di atas.
sumber
([]){[{}]{}([])}{}
harus menjumlahkan setiap tumpukan?({{}})
seharusnya bekerja dengan baik, dan karena Anda mengambil input ASCII, Anda tidak perlu khawatir tentang 0 yang merusak loop.Sebenarnya,
1716 byteJawaban ini terinspirasi oleh jawaban Python 2 ElPedro dan ide mereka untuk menggunakan
[-b:]
. Saran golf diterima. Cobalah online!Tidak melakukanolf
sumber
Perl 6 ,
42 3933 byteMenguji
Menguji
Uji itu (dari Jo King )
Penjelasan:
sumber
..
menangani non-integer). Bagaimana kalau 33 byte sebagai gantinyaJavascript, 73 byte
Loop ES5 yang bagus
Apa yang sedang terjadi disini?
sumber
Python 2, 73 byte
Tes ada di ideone
Kita harus menggunakan
str()
daripada `` karenan
mungkin di luar kisaran int yang ditandatangani.sumber
Python 2,
8377 byteEDIT
dikurangi menjadi 77 dengan bantuan dari @Rod
Contoh:
sumber
map(int,input())
sebagai gantinya[int(h)for h in raw_input()]
,len(g)/2
akan selalu menjadi int, tidak perlu mengonversi, danor b==0
tidak benar-benar diperlukanb==0
diperlukanlen=1
, tetapi Anda dapat mempersingkatnya menjadib<1
PHP,
73676057 byteMembutuhkan PHP 7.1 untuk offset string negatif:
Menjalankan:
Versi sebelumnya
Catatan: membutuhkan PHP 7 untuk operator pesawat ruang angkasa.
Jalankan seperti ini:
Penjelasan
Iterate di atas angka dalam angka. Memeriksa apakah digit milik bagian pertama atau babak kedua (atau digit tengah) dengan membandingkan indeks digit dengan panjang input dengan perbandingan gabungan (
2 * $x <=> $l - 1
). Kemudian gandakan dengan digit, ambil jumlah semua digit. Jika itu angka seimbang, jumlahnya akan menjadi0
.Contoh dengan input
15324
:Tweaks
$d
, cukup iterate panjang input. Disimpan 5 byte.null
tidak harus dilemparkan keint
PHP untuk menafsirkannya sebagai0
. Disimpan 1 byte.$argn
sumber
Clojure,
6664 bytePembaruan: Mengambil
str
darimap int
fungsi.Ini akan disingkat jika format input lebih fleksibel, sekarang saya harus memetakan integer menjadi urutan nilai ASCII. Bagian dalam
map
menghitung perbedaan nilai pasangan dari dua bagian, dan ini memeriksa apakah jumlah delta adalah nol.((comp f g h) x y z)
=(f (g (h x y z))
.Sebenarnya ini berakhir dengan panjang yang sama dengan hanya melakukan pemetaan di dalam
let
dan hanya mendefinisikan satu fungsi.sumber
sed (165 +1 untuk -r) 166
Output:
1 untuk
0 benar untuk salah
Cobalah online!
sumber
Python 2.7,
10292 byteAgar loop bekerja lebih baik: /
Gagasan yang sama, cukup gunakan panjang - saya untuk mendapatkan sisi lain. Itu tidak akan pernah mencapai pusat nomor ganjil.
Kode lama
Mendapat input
Menghemat lama input
Fungsi rekursif untuk mendapatkan jumlah string
Bandingkan jumlah babak pertama dengan jumlah babak kedua
Mencoba mendapatkannya di bawah 100, tetapi sulit: /
sumber
Fungsi C, 74
Ideone.
sumber
#include"string.h"\n
, yang menambah 19 skor Anda.char *n
l;i;t;f(char*n){..return!t;}
-2 byteRacket 204 byte
Versi detail:
Pengujian:
Keluaran:
sumber
Pyke, 20 byte
Coba di sini!
sumber
not [0]
0 bukan 1Mathematica, 69
sumber
...;;]]&@*IntegerDigits
@*
kependekan dariComposition
.f@*g
adalahf[g[##]]&
.