'String genap' adalah string mana pun dimana paritas nilai ASCII dari karakter selalu bergantian. Misalnya, string EvenSt-ring$!
adalah string genap karena nilai ASCII dari karakter adalah:
69 118 101 110 83 116 45 114 105 110 103 36 33
Dan paritas dari angka-angka ini adalah:
Odd Even Odd Even Odd Even Odd Even Odd Even Odd Even Odd
Yang bergantian sepanjang jalan. Namun, string seperti Hello world!
ini tidak string bahkan karena nilai-nilai ASCII adalah:
72 101 108 108 111 32 87 111 114 108 100 33
Dan paritasnya adalah:
Even Odd Even Even Odd Even Odd Odd Even Even Even Odd
Yang jelas tidak selalu berganti-ganti.
Tantangan
Anda harus menulis program lengkap atau fungsi yang menerima string untuk input dan menghasilkan nilai kebenaran jika string itu genap, dan nilai palsu sebaliknya. Anda dapat mengambil input dan output Anda dalam format apa pun yang masuk akal, dan Anda dapat mengasumsikan bahwa input tersebut hanya akan memiliki ASCII yang dapat dicetak (kisaran 32-127). Anda tidak harus menangani input kosong.
Contohnya
Berikut adalah beberapa contoh string genap:
#define
EvenSt-ring$!
long
abcdABCD
3.141
~
0123456789
C ode - g ol!f
HatchingLobstersVexinglyPopulateJuvenileFoxglove
Dan semua contoh ini bahkan bukan string:
Hello World
PPCG
3.1415
babbage
Code-golf
Standard loopholes apply
Shortest answer in bytes wins
Happy golfing!
Anda juga dapat menggunakan solusi tanpa kulit untuk menguji setiap string jika Anda ingin tahu tentang kasus uji tertentu.
lno
.Jawaban:
MATL ,
43 byteTerima kasih kepada Emigna karena menyimpan byte dan terima kasih kepada Luis Mendo karena telah memperbaiki beberapa bug. Kode:
Penjelasan:
Cobalah online!
sumber
A
.A
keluar berkat cara kerja MATLif
.2\
dengano
. Dan kodenya akan terlihat sangat ... keharusan :-)4
masih biasa4
...05AB1E ,
54 byteDisimpan 1 byte berkat Adnan .
Cobalah online!
Penjelasan
sumber
Ç¥ÉP
:)Jelly ,
754 byteDisimpan 2 byte menggunakan ide delta dari @ Steven H.
Disimpan 1 byte berkat @ Lynn .
Cobalah online! atau Verifikasi semua kasus uji.
Penjelasan
sumber
%2
→Ḃ
mod
.Python 2, 54 Bytes
sumber
Mathematica,
5044 byteVersi saat ini pada dasarnya semua keahlian Martin Ender.
Kembali
True
atauFalse
. Tidak ada yang terlalu pintar: mengambil jumlah mod-2 dari setiap pasangan kode ASCII berturut-turut, dan memeriksa 0 yang tidak pernah diperoleh.Versi lama:
sumber
JavaScript (ES6),
605046 byteSaya mencoba rekursi, tetapi pada 51 byte, sepertinya tidak cukup layak:
Cuplikan tes
Tampilkan cuplikan kode
sumber
s=>[...Buffer(s)].every(c=>p-(p=c&1),p=2)
Brain-Flak ,
13811411284 + 3 = 87 byteTerima kasih kepada @Riley untuk bantuan bermain golf.
Program ini memperlakukan input kosong sebagai string tidak ada.
Cobalah online!
Penjelasan (kedaluwarsa)
Menggeser input dari tumpukan kiri ke kanan sementara modding oleh 2. Menemukan perbedaan antara masing-masing karakter yang berdekatan sampai semua telah diperiksa atau salah satu perbedaannya sama dengan nol (yang hanya akan terjadi dalam string yang tidak ada). Jika loop diakhiri karena string noneven kemudian beralih kembali ke tumpukan kiri dan pop nilai yang tersisa di sana. Kalau tidak, tetap di tumpukan kanan dan pop nol di atas 1 yang tersisa di tumpukan.
sumber
([]){{}
->{
dan hapus([])
dari sesaat sebelum penutupan loop pertama.{({}(())){({}[()]<(()[{}])>)}{}({}<>)<>}<>
(42 byte). Ini berasal dari modulus asli Anda. Untuk membuatnya bekerja dengan program Anda, tambahan +1 nilad perlu ditambahkan:{({}(())){({}[()]<(()[{}])>)}{}({}()<>)<>}<>
R,
4135 byteEDIT: Menyimpan beberapa byte berkat @JDL dengan menggunakan
diff
alih-alihrle
.Penjelasan
readline()
baca input.utf8ToInt()%%2
mengkonversi ke nilai ascii dan mod 2 (simpan sebagai R-vektor)all(rle()==1)
panjang pengkodean untuk menemukan menjalankan. Semua run harus sama dengan satu atau lebih kecil dari 2 karena tidak boleh berjalan negatif atau 0 (menyimpan satu byte, bukan==
).sumber
prod(...)
daripadaall(... == 1)
menyimpan beberapa karakter.>1
?all
sepenuhnya nol dan satu.rle
dan menggunakandiff
:all(diff(utf8ToInt(readline())%%2))
(kita mendapat peringatan, tapi saya rasa itu tidak dianulir)all(numeric(0))
yangTRUE
, jawaban yang diinginkan untuk jangka satu string. (Saya menguji, jika itu penting, terhadap R-3.3.1)Pyth ( fork ), 9 byte
Tidak ada tautan Try Try Online karena garpu tidak memiliki versinya sendiri di penerjemah online.
Penjelasan:
sumber
Brachylog , 17 byte
Cobalah online!
Penjelasan
sumber
Java 8,
77767257 byte-4 byte terima kasih kepada @Geobits .
Penjelasan:
Cobalah online.
sumber
boolean
sini (saya tahu, itu menyebalkan). Yang terbaik yang bisa saya dapatkan dengan cara itu (72) adalah dengan menggunakan flag-int seperti:boolean c(char[]a){int i=3,b=1;for(int c:a)b=i==(i=c%2)?0:b;return b>0;}
Brain-Flak
155 151 141121Termasuk +3 untuk -a
Disimpan 30 byte berkat 1000000000
Output:
kebenaran : 1
falsy : 0 di atas tumpukan
Cobalah online! (jujur)
Cobalah online! (palsu)
Penjelasan yang lebih baik datang kemudian (jika saya dapat mengingat cara kerjanya setelah beberapa jam ...)
sumber
Starry , 85 byte
Cobalah online!
Perhatikan bahwa karena program Starry tidak memiliki cara untuk mengetahui kapan input dengan panjang arbitrer berakhir, program ini menggunakan baris tambahan di input untuk menandai akhir string. Jika Anda mendapatkan pesan kesalahan samar tentang dan metode tidak terdefinisi
ord
untuknil:NilClass
kemudian input tersebut hilang baris baru yang tertinggal.Penjelasan
Strategi dasar yang digunakan oleh program adalah membaca karakter satu per satu dari input dan jika mereka bukan baris baru (karakter 10), mod mereka nilai ASCII dari karakter sebesar 2 dan menemukan perbedaan antara itu dan karakter yang sebelumnya dibaca. Jika perbedaannya nol, program akan berhenti dan mencetak
0
(falsey). Kalau tidak, program akan kembali dan melakukan proses lagi. Jika program membaca baris baru, program akan berakhir dan dicetak10
(benar).Program Beranotasi
sumber
Perl, 24 + 1 (
-p
) = 25 byte-4 byte terima kasih kepada @Ton Hospel !
Membutuhkan
-p
bendera. Output 1 adalah string genap, tidak ada yang sebaliknya. Contohnya :Penjelasan : mengganti setiap karakter dengan nilainya mod 2 (jadi string hanya berisi 0s dan 1s setelah itu). Kemudian cari dua berikut 1 atau 0: jika menemukan beberapa, maka string tidak genap, jika tidak.
sumber
s/./$&&v1/eg;$_=!/(.)\1/
. PS(ord$&)%2
bisa ditulis sebagai1&ord$&
v1
?\x01
bukanJ, 15 byte
Pemakaian
Penjelasan
sumber
Vim, 38 byte
qqs<C-R>=char2nr(@")%2<CR><Esc>l@qq@q:g/00\|11/d<CR>
Mengasumsikan string input dalam buffer, dan kosongkan
"q
. Output binary nonsense jika benar, tidak ada jika false.s<C-R>=char2nr(@")%2<CR>
: Mengganti karakter dengan 1 jika aneh, 0 jika genap. Makro ini hanya melakukan ini untuk setiap karakter di baris (tidak peduli berapa lama itu).:g/00\|11/d<CR>
: Menghapus baris jika 2 "bit" berturut-turut memiliki nilai yang sama. Lebih cepat dari referensi kembali.Biasanya, di vimgolf, ketika Anda menggunakan fungsi ekspresi di dalam makro, Anda seharusnya melakukan makro itu sendiri pada register ekspresi dan menggunakan beberapa tipu daya untuk melengkapi tab. Itu lebih sulit kali ini. Saya mungkin menemukan cara untuk mempersingkat itu nanti.
sumber
Retina , 39 byte
Hitungan byte mengasumsikan penyandian ISO 8859-1.
Keluaran
1
untuk kebenaran dan0
kepalsuan.Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)
Penjelasan
Terinspirasi oleh jawaban mbomb007, saya baru-baru ini mengembangkan
ord()
implementasi yang cukup singkat di Retina. Ini sebagian besar didasarkan pada hal itu, meskipun saya dapat membuat beberapa penyederhanaan karena saya tidak memerlukan hasil desimal karena saya hanya perlu mendukung ASCII yang dapat dicetak (dan saya hanya peduli dengan paritas hasil, jadi berakhir dengan offset sewenang-wenang juga baik-baik saja).Tahap 1: Berpisah
Ini hanya membagi input menjadi karakter individu dengan membaginya di sekitar pertandingan kosong dan menjatuhkan hasil kosong di awal dan akhir dengan
_
.Tahap 2: Ganti
Itu
%{
memberitahu Retina a) bahwa tahap ini dan berikutnya harus dijalankan dalam satu lingkaran sampai string berhenti berubah melalui iterasi penuh, dan bahwa dua tahap ini harus diterapkan untuk setiap baris (yaitu masing-masing karakter) dari input secara terpisah.Panggung itu sendiri adalah teknik standar untuk menduplikasi karakter pertama dari input. Kami mencocokkan string kosong (tetapi hanya melihat dua kecocokan pertama) dan menyisipkan awalan yang cocok. Awalan pertandingan pertama (di awal string) kosong, jadi ini tidak melakukan apa-apa, dan awalan pertandingan kedua adalah karakter pertama, yang karenanya digandakan.
Tahap 3: Transliterasi
}
menunjukkan akhir dari loop. Panggung itu sendiri adalah transliterasi.01
menunjukkan bahwa itu hanya boleh diterapkan pada karakter pertama dari string.p
adalah singkatan untuk semua karakter ASCII yang dapat dicetak dan_
berarti "hapus". Jadi jika kita memperluas ini, transliterasi melakukan transformasi berikut:Jadi spasi dihapus dan semua karakter lainnya dikurangi. Itu berarti, dua tahap ini bersama-sama akan membuat rentang karakter dari ruang ke karakter yang diberikan (karena mereka akan berulang kali menduplikasi dan mengurangi karakter pertama sampai menjadi ruang di mana titik duplikasi dan penghapusan dibatalkan).
Panjang rentang ini dapat digunakan untuk menentukan paritas karakter.
Tahap 4: Ganti
Kami cukup menjatuhkan semua pasangan karakter. Ini menghapus garis panjang genap dan mengurangi garis panjang ganjil ke satu karakter (karakter input, pada kenyataannya, tapi itu tidak terlalu penting).
Tahap 5: Cocokkan
Lebih mudah untuk menemukan input yang tidak genap, jadi kami menghitung jumlah kecocokan dari dua baris kosong berturut-turut atau dua baris non-kosong berturut-turut. Kita harus mendapatkan
0
input genap dan sesuatu yang bukan nol.Tahap 6: Cocokkan
Semua yang tersisa adalah untuk membalikkan hasil, yang kita lakukan dengan menghitung jumlah pertandingan regex ini, yang cek yang input dimulai dengan
0
. Ini hanya mungkin jika hasil dari tahap pertama adalah0
.sumber
Clojure, 59 byte
Menghasilkan semua pasangan berurutan dari string
n
dan memeriksa apakah setiap jumlah pasangan aneh. Jika urutan int dianggap sebagai format yang masuk akal maka 50 byte.Lihat online: https://ideone.com/USeSnk
sumber
Julia,
5553 BytesDijelaskan
Peta karakter ke 0 | 1 dan periksa apakah string yang dihasilkan berisi "00" atau "11", yang membuat string tidak berganti-ganti.
sumber
Python, 52 byte
Fungsi rekursif. Menghasilkan 1 (atau True) untuk string genap, 0 untuk yang aneh. Mengalikan paritas perbedaan dari dua karakter pertama dengan nilai rekursif pada sisanya. String karakter tunggal memberikan True, seperti dicentang olehnya yang setara dengan karakter pertamanya. Ini mengasumsikan input tidak kosong; lain, satu byte lagi diperlukan untuk
s==s[:1]
ataulen(s)<2
.Python 2, 52 byte
Atau, solusi berulang. Iterasi atas karakter input, menyimpan nilai karakter saat ini dan sebelumnya mod 2. Mengalikan produk yang berjalan dengan perbedaan, yang karena 0 (Falsey) hanya ketika dua paritas berturut-turut sama.
Nilai "sebelumnya" diinisialisasi ke 2 (atau nilai apa pun bukan 0 atau 1) sehingga karakter pertama tidak pernah cocok dengan paritas dengan karakter sebelumnya fiksi.
Python, 42 byte, keluaran melalui kode keluar
Keluaran melalui kode keluar. Berakhir dengan ZeroDivisionError ketika dua karakter berturut-turut memiliki paritas yang sama, jika tidak berakhir dengan rapi.
sumber
Haskell,
4240 byteContoh penggunaan:
all odd.(zipWith(-)=<<tail).map fromEnum $ "long"
->True
.Bagaimana itu bekerja:
Edit: @xnatau disimpan dua byte. Terima kasih!
sumber
all odd.(zipWith(-)=<<tail).map fromEnum
.Mathematica,
4140 Bytes-1 character, thanks to Martin Ender
sumber
C, 52 bytes
Compares the parity of first 2 characters, recursively moving through the string until it finds 2 characters with the same parity or the string with the length of 1 (
s[1] == 0
).Code with some of the test cases
sumber
f(char*s){s=s[1]?(*s-s[1])%2?f(s+1):0:1;}
you don't need the int, return or [0]*++s
instead of the seconds[1]
you can changef(s+1)
tof(s)
. that plus my previous comment bring the total down to 39; I should also add that removingreturn
makes it not work on ideone, but it still works with gcc on windowsf(char*s){s=s[1]?(*s-*++s)%2&&f(s):1;}
I'd go on but it's 5 am and I have wake up in 3 hours lmaoPyke, 8 bytes
Try it here!
sumber
C #, 69 byte
Program lengkap dengan kasus uji:
sumber
PHP, 69 Bytes
solusi dengan Regex 81 Bytes
sumber
PowerShell v2 +, 47 byte
(Tidak bisa cukup menangkap pesaing PowerShell yang biasa ...)
Mengambil input
$args[0]
sebagai string, melemparkan sebagaichar
-array, loop melalui itu|%{...}
, setiap iterasi menempatkan modulo pada pipa (dengan implisit[char]
untuk[int]
konversi). Itu diringkas dalam parens dan-join
ed menjadi string, yang diumpankan ke sebelah kiri-notmatch
operator, memeriksa terhadap00
atau11
(yaitu, mengembalikanTrue
iff0
s dan1
s alternatif). Hasil Boolean ditinggalkan di jalur pipa dan hasilnya tersirat.Uji Kasus
sumber
> <> ,
2927 byteOutput 1 jika kata tersebut genap, 0 jika kata itu ganjil.
Anda dapat mencobanya secara online .
Sunting: disimpan dua byte berkat Martin Ender
sumber
Perl 6 ,
4726 byteDiperluas:
sumber
Scala, 54 byte
Saya yakin ini bisa diperbaiki.
sumber