pengantar
Dalam tantangan ini, Anda harus membagi bilangan bulat menjadi dua bagian. Karena tidak ada yang suka mendapatkan sepotong kue yang lebih kecil, tujuan Anda adalah bersikap seadil mungkin. Misalnya jika Anda ingin membagi bilangan bulat 7129
menjadi dua bagian, ada 3 cara yang memungkinkan untuk melakukannya.
7,129
, 71,29
dan 712,9
semuanya kemungkinan, tetapi 71,29
merupakan cara paling adil untuk membaginya menjadi dua bagian karena meminimalkan perbedaan antara keduanya:
7 129 -> |7-129| = 122
71 29 -> |71-29| = 42
712 9 -> |712-9| = 703
Tantangan
Diberikan bilangan bulat menentukan cara terbaik untuk mempartisi seperti dijelaskan di atas dan melaporkan perbedaan yang dihasilkan.
Aturan
- Pemisahan hanya masuk akal untuk bilangan bulat dengan panjang setidaknya dua, input akan selalu ≥ 10
- Input dapat berupa bilangan bulat, daftar digit atau string
- Anda tidak harus menangani input yang tidak valid
Testcases
Anda hanya perlu melaporkan perbedaan yang dihasilkan, partisi hanya ada di sini untuk ilustrasi:
10 -> 1,0 -> 1
11 -> 1,1 -> 0
12 -> 1,2 -> 1
13 -> 1,3 -> 2
101 -> 1,01 -> 0
128 -> 12,8 -> 4
313 -> 3,13 -> 10
1003 -> 1,003 -> 2
7129 -> 71,29 -> 42
81128 -> 81,128 -> 47
999999 -> 999,999 -> 0
9999999 -> 999,9999 or 9999,999 -> 9000
05AB1E , 9 byte
Kode:
Menggunakan 05AB1E penyandian . Cobalah online!
Penjelasan
sumber
£
dengan°‰
Anda tidak perlu¤â
lagi.Python 2 , 64 byte
Cobalah online!
sumber
Perl 6 , 40 byte
Menguji
Diperluas:
sumber
C, 94 byte
Cobalah online!
sumber
Python 2 , 51 byte
Cobalah online!
sumber
Prolog (SWI) ,
195189154117112 byte35 byte disimpan berkat Eminga
Cobalah online!
Ini adalah percobaan pertama saya di prolog golf sehingga mungkin agak menghebohkan. Inilah cara kerjanya.
Pada level tertinggi yang kita miliki
*
.*
mengambilA
danH
, dan menentukan apakahH
cara terkecil untuk membagiA
.Baris pertama di sini menggunakan teknik dari posting SO ini , untuk dasarnya melakukan peta predikat
r(A)
atas bilangan bulat dari0
keA
. Karenar
mengonfirmasi nilai dari setiap partisi, ini akan memberi kita nilai dari semua partisi yang mungkin, ditambah seluruh muatan sampah tambahan. Semua partisi ini akan disimpanL
tanpa urutan tertentu. Setelah selesai, kami mengurutkan daftar untuk menemukan elemen terkecil. Kami kemudian menggunakan potongan untuk mencegah backtracing.Selanjutnya kita memiliki definisi
r
. Pertamar
menghitung dua hasil dari penamaan yang memberi merekaX
danY
.Kemudian kami menyatakan bahwa
C
itulah perbedaan mereka dan itu positif.sumber
X is div(A,10**B),Y is div(A,10**B)
akan selalu memberiC=0
(artinyaH
akan selalu menjadi 0 juga). SeharusnyaY is mod(A,10**B)
saya kira.r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).
menghemat 32 byte (Jika Anda menggunakan prolog SWI setidaknya, tidak yakin tentang versi lain).A*H
alih-alihl(A,H)
menyimpan 3 lainnya. Dan jika Anda menggunakan SWI, Anda dapat menambahkan tautan TIO,!
? Seharusnya tidak ada langkah mundur pada saat itu.,!
tidak akan diperlukan tetapi ketika saya menguji program itu melakukan backtrace. Tampaknya mencoba setiap kemungkinan pemesananL
dan kemudian memilah semuanya. Berarti itu akan memberikan waktu jawaban yang samaA!
.Haskell ,
6865 byteCobalah online!
Penjelasan
sumber
Arang , 14 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mudah saya bisa menggunakan varian 2-arg
Slice
. Penjelasan:sumber
Jelly ,
98 byteCobalah online!
-1 byte terima kasih kepada Dennis. Input adalah daftar digit.
Penjelasan
sumber
Funky ,
15913499 byteSebenarnya pas spek sepertinya lebih pendek.
Cobalah online!
sumber
Retina , 36 byte
Cobalah online!
Penjelasan
Ini menghasilkan semua partisi yang mungkin pada baris yang terpisah, serta garis trailing dengan input asli.
Konversi setiap angka di setiap partisi ke unary.
Hapus jumlah
1
s maksimal dan sama dari kedua bagian setiap partisi (yaitu menghapus minimum, dan kurangi dari maksimum, yang memberikan perbedaan absolut).Urutkan garis.
Hitung
1
s pada baris pertama, yang memberikan perbedaan absolut minimal.sumber
J ,
32, 2723 byte-5 byte terima kasih kepada FrownyFrog! -4 byte jika input berupa string.
Cobalah online!
Asli: Mengambil nomor sebagai masukan
Bagaimana itu bekerja:
Cobalah online!
sumber
JavaScript (ES6), 64 byte
Mengambil input sebagai string.
Uji kasus
Tampilkan cuplikan kode
Berkomentar
Non-rekursif (ES7), 65 byte
Mengambil input sebagai string.
Uji kasus
Tampilkan cuplikan kode
Berkomentar
Catatan : Di kedua versi,
l
dipaksa untuk string pada iterasi pertama. Biasanya, kita harus berhati-hati tentang memimpin nol dalam literal numerik:0123 - 10 === 73
karena0123
diuraikan sebagai nilai oktal (ini sekarang sudah ditinggalkan, tetapi masih berlaku dalam mode non-ketat). Tapi'0123' - '10' === 113
, nol di awal kali ini diabaikan. Jadi, itu suara untuk melakukannya.Dari spesifikasinya operasi abstrak yang
ToNumber
diterapkan ke string:sumber
APL (Dyalog) , 27 byte
Cobalah online!
Bagaimana?
¯1+≢⍵
- panjangn
minus 1∘.=⍨⍳
- matriks identitas1,
- Prepend1
untuk setiap baris↓
- dibagi dengan baris⊂∘⍵¨
- untuk masing-masing, partisi string dengan itu↑
- Ratakan-/
- kurangi setiap pasangan dengan pengurangan|
- ambil nilai absolut⌊/
- minimumAPL (Dyalog) , 35 byte
Cobalah online!
sumber
Jelly , 11 byte
Cobalah online!
-3 byte terima kasih kepada dylnan
Bagaimana itu bekerja
sumber
L=2$$Ðf
keṖLÐṂ
dalam kasus iniPython 2 , 58 byte
Cobalah online!
sumber
Pyth , 15 byte
Cobalah online!
sumber
MATL , 15 byte
Input adalah string yang mewakili integer.
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Bahasa Wolfram (Mathematica) , 66 byte
Mengambil daftar digit.
Cobalah online!
sumber
Bersih ,
10683 byteMenentukan fungsi
@
, mengambil string.Sebagian besar terbukti sendiri, satu-satunya bit yang rumit adalah
f=toInt o(%)n
: Ini mengambiltoInt
kelas fungsi, dan mengkomposisinya (o
) dengan kelas operator irisan kari (%
) sudah disertakan dengan argumen pertama (n
). Karena hanya ada satu jenis (String
, setara dengan{#Char}
) yang memiliki kelebihan untuk keduanya%
dantoInt
garis sebenarnya mengkompilasi, sedangkan biasanya sulit untuk menyusun fungsi ketika bermain golf karena kurangnya informasi kontekstual yang diberikan kepada kompiler.Cobalah online!
sumber
Jelly , 12 byte
Tautan monadik yang mengambil daftar angka dan mengembalikan bilangan bulat.
Cobalah online!
Bagaimana?
sumber
Pyth, 10 byte
Suite uji
Mengambil input sebagai string.
Ini menggunakan salah satu fitur Pyth yang lebih baru, yaitu menerapkan fungsi ke daftar default untuk memetakan fungsi di daftar, jika tidak ada perilaku lain yang didefinisikan. Ini berarti bahwa
v
diterapkan ke daftar daftar string mengevaluasi semua string.Perhatikan bahwa daftar pemisahan memungkinkan pemisahan menjadi 1 bagian, tetapi nilai ini akan selalu lebih besar dari minimum, sehingga diabaikan dengan aman.
sumber
Tcl , 116 byte
Cobalah online!
Penjelasan
Ini bekerja dengan menggunakan trik regex yang memungkinkan kasus akhir merosot yang akan selalu menghitung lebih dari perbedaan minimum. Untuk "12345" nilainya adalah:
sumber
lmap
sebagai gantiforeach
: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/…Ruby , 44 byte
Cobalah online!
sumber
APL + WIN, 31 byte
Meminta input layar integer sebagai string.
Penjelasan:
sumber
Perl 5 ,
5141 + 1 (-p
) = 42 byteCobalah online!
terinspirasi oleh komentar @ Nahuel-Fouilleul
sumber
$\--;$d=abs$``-$',$\=$\<0|$d<$\?$d:$\while//g}{
C # (.NET Core) ,
112107 + 18 = 125 byteCobalah online!
Hitungan termasuk 18 byte di
using System.Linq;
. Mengambil input sebagai astring
.sumber
string.Remove
mungkin menghemat beberapa byteCommon Lisp, 131 byte
Pertama kali saya berpartisipasi dalam golf kode dan saya memutuskan untuk menggunakan Lisp, karena saya menyukainya.
Ini solusinya:
Input harus berupa string, bukan bilangan bulat atau daftar.
sumber