Ini adalah kelanjutan longgar dari tantangan saya sebelumnya pada pembuatan grafik .
Latar Belakang
Seorang seniman eksentrik telah mempekerjakan Anda untuk memperkirakan integritas struktural pahatannya. Dia menciptakan karya seninya dengan mengambil banyak magnet berbentuk kubus, dan menjatuhkannya satu per satu ke tumpukan besar. Untuk menganalisis metodenya dengan lebih baik, kami menggunakan model dua dimensi berikut. Kami mulai dengan lantai kosong, dan menjatuhkan magnet #
pada koordinat bilangan bulat apa pun, katakan 0
:
|
v
#
===============
0
Jika magnet lain jatuh 0
, itu berakhir di atas yang sebelumnya:
|
v
#
#
===============
0
Sekarang, mari kita jatuhkan satu magnet lagi 0
, dan kemudian satu lagi di 1
:
|
#v
##
#
===============
0
Seperti yang terlihat di atas, magnet jatuh menempel pada magnet kedua yang dilewatinya (magnet pertama hanya memperlambatnya). Magnet kedua tidak harus langsung di bawah yang pertama, dan magnet di kedua sisi masih dianggap sebagai satu magnet:
# #
##|##
# v #
### #
# #
===============
0
Para seniman ingin Anda menghitung celah vertikal maksimal di patung terakhir, yaitu, jumlah maksimum ruang kosong antara dua magnet pada kolom yang sama, atau magnet dan tanah di bawahnya. Pada gambar di atas, angka ini adalah 3 (pada kolom 2
).
Memasukkan
Daftar bilangan bulat, mewakili koordinat di mana artis menjatuhkan magnetnya, baca dari kiri ke kanan. Anda dapat mengasumsikan bahwa koordinat memuaskan -1024 <= i < 1024
dan bahwa panjang daftar paling banyak 1024
, jika itu membantu.
Keluaran
Kesenjangan vertikal maksimal di patung terakhir. Patung yang kosong memiliki celah -1
, dan kasing ini harus dimasukkan, karena pematung kami adalah seorang petapa.
Aturan tambahan
Anda dapat memberikan fungsi atau program lengkap. Hitungan byte terpendek menang, dan celah standar tidak diizinkan. Kode dengan penjelasan lebih disukai.
Uji kasus
[] -> -1
[0,2,1] -> 0
[0,0,0,0,0,1,-1] -> 3
[0,0,0,0,0,1,1,1,2] -> 4
[1,1,2,2,2,2,2,2,1] -> 2
[1,1,2,2,2,2,2,2,1,0,1,0] -> 2
[1,2,1,2,1,2,1,2,2,2,2,1,0] -> 3
[-1,-1,-1,1,1,1,0] -> 1
[-1,-1,-1,-1,2,2,1,1,2,2,2,1,0] -> 2
[-2,-2,-2,-1,-1,-1,0,0,0,1,1,1,2,2,2,3,3,4,4,5,5,5,6] -> 6
Haskell -
217185182 BytesPemakaian:
Fungsi ini membangun fungsi lain yang mengembalikan daftar posisi magnet y untuk posisi x yang diberikan. Dengan itu, ia menghitung kesenjangan untuk semua x-posisi -1024 .. 1024 dan mengambil maksimum (Edit: sekarang saya mengambil minimum, karena kesenjangan negatif: semakin rendah angkanya semakin besar kesenjangan).
sumber
flip
satu-
, pergi dengan angka negatif dan mengambilminimum
.Javascript,
201193Atau versi yang mudah dibaca
sumber
Python 2.7, 327
Sebelum bermain golf di ruang putih, tampilannya seperti ini:
Inilah penjelasan tentang garis-garis yang lebih kompleks, sebagian besar untuk keuntungan saya sendiri.
Ini membangun susunan daftar kosong panjang maks (tetes) -min (tetes) +1 plus pengganti di kedua sisi. Saya selalu ingin menulis [[]] * K untuk membangun array daftar kosong, tetapi itu membuat K pointer ke daftar kosong yang sama.
Fungsi izip_longest dari itertools seperti zip, tetapi mengisi daftar yang lebih pendek dengan None untuk menggabungkan daftar tersebut. Pengiris [:: - 1] membalik daftar 0 dan 1 dari perbandingan "atau". Daftar ini dibalik untuk menggunakan metode indeks di baris berikutnya, yang menemukan contoh elemen pertama. Karena elemen terakhir dari kolom kosong adalah 1, ini adalah elemen pertama dalam daftar terbalik dan diabaikan melalui slice [1:].
Pertama hitung perbedaan antara panjang kolom i dan posisi 1 kedua di kolom yang berdekatan. Jika perbedaannya positif, tambahkan banyak angka nol ke kolom i sebelum menambahkan angka 1. Setiap kali angka nonpositif [0] adalah daftar kosong.
Grup fungsi oleh itertools membagi daftar menjadi beberapa elemen berikutnya. Baris ini menemukan maks dari panjang semua urutan nol di semua kolom. Sangat penting untuk melemparkan setiap urutan q ke daftar, karena groupby mengembalikan generator (seperti semua fungsi itertools) yang secara alami tidak mendukung metode len.
sumber
Java - 281 byte
Cukup lurus ke depan.
Pertama membangun patung dalam sebuah array
Kemudian ia menemukan celah terbesar.
kecil -
sumber
||
dengan|
. Juga, mengembalikany
bukannya mencetaknya menghemat 9 byte.int a(int[]b){int z=9999,d[][]=new int[z][z],g,r,t,y=-1;for(int c:b){c+=z/2;g=0;for(r=z;--r>-2;){if(r==0||d[c][r-1]==1){d[c][r]=1;break;}if((d[c-1][r]==1|d[c+1][r]==1)&&++g==2){d[c][r]=1;break;}}}for(int[]k:d){t=0;for(int i:k){if(i==0)t++;else{if(t>y)y=t;t=0;}}}return y;}
. Ringkasan perubahan:z=9999
telah ditambahkan dan digunakan;int
danint[][]
inisialisasi bidang telah digabung menjadi satu; kedua||
digantikan oleh|
;for(r=9998;r>=0;r--)
telah diubah menjadifor(r=z;--r>-2;)