Tugas Anda hari ini adalah menulis program atau fungsi yang mengambil array bilangan bulat, dan menghitung berapa kali, membacanya dari kiri ke kanan, bahwa nilainya berubah. Ini lebih mudah ditunjukkan dengan contoh:[1 1 1 2 2 5 5 5 5 17 3] => [1 1 1 **2** 2 **5** 5 5 5 **17** **3**] => 4
Kasus cobaan:
Input | Output
[] | 0
[0] | 0
[0 1] | 1
[0 0] | 0
[1 2 3 17] | 3
[1 1 1 2 2 3] | 2
[-3 3 3 -3 0] | 3
Ini adalah kode-golf , byte terkecil menang!
False
dicetak sebagai gantinya?2+False
dan itu kesalahan, itu tidak baik, tetapi jika saya mengerti2
, itu baik-baik saja.0
dapat diterima?Jawaban:
MATL , 2 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Python 3 , 38 byte
Cobalah online!
sumber
maximum recursion depth exceeded
.y>()
akan mengevaluasi ke False , sehingga kode berikutand
ini tidak dieksekusi.Haskell , 33 byte
Cobalah online!
Bonus: Versi aritmatika point-free yang agak aneh (44 byte)
Cobalah online!
Diberi masukan
[1,1,4,3,3,3]
, pertama kita mengambil perbedaan dari entri yang berdekatan ([0,3,-1,0,0]
), makaabs
nilai olute:[0,3,1,0,0]
. Mengambil nol dengan kekuatan setiap elemen pertama kali menghasilkan[1,0,0,1,1]
, dan kedua kalinya membalikkan daftar:[0,1,1,0,0]
((1-)
juga akan bekerja di sini, bukan(0^)
). Akhirnya kami mengambilsum
daftar untuk mendapatkan2
.sumber
Python 2 , 42 byte
Cobalah online!
sumber
Brain-Flak , 50 byte
Cobalah online!
Tidak menghasilkan apa-apa untuk 0, yang dalam brain-flak setara. Jika ini tidak dapat diterima, tambahkan ini untuk
+4
byte:({})
Penjelasan:
sumber
-0+1 = 1
Brain-Flak , 50 byte
Cobalah online!
sumber
Haskell , 35 byte
-8 byte terima kasih kepada H.PWiz.
Bermain golf dengan versi rekursif . Haskell adalah yang terbaik di rekursi dan saya melewatkannya. > _ <
Cobalah online!
Akan luar biasa jika ada yang tahu cara menggunakan tip ini .
Solusi alternatif, 36 byte
Cobalah online!
sumber
uncurry
fungsinyaf
berfungsi. Inisum.map fromEnum.(zipWith(/=)=<<tail)
mungkin yang paling dekat Anda dapatkan, tetapi itu tidak akan bekerja dengan[]
dan 37 byte ..Java (OpenJDK 8) , 65 byte
Tidak sesingkat yang saya inginkan, tapi itu hanya Jawa untuk Anda.
Uji dengan melewatkan array sebagai daftar terbatas koma.
Cobalah online!
sumber
a->{int s=0,p=a[0];for(int n:a)s+=p==(p=n)?0:1;return s;}
(57 byte).a->{int s=0;for(int i:a)s+=a[0]!=(a[0]=i)?1:0;return s;}
Sekam , 3 byte
Cobalah online!
Penjelasan
sumber
Ohm v2 , 3 byte
Cobalah online!
Penjelasan
sumber
sign
builtin!Bahasa Wolfram (Mathematica) , 23
242629byteCobalah online!
Split[]
.sedikit penjelasan:
Split
akan membagi array menjadi daftar daftar (dari elemen yang sama), yaitu berubah{1, 2, 2, 3, 1, 1}
menjadi{{1}, {2, 2}, {3}, {1, 1}}
. Jadi,Length@Split@#
adalah jumlah segmen yang berurutan.Max[*****-1, 0]
digunakan untuk menangani{}
input.sumber
Max[Length@Split@#-1,0]&
Length@Split@#~Max~1-1&
Retina ,
242116 byteTerima kasih kepada @MartinEnder untuk -3 byte dan memperhatikan bug
-1 byte berkat @tsh
-4 byte terima kasih kepada @Leo
Cobalah online!
sumber
Symbolic Python ,
120117 byteGolf 3 byte dengan menghapus gips eksplisit ke integer (menggunakan unary
+
) untuk variabel counter - ini berarti bahwa jika tidak ada perubahan dalam array output akanFalse
bukan0
, tetapi ini diizinkan oleh meta .Cobalah online!
sumber
Jelly , 3 byte
Cobalah online!
Bagaimana itu bekerja
sumber
K (oK) , 8 byte
Larutan:
Cobalah online!
Contoh:
Penjelasan:
Ditafsirkan dari kanan ke kiri:
sumber
05AB1E , 3 byte
Cobalah online!
sumber
Sekam , 4 byte
Cobalah online!
sumber
R , 24 byte
Cobalah online!
Sama seperti jawaban MATL, baru digunakan
sum(!!diff))
karena tidak adannz
.sumber
rle
akan lebih pendek, tetapi tidak,length(rle()$v)
menggunakan terlalu banyak karakter dan mati oleh satu.sum(rle()$v|1)
sebagai gantinyalength
. :)Cubix , 24 byte
Cobalah online
Perhatikan bahwa Cubix menggunakan 0 untuk menunjukkan bahwa tidak ada lagi input, sehingga 0 tidak dapat ada dalam daftar.
Penjelasan
Dibuka:
Kita mulai dari
0
, mendorong penghitung (diinisialisasi dengan0
) dan input pertama (I
) ke stack.Kami kemudian memasukkan loop. Pada setiap iterasi dari loop, kita mendapatkan input selanjutnya dengan
I
. Jika 0, kami kehabisan input, jadi kami memutar penghitung ke atas (p
),O
utput, dan keluar (@
).Kalau tidak, kita mengambil perbedaan dari dua elemen teratas. Jika bukan nol, kami memutar penghitung ke atas, menambahnya, dan memutarnya kembali ke bawah
p)q
. Kami kemudian menghapus perbedaan dengan;
sebelum pindah ke iterasi berikutnya.Semua karakter yang tidak disebutkan di sini hanya aliran kontrol. Ada banyak program Cubix.
sumber
0
untuk(
, tapi yang gagal pada input kosong.Brain-Flak , 50 byte
Cobalah online!
Karena semua orang memposting solusi 50 byte mereka di sini adalah milikku (saya punya 48 byte satu tapi itu modifikasi sederhana dari DjMcMayhem, jadi aku merasa layak posting)
Penjelasan
Jawaban ini secara ekstensif menggunakan pembatalan nilai.
Sepertinya bukan golf
Di sini kita menghitung delta sampai tumpukan memiliki satu item tersisa, setiap kali kita mengakumulasikan satu nilai dari loop dalam jika delta itu bukan nol.
Ini adalah cara yang sangat mudah untuk melakukannya.
Untuk membuat golf ini, kami mulai membatalkan nilai. Yang pertama dan yang harus jelas bagi setiap pegolf brain-flak yang keras adalah ketinggian tumpukan. Ini adalah fakta yang sudah diketahui
sama dengan
Ketika nilai dimodifikasi oleh satu, nilai yang sama berlaku. Ini memberi kita
Anda mungkin memperhatikan bahwa ini bahkan tidak menyelamatkan kami byte, tetapi jangan khawatir itu akan menjadi lebih bermanfaat saat kita melanjutkan.
Kami dapat melakukan pengurangan lain, jika Anda melihat pernyataan
Anda benar-benar dapat menguranginya menjadi
Ini berfungsi karena jika kita memasukkan loop
[(...)]
dan{}
akan membatalkan, dan jika kita tidak nilai yang[(...)]
sudah nol di tempat pertama dan tidak perlu dibatalkan. Karena kita memiliki kemunculan pola ini dalam kode kita, kita dapat menguranginya.Itu menyelamatkan kita 2 byte tetapi juga menempatkan dua neg di sebelah satu sama lain. Ini dapat digabungkan untuk menyelamatkan kita 2 lagi.
Dan itu kode kita.
sumber
Perl 6 , 18 byte
Menguji
Diperluas:
sumber
Gaia , 2 byte
Cobalah online!
Ini menyalahgunakan bug (atau fitur?) Dari Gaia, bahwa enkode run-length tidak memperhitungkan elemen yang terakhir dijalankan. Perhatikan bahwa saya telah memeriksa ulang, ini berfungsi untuk semua kasus uji.
ė
- Menjalankan pengkodean panjang (dengan cacat yang dijelaskan di atas).l
- Panjangnya.sumber
JavaScript (ES6), 35 byte
sumber
f=([a,...b])=>1/a?!!(a-b[0])+f(b):0
Pyth, 5 byte
Suite uji.
Penjelasan:
sumber
APL (Dyalog) , 8 byte
Cobalah online!
Bagaimana?
⊃,⊢
- daftar, dengan nilai pertama diulang untuk kasus elemen tunggal2≠/
- daftar perubahan, tidak sama untuk setiap 2 elemen+/
- jumlahsumber
Perl 5 , 37 + 2 (
-ap
) = 39 byteCobalah online!
sumber
J, 10 byte
Infiks dengan panjang 2 ... apakah tidak sama?
2 ~:/\ ]
Jumlahkan
0
s dan1
s yang dihasilkan :+/
Cobalah online!
sumber
[:+/0=-/\
seharusnya bekerja untuk saya pikir 9 byte.Ruby , 31 byte
Cobalah online!
sumber
.drop(1)
yang dapat Anda lakukan[1..-1]
drop
mengembalikan Enumerator, bukan Array, sehingga tidak berfungsi.size
Array?C (gcc 5.4.0), 61 byte
Cobalah secara Online!
f
adalah fungsi yang mengambil panjang array dan pointer ke elemen pertama array, dan mengembalikan jumlah perubahan dalam array;Kiriman ini menggunakan perilaku tidak terdefinisi (
*p++!=*p
, p digunakan dua kali dalam ekspresi di mana ia diubah), yang bekerja pada mesin saya (gcc 5.4.0) dan pada TIO, tetapi mungkin tidak bekerja pada implementasi atau versi lain.Penjelasan:
sumber
05AB1E , 3 byte
Cobalah online!
Alternatif jawaban Erik.
sumber