Tantangan:
Tulis fungsi atau program yang menerima daftar nilai boolean dan kembalikan semua rentang True.
Kasus uji:
f [F] = []
f [T] = [[0,0]]
f [T,T,F,T] = [[0,1],[3,3]]
f [F,T,T,F,F,T,T,T] = [[1,2],[5,7]]
f [F,T,T,F,F,F,T,T,T,T] = [[1,2],[6,9]]
f [T,T,F,F,F,T,T,T,T,T,T,T,T,T,T,F] = [[0,1],[5,14]]
f [F,F,T,T,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T] = [[2,3],[12,19],[33,54],[93,94]]
Aturan:
- Anda dapat memilih bagaimana input dikodekan, misalnya daftar, array, string, dll.
- Keluaran harus dikodekan sebagai suka-suka daftar-suka atau string yang menunjukkan seperti itu, jadi array, daftar, tupel, matriks, vektor, dll.
- Nilai boolean harus dikodekan sebagai konstanta, tetapi jika tidak konversi sederhana T / F ke konstanta yang diinginkan diperbolehkan
- EDIT: eval atau serupa selama runtime IS diizinkan.
- Jangan lupa untuk menjelaskan bagaimana input diteruskan ke program / fungsi dan berikan input / output untuk kasus uji
- Konversi ke format input yang diinginkan tidak dihitung
- Celah standar tidak diijinkan
- Jika bahasa Anda memiliki fungsi untuk melakukan ini, itu tidak diizinkan
- Saya tidak akan menerima kiriman saya sendiri
- EDIT: Format output fleksibel. Jika tidak mencetak daftar atau serupa, nilai rentang harus dipisahkan oleh satu karakter non-numerik dan rentang terpisah juga.
Mencetak:
- Skor dalam byte, kecuali tidak sesuai dengan bahasa Anda (seperti codels di Piet)
- Skor terendah menang
Ada sedikit fleksibilitas dalam input dan output, tetapi solusi di mana T / F diganti dengan fungsi yang melakukan semua pekerjaan tidak diizinkan.
Debugging:
Jika Anda menulis milik Anda di Haskell atau dapat memanggilnya dari Haskell, berikut ini akan memeriksa fungsi / program Anda:
import Test.QuickCheck
tf = cycle [True,False]
gen l = foldl (++) [] $ map (\i -> [tf!!i | x<-[1..i]]) l
putIn (a,b) l = zipWith (||) l [(a <= p) && (p <= b) | p <- [0..length l]]
putAllIn rs len = foldr putIn [False|i<-[1..len]] rs
main = print $ quickCheck (check functionNameGoesHere)
code-golf
array-manipulation
Michael Klein
sumber
sumber
Jawaban:
Pyth,
1716 byteMenggunakan beberapa sihir penghitung post-assign yang mewah bersama dengan enkode run run.
Mengambil input sebagai array
0
s dan1
s, mis[1, 1, 0, 1, 0]
. Output seperti dalam tantangan, mis[[0, 1], [3, 3]]
.Test Suite
sumber
Pyth, 18 byte
Suite uji
True diwakili sebagai
1
, False as0
.Kisaran diwakili secara inklusif.
sumber
Retina ,
823427 byteBaris kosong harus berisi satu spasi.
Input adalah string flat
_
untuk true dan:
false. Output adalah pasangan yang dipisahkan oleh ruang, masing-masing pada garis yang terpisah.Cobalah online.
Penjelasan
Golf berat dari 82 ke 27 byte dimungkinkan oleh pilihan cerdas representasi benar dan salah. Saya telah memilih karakter kata,
_
,, (yang bukan digit) untuk karakter true dan non-word:
,, (yang tidak perlu keluar) untuk false. Itu memungkinkan saya mendeteksi ujung rentang sebagai batas kata.Kami mencocokkan batas kata. Kami ingin mengganti batas itu dengan indeks nilai kebenaran yang sesuai. Pada prinsipnya itu cukup mudah dengan
$#
fitur terbaru Retina , yang menghitung jumlah tangkapan suatu kelompok. Kami cukup menangkap setiap karakter di depan posisi itu menjadi grup. Dengan menghitung karakter-karakter itu kita mendapatkan posisi. Satu-satunya tangkapan adalah bahwa ujung kisaran mati oleh satu sekarang. Kami sebenarnya ingin indeks karakter di depan pertandingan. Itu juga mudah diperbaiki dengan mencocokkan opsional_
yang tidak ditangkap, sehingga melewatkan satu karakter ketika kita berada di akhir rentang.Sekarang kami mengganti semua proses garis bawah dengan spasi. Artinya, kami menyisipkan ruang antara awal dan akhir setiap rentang, sambil menyingkirkan garis bawah.
Itu meninggalkan titik dua (dan kita masih harus memisahkan pasangan). Kami melakukannya dengan memisahkan seluruh string menjadi garis-garis di sekitar setiap titik dua. The
S
aktif modus membagi, dan_
Menekan segmen yang kosong sehingga tidak mendapatkan ton baris kosong ketika kita memiliki berjalan dari titik dua.sumber
Python 2, 69 byte
Contoh output:
Pendekatan langsung, tanpa built-in. Melacak nilai saat ini
x
dan nilai sebelumnyap
. Ketika ini berbeda, kami telah beralih menjalankan. Saat beralih0
ke1
, mencetak indeks saat inii
. Saat beralih1
ke0
, mencetak indeks saat ini minus satu diikuti dengan tanda titik koma.Sangat
if
bau. Mungkin rekursi akan lebih baik,sumber
MATL , 17
1820byteMenggunakan versi saat ini (9.1.0) dari bahasa / kompiler.
Input adalah string yang berisi karakter
T
danF
. Output adalah tabel dua baris, di mana setiap kolom menunjukkan rentang menggunakan 1-indeks, yang merupakan bahasa default.Terima kasih kepada Stewie Griffin karena menghapus 2 byte.
Contoh
Penjelasan
Ini didasarkan pada ekspresi reguler yang sederhana:
sumber
Oktaf, 43 Bytes
find(diff([0,x,0]))
menemukan semua posisi di mana array input berubah antara true dan false. Dengan membentuk kembali ini menjadi matriks 2-oleh-n kita mencapai dua hal: Perubahan dari benar ke salah, dan dari salah ke benar dibagi menjadi dua baris. Ini memungkinkan untuk mengurangi 1 dan 2 dari masing-masing baris tersebut. Mengurangkan 1 dari baris satu diperlukan karena Oktaf diindeks 1, bukan diindeks nol. Mengurangkan 2 dari baris dua diperlukan karenafind(diff())
menemukan posisi nilai salah pertama, sementara kita menginginkan nilai sebenarnya terakhir. Bagian pengurangan hanya mungkin dalam Oktaf, tidak dalam MATLAB.sumber
CJam,
2725 byteMengharapkan input seperti
TTFTFT
. Cobalah online .Penjelasan
sumber
Japt,
343125 byteMencoba pendekatan baru benar-benar berhasil kali ini.
Cobalah online!
Input adalah string dengan
F
untukfalse
danT
untuktrue
. Output adalah array array; representasi string membuatnya terlihat seperti array tunggal.Bagaimana itu bekerja
Catatan: Saya sekarang melihat bahwa beberapa orang telah menemukan algoritma ini, tetapi saya menemukannya secara mandiri.
Versi yang tidak bersaing, 22 byte
Dalam komit GitHub terbaru , saya telah menambahkan fitur baru: seorang pemimpin
;
menetapkan variabelA-J,L
ke nilai yang berbeda.A
diatur ke array kosong, sehingga menghilangkan kebutuhan untuk membuatnya secara manual.sumber
Haskell, 74 byte
Contoh penggunaan:
map(\l->(fst$l!!0,fst$last l)).wordsBy(not.snd).zip[0..] $ [True,False,True,True,False]
->[(0,0),(2,3)]
.Bagaimana itu bekerja:
sumber
J, 26 byte
Ini adalah kata kerja monadik tanpa nama (fungsi unary) yang mengembalikan array 2D atau bilangan bulat. Ini digunakan sebagai berikut.
Penjelasan
sumber
Ruby, 39
Doa contoh:
The
..
adalah bagaimana Ruby mewakili rentang inklusif.Satu hal yang menarik di sini adalah bagaimana saya mendapatkan indeks akhir kisaran. Itu aneh. Saya secara dinamis membuat ekspresi reguler yang cocok dengan karakter terakhir dari rentang, dan kemudian semua karakter berikutnya dan akhir string untuk memaksa kecocokan yang benar. Lalu saya gunakan
=~
untuk mendapatkan indeks regex itu di string asli.Curiga mungkin ada cara yang lebih pendek untuk melakukan ini di Ruby menggunakan flag -naF.
sumber
JavaScript (ES6), 59
Fungsi anonim, input sebagai string
T
danF
, mengembalikan output sebagai array arrayUJI
sumber
πΌππππ, 18 karakter / 28 byte
Try it here (Firefox only).
Penjelasan
sumber
Haskell, 62 byte
Dibawa sebagai input daftar 0 dan 1.
Diberikan daftar
l
, padukan dengan 0 di kedua sisi dan menghitung daftar pasangan berurut yang diindeks. Sebagai contohKemudian, ekstrak indeks yang sesuai dengan elemen berturut-turut
(0,1)
dan(1,0)
, yang merupakan awal dari blok 0 dan 1, kurangi 1 dari awal 0 untuk mendapatkan ujung 1, dan ritsleting hasilnya.sumber
f l=(\s->zip[i|(i,0,1)<-s][i-1|(i,1,0)<-s])$zip3[0..](0:l)$l++[0]
.Pyth,
1918 bytePenjelasan:
Coba di sini .
sumber
Perl, 47 byte
Dengan opsi perlrun berikut
-lpe
:Alternatif tempat output dipisahkan garis (34 byte):
sumber
Python 2, 108 byte
Kasus uji:
Tentunya ada solusi yang lebih pendek dari ini, tetapi berhasil.
sumber
Haskell: 123 byte (Contoh, tidak bisa menang)
Kurang bermain golf:
sumber
allTrue s e = and (subList s e)
atau mungkinallTrue = (and.) . sublist
.all (==True) (subList s e)
sangat jelas.CJam, 30 byte
Input sebagai array gaya CJam dari
0
s dan1
s. Output sebagai array gaya CJam.Jalankan semua test case. (Mengurus konversi format input.)
sumber
Japt, 27 byte
Pasti ada cara untuk bermain golf ini ...
Bagaimanapun, itu sama dengan jawaban πΌππππ saya.
sumber
APL, 17 karakter
Di
βIOβ0
danβMLβ3
. Dalam Bahasa Inggris:β΅Γβ³β΄β΅
: nol elemen-elemen dari vektor indeks selama argumen di mana argumen itu salahβ΅β
: potong pada awal setiap menjalankan kebenaran dan buang yang salah(β,βββ)Β¨
: ambil elemen pertama dan terakhir dari setiap subarraysumber
PowerShell, 82 byte
Solusi Regex, menggunakan properti objek MatchInfo .
Contoh
sumber
Mathematica, 45 byte
Tidak terlalu menarik; menggunakan builtin.
sumber
Clojure, 109 karakter
Hal pertama yang terlintas di pikiran saya, berdasarkan
reduce
danpartition-by
.Kotak uji sederhana (peta
T
ketrue
danF
kefalse
):sumber