Tantangan
Anda tugas untuk pertanyaan ini adalah untuk membagi input array integer pada kemunculan kedua setiap integer dalam array itu.
Tidak cukup jelas? Ini adalah contoh untuk membantu
Array input:
[2 1 1 2 3 2 2 4 5 6 7 3 7 0 5]
Keluaran:
[[2 1] [] [3 2 2 4 5 6 7] [] [0] []]
Penjelasan:
Berikut ini array dengan elemen kedua yang disorot dalam huruf tebal:
[2 1 1 2 3 2 2 4 5 6 7 3 7 0 5 ]
Sekarang kita menempatkan blok array pemisah di sekitar kejadian kedua yang tebal ini:
[2 1] 1 [] 2 [3 2 2 4 5 6 7] 3 [] 7 [0] 5 []
dan bungkus array yang terpecah ini dalam array untuk mendapatkan final
[[2 1] [] [3 2 2 4 5 6 7] [] [0] []]
Perhatikan bahwa ketika kejadian kedua yang berdekatan terjadi, akan ada array kosong.
Aturan
Seperti biasa, Anda harus menulis program lengkap atau fungsi yang mengambil array input melalui STDIN, ARGV atau argumen fungsi.
Memasukkan
Input terdiri atas format bilangan bulat array yang nyaman (atau mirip array).
Misalnya, salah satu dari yang berikut ini dapat diterima:
2 1 1 1 4 5 6
[2 1 1 1 4 5 6]
[2, 1, 1, 1, 4, 5, 6]
Keluaran
Saat mengeluarkan ke STDOUT, array Anda juga dapat dicetak dalam format array yang nyaman (bersarang), mis. Salah satunya
[[2 1] [1 4 5 6]]
[[2, 1], [1, 4, 5, 6]]
{{2, 1}, {1, 4, 5, 6}}
(Ini biasanya akan menjadi representasi string asli dari array dalam bahasa Anda.)
Perhatikan juga bahwa trailing array kosong harus dicetak sebagai bagian dari array.
Mencetak gol
Ini adalah kode-golf sehingga kode terpendek dalam byte menang!
sumber
""
sebagai array kosong? Ini berbau favorit menuju bahasa golf tertentu.2 1, 1 4 5 6
?Jawaban:
APL 25
Contoh:
Yang lama:
Ini adalah pertanyaan yang bagus untuk operator utama (⌸) yang diperkenalkan dengan Dyalog APL v14. Dibutuhkan fungsi argumen kiri ({1 ↑ 1 ↓ ⍵}) dan memberikannya untuk setiap argumen unik, indeks dalam vektor untuk argumen itu. Di sini saya mengambil indeks kedua, lalu saya memeriksa indeks mana yang ada dalam daftar ini ((⍳⍴⍵) ∊) dan menggunakan boolean yang dihasilkan untuk memisahkan vektor asli.
Dapat dicoba online di sini:
http://tryapl.org
sumber
1↓¨{1,∨⌿<\2=+\∘.=⍨⍵}⊂1∘,
APL (Dyalog 14) (31)
Ini adalah fungsi yang mengambil array dan mengembalikan array bersarang.
Uji:
Penjelasan:
0,⍵
: Tambahkan0
ke depan⍵
, untuk pemrosesan lebih mudah. (Itu tidak dihitung sebagai kejadian.)(
...)⊂
: Bagi array sesuai dengan bitmask yang diberikan. Grup baru dimulai di1
bitmask masing-masing .+\∘.=⍨⍵
: untuk setiap nilai dalam (asli)⍵
, temukan semua kemunculan di⍵
. Kemudian buat jumlah yang berjalan untuk setiap nilai, dengan memberikan matriks kuadrat yang menunjukkan untuk setiap posisi dalam⍵
berapa banyak dari masing-masing nilai yang telah terjadi.↓
: Pisahkan matriks dengan barisnya, berikan untuk setiap nilai sebuah array yang menunjukkan berapa kali itu terjadi pada setiap posisi.2⍳⍨¨
: Di setiap array ini, cari indeks yang pertama2
.(⍳⍴⍵)∊
: Untuk setiap kemungkinan indeks⍵
, lihat apakah indeks tersebut terdapat dalam daftar indeks kejadian kedua. (Ini memulai setiap grup, kecuali yang pertama.)1,
: Tambahkan1
ke depan, menandai awal dari grup pertama.1↓¨
: Hapus elemen pertama dari setiap grup. (Ini adalah nilai tambah0
, dan kemunculan kedua dari setiap nilai.)sumber
J,
2824 charTerima kasih khusus kepada randomra .
Ini berfungsi seperti ini. Atas semua awalan (
\
) dari larik input, kami melihat berapa banyak (+/@
) elemen awalan yang sama dengan elemen terakhir (={:
) dari awalan itu. Ketika angka ini adalah 2, kita tahu ini adalah kejadian kedua dari item tersebut di dalam array, jadi kita membagi array di sana menggunakan<;._1
.Hal lama menggunakan trik semacam:
(1&,<;._1~1,1=i.~(]-{)/:@/:)
.sumber
(1&,<;._1~1,2=+/@(={:)\)
lebih pendek 4 byte dan jauh lebih sederhana. (/:@/:
Ini trik yang bagus.)Mathematica,
585149 byteIni adalah fungsi yang tidak disebutkan namanya yang mengambil daftar seperti
dan mengembalikan daftar bersarang seperti
Bagaimana itu bekerja
Ini menggunakan beberapa sihir yang cukup tidak jelas
SplitBy
.Saya melacak kemunculan setiap angka dalam suatu fungsi
f
. Dalam Mathematica, Anda dapat menentukan nilai fungsi untuk setiap input secara terpisah, dan Anda tidak perlu menentukan nilai untuk semua input yang mungkin (ini lebih mirip tabel hash tentang steroid).Jadi saya mulai dengan menginisialisasi
f
ke 0 untuk nilai-nilai yang ada di input dengan(f@#=0;#)&/@
.Sekarang
SplitBy
mengambil daftar dan fungsi dan "membagi daftar menjadi sublists yang terdiri dari menjalankan elemen berturut-turut yang memberikan nilai yang sama ketikaf
diterapkan" (catatan yangSplitBy
tidak menghapus elemen apa pun). Tapi tangkapan (tidak terdokumentasi) adalah, yangf
disebut dua kali pada setiap elemen - ketika membandingkannya dengan pendahulunya dan penggantinya. Jadi jika kita lakukankami tidak hanya mendapatkan setiap angka satu kali, tetapi malah mencetak ini
yaitu 6 panggilan untuk 3 perbandingan.
Kita dapat membagi daftar sebelum setiap kemunculan kedua, jika kita menulis fungsi yang selalu mengembalikan
False
tetapi kembaliTrue
ketika kemunculan kedua dibandingkan dengan elemen sebelumnya. Itu adalah pemeriksaan ketiga pada elemen itu (dua pemeriksaan pada kejadian pertama, ditambah cek pertama pada kejadian kedua). Karenanya, kami menggunakan++f[#]==3&
. Yang menyenangkan adalah bahwa ini sudah kembaliFalse
lagi pada pemeriksaan kedua dari kejadian kedua, sehingga saya bisa kembaliTrue
untuk kejadian kedua berturut-turut, tetapi masih terbagi di antara mereka . Demikian juga, ini tidak akan terpecah setelah kejadian kedua, karena fungsi sudah kembaliFalse
lagi pada pemeriksaan kedua.Sekarang, pertanyaannya ingin kita juga menghapus kejadian kedua itu, jadi kita lepaskan elemen pertama dari setiap daftar
Rest/@
. Tapi tentu saja, kami tidak ingin menghapus elemen pertama dalam input, jadi kami benar-benar memulai, dengan menambahkan elemena
ke awal daftar{a}~Join~#
.a
adalah variabel yang tidak terdefinisi, yang Mathematica hanya memperlakukan sebagai tidak diketahui, sehingga tidak akan memengaruhi nilai lain darif
. Ini juga memastikan bahwa elemen aktual pertama dalam input mendapatkan dua pemeriksaannya seperti setiap elemen lainnya.sumber
Boole
di sana.Python, 148 byte
Solusi yang cukup menghebohkan. Pasti ada cara yang lebih baik ...
Panggil dengan
s([2, 1, 1, 1, 4, 5, 6])
.Versi tidak disatukan
sumber
Haskell,
11511310688ini menyimpan jumlah setiap elemen yang muncul sejauh fungsi dari elemen ke jumlah masing-masing, yang merupakan trik yang menarik.
ini berfungsi menggunakan
%
, fungsi yang diberi fungsi f dan argumenx
mengembalikan fungsi baru yang mengembalikanf
diterapkan ke argumen itu jika berbeda darix
, dan1 + f x
sebaliknya.misalnya,
3 % const 0
adalah fungsi yang mengembalikan 0 untuk setiap argumen kecuali 3, yang mengembalikan 1. pembaruan: menyatufoldl
untuk mendapatkan program yang jauh lebih kecil.sumber
Demo Ruby 66
Ruby lambda yang stabil, yang menggunakan array sebagai parameter dan mengembalikan array.
sumber
Python: 100 byte
Solusi mudah. Saya mengulangi daftar, menghitung berapa kali karakter muncul sebelumnya, dan menambahkan bagian sejak cek terakhir ke daftar output.
sumber
Ruby, 66
Penjelasan
e
adalah hasrat jumlah kejadian untuk setiap elemen,r
adalah Array di mana hasilnya disimpan.1
.2
, kita perlu membagi. Tambahkan yang kosongArray
ke hasilnya.Array
.sumber
CJam,
2524 byteMengambil input dari STDIN seperti
dan output seperti
Saya pada dasarnya mengulangi semua elemen array, satu per satu menempatkan mereka ke array lain. Lalu saya mendapatkan hitungan elemen saat ini di array lain. Jika 2, saya mulai array lain dari lokasi itu. Jenis awal array acak ini hanya dapat dicapai dalam bahasa berbasis stack.
Perluasan kode :
Cobalah online di sini
1 byte disimpan dari tip Martin saat mengobrol
sumber
Ruby, 64 byte
sumber
Perl 5: 36
Tidak yakin apakah ini dapat diterima karena tidak ada pemisahan yang sebenarnya terjadi di sini.
Contoh:
sumber
-pa
sebagai dua byte tambahan (karena "biaya" hanya dua byte, karena Anda dapat menuliskannya sebagai-pae
ganti-e
). Jadi itu 38, bukan 36.CJam, 28 byte
Mengambil input dari STDIN seperti
dan mencetak output ke STDOUT suka
Perhatikan bahwa string kosong dan array kosong adalah hal yang sama di CJam, dan ditampilkan sebagai
""
default (ini adalah representasi asli dari array kosong).(Saya mulai mengerjakan ini sedikit sebelum tantangan dipasang, karena kami sedang mendiskusikan betapa sulitnya tantangan itu.)
Penjelasan
Pada dasarnya, saya menduplikasi setiap elemen dalam array, kecuali itu kejadian kedua, dalam hal ini saya mengganti salinan pertama dengan spasi. Untuk alasan bermain golf, array yang dimodifikasi ini dibuat secara terbalik. Jadi
[2 1 1 2 3 2 3]
menjadiLalu saya memilih setiap elemen kedua dari ujung, yang merupakan array asli, tetapi dengan kejadian kedua digantikan oleh spasi, yaitu
Akhirnya, saya cukup membagi array pada spasi. Berikut ini adalah rincian kode:
sumber
""
yang secara eksplisit diizinkan dalam revisi pertama pertanyaan. Revisi saat ini menyatakan "format apa pun yang nyaman ... biasanya reparasi string asli array".Alat Unix, 100 byte
Kecuali input melalui stdin. Ini pada dasarnya hanya menggantikan setiap kejadian dengan
"] ["
. Tidak bekerja dengan string kosong,[]
akan memberikan string kosong, yang menurut saya merupakan representasi nyaman dari array kosong :)sumber
11
? apakah akan dikonversi1][
?APL, 42 karakter
Contoh:
Keluaran:
Diuji di sini.
Jika saya harus menampilkan string yang ditafsirkan persis sebagai struktur yang tepat di APL ... 49 karakter
sumber
1↓1
sepertinya memperbaiki masalah, tetapi itu terlihat terlalu aneh.Jawa, 223
Ini hanya bekerja pada Oracle atau OpenJDK JRE, karena saya menggunakan kekhasan ini dalam penerapan kuantifier dan panjang memeriksa dalam melihat-belakang untuk mengimplementasikan variabel-panjang melihat-belakang.
Sebagian besar pekerjaan dilakukan di regex, yang ditunjukkan di bawah ini dalam bentuk mentah:
Sebelum kita melihat regex di atas, mari kita lihat ekuivalen .NET regex, yang lebih sederhana, karena secara langsung mendukung variabel-panjang melihat-belakang (. NET melihat-balik kemungkinan besar dilakukan oleh mode pencocokan kanan-ke-kiri) :
*\b(\d+)\b
dan*
pada akhirnya cocok dengan angka dan ruang di sekitarnya (jika ada). Cek terikat adalah untuk mencegah pencocokan nomor parsial, karena spasi di kedua sisi adalah opsional. Ini juga menangkap nomor untuk memeriksa apakah ini adalah penampilan ke-2 dalam array.(?<=(.*\b\1\b){2})
memeriksa 2 contoh nomor yang ditangkap di atas dapat ditemukan.(?<!(.*\b\1\b){3})
memeriksa bahwa tidak ada 3 contoh nomor yang ditangkap dapat ditemukan. Kedua kondisi yang digabungkan menyatakan bahwa hanya ada 2 contoh dari jumlah sejauh ini. Cek terikat ada untuk memastikan seluruh nomor diuji.Kembali ke versi Java. Untuk mengimplementasikan tampilan panjang variabel di belakang, kami mentransformasikannya
untuk
Saya sedikit melambaikan tangan tentang fakta itu
.
mengecualikan pemisah garis, tetapi bisa diperbaiki dengan mudah dan saya tidak ingin memperumit sintaksis lebih lanjut.Panjang melihat-depan selalu 0, dan cek panjang melewati karena implementasi
*
kuantifier.Itu
^
tidak perlu untuk membuatnya bekerja, tetapi itu ada untuk membuat kasus gagal gagal lebih cepat. Lihat-belakang dalam implementasi Oracle / OpenJDK dilakukan dengan melangkah mundur dari panjang minimum pola, kemudian mencocokkan, kemudian membilas dan ulangi dengan menambah panjang sampai kecocokan ditemukan, atau dalam kasus terburuk, hingga panjang maksimum dari pola . Dengan^
, saya memastikan string awalan hanya cocok sekali.Namun, melihat-depan di dalam melihat-belakang tidak dibatasi oleh batas-kanan melihat-belakang, sehingga dapat mencocokkan semua jalan sampai akhir string. Untuk menegaskan batas, saya menangkap sisa string ke grup menangkap lain di dalam melihat ke depan, dan menggunakannya untuk membatasi pemerintahan pola panjang variabel.
Karena pola saya sudah dimulai
.*
, saya tidak perlu menambahkan yang lain.*
di depan.sumber
Perl 108
Dalam aksi:
Catatan: Dua baris pertama
$Data::...
hanya ada untuk presentasi yang lebih bagus dan baris ketiga@a=@b=@e=();
ada untuk membuat alat bekerja pada banyak baris.sumber
R, 76
Output untuk contoh: Daftar lima elemen, termasuk tiga vektor kosong. (
numeric(0)
).Ngomong-ngomong: Kode menghasilkan pesan peringatan yang dapat diabaikan.
sumber
awk 29
Ini membutuhkan sedikit kebebasan dengan format input dan output. Input "array" adalah vertikal, satu angka per baris. Output juga vertikal, satu angka per baris, dengan tanda hubung memisahkan array.
Memasukkan:
Keluaran:
sumber
Pyth 30
32Ini adalah pertama kalinya saya bereksperimen dengan Pyth. Ini solusi yang sama seperti pada solusi Python saya.
Anda dapat mencobanya secara online: Pyth Compiler / Executor
Misalnya input
akan dicetak
Penjelasan:
sumber
=Y+Y...
?~Y...
Python 2, 84
Daftar
l
ini adalah output sejauh ini. Kami beralih pada elemen. Jika yang sekarang adalah penampilan kedua, kami memulai sublist kosong baru; jika tidak, kami menambahkannya ke sublist terbaru. Daftar elemen yang dilihat sejauh ini disimpan dip
. Anehnya, merekonstruksi daftar tampaknya lebih pendek daripada memotong input.sumber
Bash murni
1119481 hanya untuk pemisahan:
Baris kedua
declare -p c
hanya membuang variabelSampel:
Catatan: garis
local b c d i
hanya diperlukan untuk menjalankan fungsi beberapa kali.Untuk presentasi terseksi (+26)
Akan membuat sesuatu seperti:
sumber
Scala,
122111Ambil koleksi karakter, cetak dalam bentuk
[21][][3224567][][0][]
,122111:... atau ambil koleksi karakter dan kembalikan daftar yang bersarang,
135129:Saya yakin ada beberapa penghematan yang bisa saya dapatkan, saya belum terlihat terlalu keras.
sumber
Python 220 byte
Di bawah ini adalah 220 byte yang tidak bagus dibandingkan dengan banyak yang lain tetapi berjalan cukup cepat dengan bilangan bulat yang lebih besar!
sumber
=
, perubahanxlist
danresult
nama-nama yang lebih pendek, dan menghapus spasi sekitar==
,;
dan:
. Jika Anda memerlukan bantuan lebih lanjut, cukup ketik@NoOneIsHere
(atau nama pengguna apa saja) dan saya / pengguna akan mencoba membantu.Java: 563 byte
perhatikan ini menggunakan Java 8, pra-JDK8 akan menjadi beberapa byte lagi karena foreach.
sumber
Integer.MAX_VALUE
ke2147483647
? Ini nilai yang sama dengan byte lebih sedikit. Juga,IndexOutOfBoundsException
dapat disingkat menjadiException