Pertimbangkan seutas tali (seperti dalam "tali", bukan seperti dalam "sekelompok karakter"), yang dilipat bolak-balik pada garis nyata. Kita dapat menggambarkan bentuk string dengan daftar poin yang dilewatinya (secara berurutan). Untuk mempermudah, kami akan menganggap semua titik tersebut adalah bilangan bulat.
Ambil sebagai contoh [-1, 3, 1, -2, 5, 2, 3, 4]
(perhatikan bahwa tidak setiap entri menyiratkan lipatan):
Tali memanjang sepanjang arah vertikal hanya untuk keperluan visualisasi. Bayangkan string semua diratakan ke garis nyata.
Sekarang inilah pertanyaannya: berapakah jumlah string terbesar yang dapat dipotong menjadi satu dengan potongan tunggal (yang harus vertikal pada gambar di atas). Dalam hal ini, jawabannya adalah 6 dengan potongan di antara 2
dan 3
:
Untuk ambiguitas menghindari, dipotong memiliki harus dilakukan pada posisi non-integer.
Tantangan
Diberikan daftar posisi integer yang dilipat oleh string, Anda harus menentukan jumlah terbesar dari string yang dapat dipotong menjadi dengan potongan tunggal pada posisi non-integer.
Anda dapat menulis program atau fungsi lengkap. Anda dapat mengambil input melalui STDIN, argumen baris perintah, parameter prompt atau fungsi. Anda dapat menulis output ke STDOUT, menampilkannya di kotak dialog atau mengembalikannya dari fungsi.
Anda dapat mengasumsikan bahwa daftar tersebut ada dalam format daftar atau string yang mudah.
Daftar ini akan berisi setidaknya 2 dan tidak lebih dari 100 entri. Entri akan menjadi bilangan bulat, masing-masing dalam kisaran -2 31 ≤ p i <2 31 . Anda dapat berasumsi bahwa tidak ada dua entri berturut-turut yang identik.
Kode Anda harus memproses input semacam itu (termasuk kasus uji di bawah) dalam waktu kurang dari 10 detik pada PC desktop yang wajar.
Uji Kasus
Semua test case hanya input diikuti oleh output.
[0, 1]
2
[2147483647, -2147483648]
2
[0, 1, -1]
3
[1, 0, -1]
2
[-1, 3, 1, -2, 5, 2, 3, 4]
6
[-1122432493, -1297520062, 1893305528, 1165360246, -1888929223, 385040723, -80352673, 1372936505, 2115121074, -1856246962, 1501350808, -183583125, 2134014610, 720827868, -1915801069, -829434432, 444418495, -207928085, -764106377, -180766255, 429579526, -1887092002, -1139248992, -1967220622, -541417291, -1617463896, 517511661, -1781260846, -804604982, 834431625, 1800360467, 603678316, 557395424, -763031007, -1336769888, -1871888929, 1594598244, 1789292665, 962604079, -1185224024, 199953143, -1078097556, 1286821852, -1441858782, -1050367058, 956106641, -1792710927, -417329507, 1298074488, -2081642949, -1142130252, 2069006433, -889029611, 2083629927, 1621142867, -1340561463, 676558478, 78265900, -1317128172, 1763225513, 1783160195, 483383997, -1548533202, 2122113423, -1197641704, 319428736, -116274800, -888049925, -798148170, 1768740405, 473572890, -1931167061, -298056529, 1602950715, -412370479, -2044658831, -1165885212, -865307089, -969908936, 203868919, 278855174, -729662598, -1950547957, 679003141, 1423171080, 1870799802, 1978532600, 107162612, -1482878754, -1512232885, 1595639326, 1848766908, -321446009, -1491438272, 1619109855, 351277170, 1034981600, 421097157, 1072577364, -538901064]
53
[-2142140080, -2066313811, -2015945568, -2013211927, -1988504811, -1884073403, -1860777718, -1852780618, -1829202121, -1754543670, -1589422902, -1557970039, -1507704627, -1410033893, -1313864752, -1191655050, -1183729403, -1155076106, -1150685547, -1148162179, -1143013543, -1012615847, -914543424, -898063429, -831941836, -808337369, -807593292, -775755312, -682786953, -679343381, -657346098, -616936747, -545017823, -522339238, -501194053, -473081322, -376141541, -350526016, -344380659, -341195356, -303406389, -285611307, -282860017, -156809093, -127312384, -24161190, -420036, 50190256, 74000721, 84358785, 102958758, 124538981, 131053395, 280688418, 281444103, 303002802, 309255004, 360083648, 400920491, 429956579, 478710051, 500159683, 518335017, 559645553, 560041153, 638459051, 640161676, 643850364, 671996492, 733068514, 743285502, 1027514169, 1142193844, 1145750868, 1187862077, 1219366484, 1347996225, 1357239296, 1384342636, 1387532909, 1408330157, 1490584236, 1496234950, 1515355210, 1567464831, 1790076258, 1829519996, 1889752281, 1903484827, 1904323014, 1912488777, 1939200260, 2061174784, 2074677533, 2080731335, 2111876929, 2115658011, 2118089950, 2127342676, 2145430585]
2
sumber
a reasonable desktop PC
agak ambigu?Jawaban:
APL,
1614 byteTerima kasih kepada @ngn untuk menghemat 2 byte.
The
⎕
sebenarnya karakter kotak, bukan kesalahan hilang-font. Anda dapat mencoba program di tryapl.org , tetapi karena⎕
tidak sepenuhnya didukung di sana, Anda harus menggantinya dengan nilai input:Penjelasan
Program paling baik dijelaskan dengan contoh input
s = ¯1 3 1 ¯2 5 2 3 4
, yang diambil dari STDIN oleh⎕
. Pertama, kita menghitung≤
produk -outers
dengan menggunakan dirinya sendiri∘.≤⍨
. Ini menghasilkan matriks Boolean yangi
barisnya memberitahu elemen manas
yang kurang atau sama dengans[i]
:Kemunculan
0 1
dan1 0
padai
tanda baris menempatkan tempat string melewati titiks[i] + 0.5
. Kami mencocokkan ini di setiap baris menggunakan2≠/
, "kurangi 2-sublist oleh≠
":Yang tersisa adalah mengambil jumlah baris
+/
dan satu ditambah maksimum dari ini dengan
1+⌈/
:Hasilnya secara otomatis dicetak ke STDOUT di sebagian besar implementasi APL.
sumber
×
untuk perkalian, dan aturan sintaksis yang sangat sederhana. Google "menguasai Dyalog APL" untuk panduan yang bagus.Python,
887573 byteHanya lambda yang terus terang
Hanya untuk menunjukkan pendekatan lain:
Pyth,
2827 byteYang ini kira-kira setara dengan
diterapkan ke daftar input dari STDIN. Cobalah menggunakan penerjemah online .
sumber
def f(x):max(sum((a+.5-m)*(a+.5-n)<0for m,n in zip(x,x[1:]))for a in x)+1
+.5
s untuk menyimpan beberapa karakter. Saya menyadari mereka tidak ada gunanya di saya.a = point + .5
dan menghitung jumlah interval yang secara ketat mengandunga
. Tanpa.5
Anda akan memiliki masalah dengan kasus-kasus seperti[1, 0, -1]
contohnya.Pyth :
313029282423 karakter (Python 68 karakter)Coba di sini: Pyth Compiler / Executor
Ia mengharapkan daftar bilangan bulat sebagai input
[-1, 3, 1, -2, 5, 2, 3, 4]
Ini adalah terjemahan langsung dari program Python saya:
Solusi lama: Pyth 28 char
Hanya untuk alasan pengarsipan.
Kode Python yang sesuai adalah:
sumber
,QtQ
sebagai gantinya[QtQ)
i
bukan garis persimpangan,i - 0.5
adalah. Dan karena itu1
(sebenarnya1 - 0.5 = 0.5
) ada di dalam(-1, 1)
.min(a)<i<=max(a)
setara denganmin(a) < i - 0.5 < max(a)
, yang diselesaikan dalam Pyth denganmin(a) < i < max(a)+1
(perhatikanh
diheSk
).g
, yaitu>=
, jika Anda ganti<dheSk
dengangeSkd
.CJam,
36 34 3330 byteSaya percaya bahwa ada algoritma yang lebih baik di luar sana di alam liar. Namun, ini berfungsi di bawah batas yang diperlukan untuk semua kasus uji (bahkan pada kompiler online)
Inputnya seperti
Output (untuk kasus di atas) adalah
Bagaimana itu bekerja
Sekarang anggap array inputnya adalah
[-1 3 1 -2 5 2 3 4]
, langkah-langkah zip terlihat seperti:Array kedua pada baris terakhir adalah lipatan string.
Sekarang kita beralih
[-1 3 1 -2 5 2 3 4]
dan menghitung jumlah set masing-masing terletak. Dapatkan maksimal dari jumlah itu, tambahkan dan kita punya jawaban kita.Cobalah online di sini
sumber
Matlab
(123) (97)(85)Yay, akhirnya digunakan untuk XNOR =) Saya yakin itu bisa di-golf turun lebih jauh.
Tapi jujur saya sedikit malu bahwa MatLab menjadi bahasa yang saya tahu terbaik = /
Perkiraan waktu proses adalah
O(n^2)
.EDIT2:
EDIT: Versi golf baru lainnya (termasuk petunjuk dari @DennisJaheruddin, terima kasih!)
Versi lama:
@ MartinBüttner: Saya sangat menikmati tantangan kecil Anda sebelum-saya-pergi-tidur!
sumber
c=sort(a)-.5
Tentu saja titik pertama berada di luar kisaran tetapi tentu lebih mudah untuk mengatasinya. Dalam kasus terburuk yang dapat Anda lakukanc(1)=[];
. - Anda juga dapat menghapus perintah disp, hanya menghitung sesuatu yang akan menuliskannya ke stdout .-- Akhirnya dalam kasus ininumel
dapat diganti dengannnz
conv
pendekatan saya ... = D. Saya selalu lupa tentangnnz
, terima kasih banyak!disp
karena seseorang pernah mengkritik bahwa dengan metode yang Anda usulkan, Anda juga mendapatkan karakter lain (nama var atauans
) ditulis ke stdout ...Mathematica
134 133104Menyenangkan untuk dipecahkan, terlepas dari ukuran kodenya. Golf lebih lanjut masih bisa dicapai dengan mengganti ide
IntervalMemberQ[Interval[a,b],n]
dengana<n<b
.Penjelasan
list1
adalah daftar poin yang diberikanlist2
adalah daftar singkat yang menghilangkan angka yang tidak terlipat; mereka tidak relevan. Tidak perlu melakukan ini, tetapi mengarah ke solusi yang lebih jelas dan lebih efisien.Interval dalam
list1
danlist2
ditunjukkan dalam plot di bawah ini:Kita hanya perlu menguji satu garis di setiap interval yang ditentukan oleh titik lipat. Garis uji adalah garis vertikal putus-putus dalam plot.
f
menemukan jumlah potongan atau persilangan dari setiap garis uji. Garis pada x = 2,5 membuat 5 persimpangan. Itu menyisakan 5 + 1 lembar tali.sumber
Pyth, 21 byte
Coba di sini.
Berikan input sebagai daftar gaya-Python, mis
[-1, 3, 1, -2, 5, 2, 3, 4]
Berbasis dekat dari program @ jakube, tetapi dengan algoritma pusat yang ditingkatkan. Alih-alih melakukan
>
cek dan>=
cek, saya melakukan.index()
gabungan tiga angka dan memastikan indeksnya 1, artinya lebih besar dari minimum dan kurang dari atau sama dengan maksimum.sumber
R,
8683Sedang mengerjakan ini dan kemudian menyadari bahwa pada dasarnya saya telah menemukan solusi yang sama dengan Pengoptimal dan lainnya yang saya duga.
Pokoknya di sini itu sebagai fungsi yang mengambil vektor
sumber
R
. FWIW Anda bisa menghemat 3 karakter dengan menggunakanT
untuk "TRUE"GolfScript (43 byte)
Dalam hal efisiensi, ini adalah O (n ^ 2) dengan asumsi bahwa perbandingan membutuhkan waktu O (1). Memecah input menjadi segmen garis dan untuk setiap titik awal menghitung segmen garis setengah terbuka yang melewatinya.
Demo online
sumber
Python - 161
Ini mungkin bisa lebih banyak golf. gnibbler banyak membantu golf ini.
sumber
Ruby, 63
Mirip dengan solusi Python dalam konsep.
Tambahkan 2 karakter sebelum kode misalnya
f=
jika Anda ingin fungsi bernama. Terima kasih untuk MarkReed .sumber
C #,
7365 byteMembaca aturan saya pikir C # lambda harusnya cukup baik.
Edit: baru ditemukan
Count
memiliki kelebihan yang berguna untuk pemfilteran!Anda dapat menguji ini dengan mendefinisikan
delegate
jenis yang sesuai :Lalu
sumber
Matlab (
6343)Input diberikan sebagai vektor baris yang diteruskan ke fungsi
f
. Jadi misalnyaf([-1, 3, 1, -2, 5, 2, 3, 4])
mengembalikan6
.Versi lebih pendek:
Oktaf (31)
Di Oktaf
bsxfun
dapat dihapus berkat penyiaran otomatis:sumber
JavaScript (ES6) 80
82Lihat komentar - jumlah byte tidak termasuk penetapan ke F (yang masih perlu diuji)
Uji di konsol FireFox / FireBug
Keluaran
sumber
lambda
solusi Python , Anda tidak perlu menetapkan nilai fungsi ke variabel aktual, sehingga Anda dapat menjatuhkan dua karakter.Jelly , 10 byte
Cobalah online!
Bagaimana itu bekerja
sumber
05AB1E , 6 byte
Cobalah online!
Penjelasan:
sumber
JavaScript (Node.js) , 71 byte
Cobalah online!
sumber
Tambahkan ++ , 27 byte
Cobalah online!
Pendekatan terima kasih kepada Zgarb untuk jawaban APL mereka
Bagian penting dari tantangan ini adalah menerapkan perintah produk luar. Sayangnya, Add ++ tidak memiliki builtin untuk melakukannya, juga tidak memiliki cara mendefinisikan fungsi yang menggunakan fungsi lain sebagai argumen. Namun, kita masih bisa membuat fungsi produk luar yang digeneralisasi. Karena satu-satunya cara agar suatu fungsi dapat diakses di dalam fungsi lain adalah dengan mereferensikan fungsi yang ada, yang ditentukan pengguna atau builtin, kita harus membuat 'builtin' yang merujuk fungsi tersebut.
Fungsi "tabel" umum akan terlihat seperti ini:
Cobalah online!
di mana
func
adalah fungsi diad yang berisi operan kami. Anda dapat melihat sedikit kesamaan struktur ini dalam pengiriman asli, pada awal fungsi w , tetapi di sini kami ingin, terutama, fungsi produk luar monadik - fungsi produk luar yang mengambil argumen yang sama di kedua sisi.Fungsi tabel umum mengambil keuntungan dari bagaimana
€
ach cepat mendekati fungsi diad. Jika tumpukan terlihat sepertiketika
€{func}
ditemui,€
muncule
, mengikat itu sebagai argumen kiri ke angka dua, dan peta yang fungsi parsial berakhira, b, c, d
. Namun,€
peta cepat di seluruh tumpukan, bukan dari daftar. Jadi kita perlu meratakan array yang dilewatkan sebagai argumen terlebih dahulu.Fungsi tabel bekerja secara keseluruhan seperti ini
Namun, kita dapat mempersingkat ini cukup banyak karena fakta bahwa kita perlu meja luar kita menjadi monadik , dan hanya perlu berlaku untuk argumen yang disahkan. The
A
perintah mendorong setiap argumen ke stack secara individual, jadi kita tidak perlu dipusingkan dengan manipulasi stack. Singkatnya, jika argumen kita adalah array[a b c d]
, kita perlu membuat stack menjadiNilai atas adalah, tentu saja, argument.You mungkin telah memperhatikan dari contoh umum yang
bU
adalah membongkar perintah yakni lingkar atas array untuk stack. Jadi untuk membuat konfigurasi di atas, kita bisa menggunakan kodenyaCobalah online!
Namun, ini dapat dipersingkat dengan satu byte. Sebagai alias untuk
L,bU
, kita dapat menggunakan~
flag, untuk memerciki argumen ke stack sebelumnya, menjadikan contoh konfigurasi kita menjadiCobalah online!
yang merupakan awal dari baris kedua dalam program ini. Sekarang kita sudah menerapkan produk luar monadik, kita hanya perlu mengimplementasikan sisa dari algoritma. Setelah mengambil hasil tabel dengan
<
(kurang dari), dan hitung jumlah[0 1]
dan[1 0]
pasangan di setiap baris. Akhirnya, kami mengambil jumlah maksimum ini, dan menambahkannya.Langkah lengkap untuk langkah berjalan adalah
sumber