Saya mendapat ide spontan membuat serangkaian tantangan pengguna yang telah membantu dan terus membantu komunitas PPCG menjadi tempat yang menyenangkan bagi semua orang, atau mungkin hanya khusus untuk saya. : P
Jika Anda mengonversi nama Dennis menjadi array 1
s dan 0
s di mana setiap konsonan berada 1
dan setiap vokal 0
, arraynya adalah [1, 0, 1, 1, 0, 1]
, yang simetris. Dengan demikian, tantangan Anda adalah menentukan apa nama-nama lain seperti ini.
Tantangan
Diberikan string ASCII, hapus semua karakter yang bukan huruf dan tentukan apakah konfigurasi vokal dan konsonan simetris. y
bukan vokal.
Harap dicatat bahwa program Anda tidak harus berupa tipe string itu sendiri.
Uji Kasus
Dennis -> truthy
Martin -> truthy
Martin Ender -> truthy
Alex -> falsy
Alex A. -> truthy
Doorknob -> falsy
Mego -> falsy
Implementasi Referensi
Kode Python 3 ini akan memberikan output yang benar diberikan kasus uji. Itu sama seperti tidak serigala yang saya bisa membuatnya tanpa menjadi konyol.
Python 3
s = input()
l = []
for c in s:
if c in 'AEIOUaeiou':
l.append(0)
elif c in 'BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz':
l.append(1)
print(l == list(reversed(l)), end = '')
sumber
Jawaban:
05AB1E , 9 byte
Cobalah online!
Terima kasih kepada Adnan .
Ini tepatnya menyerang titik rasa sakit Jelly. Ini menggunakan
l
danA
, setara 1-byte untuk JellyŒl
danØa
masing - masing.sumber
AÃ
denganá
danDR
olehÂ
.á
, tidak tahu apaÂ
, terima kasih!00
keFF
256 karakter itu, lihat jawaban JellyJelly , 11 byte
Cobalah online!
Versi alternatif:
Tentu saja sebuah tantangan untuk menghargai Dennis harus memiliki jawaban dalam bahasanya.
sumber
x86 32-bit fungsi kode mesin,
4241 byteSaat ini jawaban non-golf-bahasa terpendek, 1B lebih pendek dari @ streetster's q / kdb + .
Dengan 0 untuk truey dan non-zero untuk falsy:
4140 bytes. (secara umum, menyimpan 1 byte untuk 32-bit, 2 byte untuk 64-bit).Dengan string implisit-panjang (gaya-C diakhiri):
4544 bytekode mesin x86-64 (dengan pointer 32-bit, seperti x32 ABI):
4443 byte .x86-64 dengan string implisit-panjang, masih 46 byte (strategi bitmap shift / mask adalah impas sekarang).
Ini adalah fungsi dengan C tanda tangan
_Bool dennis_like(size_t ecx, const char *esi)
. Konvensi panggilan agak non-standar, dekat dengan MS vectorcall / fastcall tetapi dengan register arg yang berbeda: string dalam ESI dan panjang dalam ECX. Hanya clobbers arg-regs dan EDX-nya. AL memegang nilai balik, dengan byte tinggi yang menyimpan sampah (sebagaimana diizinkan oleh SysV x86 dan x32 ABI. IDK apa yang dikatakan ABI MS tentang sampah tinggi ketika mengembalikan bool atau integer sempit.)Penjelasan algoritma :
Ulangi string input, memfilter dan mengklasifikasikan ke dalam array boolean pada stack: Untuk setiap byte, periksa apakah itu karakter alfabet (jika tidak, lanjutkan ke karakter berikutnya), dan ubah ke integer dari 0-25 (AZ) . Gunakan bilangan bulat 0-25 untuk memeriksa bitmap vow = 0 / konsonan = 1. (Bitmap dimuat ke dalam register sebagai konstanta langsung 32-bit). Dorong 0 atau 0xFF ke tumpukan sesuai dengan hasil bitmap (sebenarnya dalam byte rendah elemen 32-bit, yang mungkin memiliki sampah di 3 byte teratas).
Loop pertama menghasilkan array 0 atau 0xFF (dalam elemen kata yang diisi dengan sampah). Lakukan pemeriksaan palindrom yang biasa dengan loop kedua yang berhenti ketika pointer melintas di tengah (atau ketika keduanya menunjuk ke elemen yang sama jika ada sejumlah karakter alfabet yang aneh). Pointer yang bergerak ke atas adalah stack pointer, dan kami menggunakan POP untuk memuat + kenaikan. Daripada membandingkan / setcc dalam loop ini, kita bisa menggunakan XOR untuk mendeteksi yang sama / berbeda karena hanya ada dua nilai yang mungkin. Kami dapat mengakumulasikan (dengan OR) apakah kami menemukan elemen yang tidak cocok, tetapi cabang awal pada flag yang ditetapkan oleh XOR setidaknya sama baiknya.
Perhatikan bahwa loop kedua menggunakan
byte
ukuran operan, jadi tidak peduli sampah apa yang ditinggalkan loop pertama di luar byte rendah dari setiap elemen array.Ia menggunakan instruksi tidak berdokumen
salc
untuk mengatur AL dari CF, dengan cara yang samasbb al,al
akan. Ini didukung pada setiap CPU Intel (kecuali dalam mode 64-bit), bahkan Knight's Landing! Agner Fog mencantumkan penetapan waktu untuk itu pada semua CPU AMD juga (termasuk Ryzen), jadi jika vendor x86 bersikeras untuk mengikat byte ruang opcode itu sejak 8086, sebaiknya kita memanfaatkannya.Trik menarik:
bt
, terinspirasi oleh beberapa keluaran kompiler yang bagus untukswitch
.stosb
.cmp
/salc
bukan pilihan, karenasalc
hanya berfungsi untuk CF, dan 0xFF-0 tidak mengatur CFsete
adalah 3 byte, tetapi akan menghindariinc
loop luar, dengan biaya bersih 2 byte (1 dalam mode 64-bit) )) vs. xor di loop dan memperbaikinya dengan inc.Ini mungkin juga salah satu jawaban tercepat, karena tidak ada golf yang benar-benar sakit terlalu parah, setidaknya untuk string di bawah beberapa ribu karakter di mana penggunaan memori 4x tidak menyebabkan banyak cache-misses. (Mungkin juga kalah dari jawaban yang mengambil string awal untuk string yang tidak seperti Dennis sebelum mengulang semua karakter.) Lebih
salc
lambat daripadasetcc
pada banyak CPU (misalnya 3 uops vs 1 pada Skylake), tetapi bitmap memeriksa denganbt/salc
masih lebih cepat dari pencarian string atau pertandingan-regex. Dan tidak ada overhead startup, jadi sangat murah untuk string pendek.Melakukannya dalam satu pass on the fly berarti mengulang kode klasifikasi untuk arah naik dan turun. Itu akan lebih cepat tetapi ukuran kode lebih besar. (Tentu saja jika Anda ingin cepat, Anda dapat melakukan 16 atau 32 karakter sekaligus dengan SSE2 atau AVX2, masih menggunakan trik perbandingan dengan menggeser rentang ke bagian bawah rentang yang ditandatangani).
Uji program (untuk ia32 atau x32 Linux) untuk memanggil fungsi ini dengan argumen cmdline, dan keluar dengan status = nilai balik.
strlen
implementasi dari int80h.org .Versi 64-bit dari fungsi ini dapat digunakan
sbb eax,eax
, yang hanya 2 byte, bukan 3 untuksetc al
. Itu juga akan membutuhkan byte tambahan untukdec
ataunot
di akhir (karena hanya 32-bit memiliki 1-byte inc / dec r32). Menggunakan ABI x32 (pointer 32-bit dalam mode panjang), kita masih dapat menghindari awalan REX meskipun kita menyalin dan membandingkan pointer.setc [rdi]
dapat menulis langsung ke memori, tetapi memesan byte ruang stack ECX biaya lebih banyak ukuran kode daripada menghemat. (Dan kita perlu bergerak melalui array output.[rdi+rcx]
Membutuhkan satu byte tambahan untuk mode pengalamatan, tetapi sebenarnya kita membutuhkan penghitung yang tidak memperbarui untuk karakter yang difilter sehingga akan lebih buruk dari itu.)Ini adalah sumber YASM / NASM dengan
%if
kondisional. Ia dapat dibangun dengan-felf32
(kode 32-bit) atau-felfx32
(kode 64-bit dengan ABI x32), dan dengan panjang implisit atau eksplisit . Saya sudah menguji semua 4 versi. Lihat jawaban ini untuk skrip untuk membuat biner statis dari sumber NASM / YASM.Untuk menguji versi 64-bit pada mesin tanpa dukungan untuk ABI x32, Anda dapat mengubah regs penunjuk menjadi 64-bit. (Kemudian kurangi jumlah REX.W = 1 awalan (0x48 byte) dari hitungan. Dalam hal ini, 4 instruksi memerlukan awalan REX untuk beroperasi pada regs 64-bit). Atau cukup sebut saja dengan
rsp
dan input pointer di ruang alamat 4G rendah.Saya melihat bermain-main dengan DF (bendera arah yang mengontrol
lodsd
/scasd
dan sebagainya), tapi sepertinya tidak menang. ABI yang biasa mengharuskan DF dihapus pada entri fungsi dan keluar. Dengan asumsi dibersihkan pada entri tetapi membiarkannya ditetapkan pada saat keluar akan curang, IMO. Akan lebih baik menggunakan LODSD / SCASD untuk menghindari 3-bytesub esi, 4
, terutama dalam kasus di mana tidak ada sampah yang tinggi.Strategi bitmap alternatif (untuk string panjang implisit x86-64)
Ternyata ini tidak menyimpan byte, karena
bt r32,r32
masih berfungsi dengan sampah tinggi di bit-index. Hanya saja tidak terdokumentasi seperti apashr
adanya.Alih-alih
bt / sbb
memasukkan bit ke / keluar dari CF, gunakan shift / mask untuk mengisolasi bit yang kita inginkan dari bitmap.Karena ini menghasilkan 0/1 dalam AL di akhir (bukan 0 / 0xFF), kita dapat melakukan inversi yang diperlukan dari nilai pengembalian di akhir fungsi dengan
xor al, 1
(2B) alih-alihdec eax
(juga 2B di x86-64) untuk masih menghasilkan nilai yang layakbool
/_Bool
kembali.Ini digunakan untuk menghemat 1B untuk x86-64 dengan string panjang implisit, dengan menghindari kebutuhan untuk nol byte tinggi EAX. (Saya telah menggunakan
and eax, 0x7F ^ 0x20
untuk memaksa huruf besar dan nol sisa eax dengan 3-byteand r32,imm8
. Tapi sekarang saya menggunakan 2-byte langsung-dengan-AL pengkodean yang paling 8086 instruksi miliki, seperti yang sudah saya lakukan untuksub
dancmp
.)Itu hilang ke
bt
/salc
dalam mode 32-bit, dan string panjang-eksplisit membutuhkan ECX untuk hitungan sehingga ini tidak berfungsi di sana juga.Tetapi kemudian saya menyadari bahwa saya salah:
bt edx, eax
masih bekerja dengan sampah tinggi di eax. Ini rupanya menutupi hitungan shift dengan cara yang samashr r32, cl
tidak (melihat hanya pada 5 bit cl rendah). Ini berbeda daribt [mem], reg
, yang dapat mengakses di luar memori yang dirujuk oleh mode / ukuran pengalamatan, memperlakukannya sebagai bitstring. (Gila CISC ...)Manual referensi yang ditetapkan Intel tidak mendokumentasikan penutupan, jadi mungkin itu perilaku tidak berdokumen yang dipertahankan Intel untuk saat ini. (Hal semacam itu tidak jarang terjadi.
bsf dst, src
Dengan src = 0 selalu meninggalkan dst tidak dimodifikasi, meskipun itu didokumentasikan untuk meninggalkan dst memegang nilai yang tidak ditentukan dalam kasus itu. AMD sebenarnya mendokumentasikan perilaku src = 0.) Saya menguji Skylake dan Core2, danbt
versi ini bekerja dengan sampah non-nol di EAX di luar AL.Trik yang rapi di sini adalah menggunakan
xchg eax,ecx
(1 byte) untuk mendapatkan hitungan ke CL. Sayangnya, BMI2shrx eax, edx, eax
adalah 5 byte, vs hanya 2 byte untukshr eax, cl
. Menggunakanbextr
membutuhkan 2-bytemov ah,1
(untuk jumlah bit untuk diekstrak), jadi itu lagi 5 + 2 byte seperti SHRX + AND.Kode sumber menjadi sangat berantakan setelah menambahkan
%if
kondisional. Inilah pembongkaran string x32 implisit-panjang (menggunakan strategi alternatif untuk bitmap, jadi itu masih 46 byte).Perbedaan utama dari versi panjang eksplisit di loop pertama. Perhatikan bagaimana ada
lods
sebelumnya, dan di bagian bawah, bukan hanya satu di bagian atas loop.sumber
Retina ,
49 4745 byteCobalah online!
Disimpan 2 byte berkat Neil.
Disimpan 2 byte lagi berkat Martin.
Menghapus non-huruf kemudian mengganti vokal dengan 1 dan konsonan dengan 2, untuk mendapatkan nilai yang konsisten. Kemudian berulang kali menghapus karakter pertama dan terakhir jika mereka sama. Begitu mereka tidak, kata itu simetris jika ada satu atau nol karakter yang tersisa.
sumber
\D
2
berhasil menyelamatkan Anda beberapa byteT`lL`2
?PHP, 82 Bytes
Cobalah online!
sumber
(bool)
dan menghapus$s=
dan==$s
cek untuk menyimpan 1 byte.(bool)
dengan hanya0||
dengan mengatakan false, atau ... sebagai gantinya, menyimpan 3 byte tambahan.\w
untuk kata karakter bukana-z
?\w
berisi digit garis bawah dan huruf. Ini tidak akan berfungsi dan[^/p{L}]
lebih lama sebagai[^a-z]
plus saya. Saya membandingkan string terbalik dengan string sehingga$s
diperlukan untuk membuat booleanMATL, 14 byte
Cobalah di MATL Online .
Ini adalah versi yang sedikit dimodifikasi untuk memeriksa semua kasus uji.
Penjelasan
sumber
Haskell,
84757469 byte-10 Berkat @nimi
-5 Berkat @Zgarb
Pemahaman daftar menggantikan setiap huruf dengan boolean dan menghapus semua karakter lainnya. Bagian pertama memeriksa apakah daftar yang dihasilkan adalah palindrome atau tidak.
Cobalah online!
sumber
filter
diikutimap
bahkan jika Anda harus beralih ke non-poitfree. 2) Ini<$>id
berlebihan.f x=(==)<*>reverse$[elem c"aeiouAEIOU"|c<-x,c
elem['A'..'Z']++['a'..'z']]
.c
dan"
untuk satu byte lagi.c`elem`['A'..'Z']++['a'..'z']
dapat disingkat menjadi'@'<c,c<'{','`'<c||c<'['
Pyth,
1815 byteCoba di sini.
-2 Berkat KarlKastor , dan selanjutnya -1.
sumber
_I/L"aeiou"@Grz0
(menggunakan operator invariansi I)z
juga, saya akan menganggap input dikutip)Brachylog , 13 byte
Cobalah online!
Penjelasan
sumber
Alice , 28 byte
Cobalah online!
Output
1
sebagai kebenaran dan tidak ada yang palsu.Penjelasan
Setiap perintah dalam program ini dijalankan dalam mode ordinal, tetapi dengan sedikit sentuhan pada template yang memungkinkan saya untuk menyimpan byte. Jika baris baru adalah nilai kebenaran yang dapat diterima, saya dapat menyimpan satu byte lagi dengan metode yang sama.
Secara linier, programnya adalah sebagai berikut:
sumber
Python 3 ,
7271 byte-1 byte terima kasih kepada @ovs
Cobalah online!
sumber
def f(s):s=[c in'AEIOU'for c in s.upper()if'@'<c<'['];return s==s[::-1]
untuk 71 byteJavaScript (ES6),
7269 byteDisimpan 3 byte berkat Neil
Mengembalikan boolean.
Uji kasus
Tampilkan cuplikan kode
sumber
2
.+''
di akhir? Itu akan menghemat 3 byte sebagai gantinya.Mathematica, 113 byte
sumber
PalindromeQ@StringReplace[#,{Characters@"aeiouAEIOU"->"1",LetterCharacter->"0",_->""}]&
GolfScript , 42 byte
Cobalah online!
Bagian yang sulit adalah menghasilkan alfabet huruf besar dan kecil dalam satu string, yang akan kita gunakan dalam fungsi filter untuk menyaring huruf keluar dari input. Untungnya, karena string dalam GolfScript hanyalah array codepoint dengan properti khusus, jadi kami hanya dapat menghasilkan codepoint dengan cara yang efisien. Inilah cara kami membuatnya:
Pertama, kami menghasilkan rentang [0..122], 122 menjadi titik kode untuk
z
. Kemudian, kita mengambil elemen dari elemen di indeks 65 dan seterusnya. 65 adalah codepoint untukA
. Saat ini, kami memiliki [65..122]. Semua baik-baik saja, kecuali kita memiliki beberapa codepoint yang tidak diinginkan ([91,96]) di sana. Jadi, pertama-tama kita membuat duplikat rentang itu. Kemudian, kami mengambil elemen dari indeks 26 dan seterusnya, dan kami memiliki [91..122]. Setelah itu, kita mendapatkan elemen hingga dan termasuk indeks 5. Sekarang kita punya [91..96]. Akhirnya, kami menghapus elemen-elemen itu dari [65..122] kami, meninggalkan kami wil [65..90, 97..122]. Itu adalah codepoint yang kita inginkan.Sekarang kami telah membuat daftar codepoint alfabet atas / bawah, kami melanjutkan fungsi penyaringan kami. Fungsi akan dipetakan ke setiap karakter pada string input, yang, seperti yang saya katakan sebelumnya, akan diurai sebagai codepoint sebagai gantinya. Jadi sekarang pada dasarnya kita miliki
[codepoint, [65..90, 97..122]]
. Untuk mengetahui apakah charcodepoint
adalah surat, kita cukup mengambil indeksnya di daftar yang kita buat. Jika tidak ada di sana, kita akan mendapatkan-1
sebagai gantinya indeks.Saat ini, kami mendapatkan nilai falsey hanya jika
codepoint == 65
, yaitu indeks pertama dari daftar kami, karena hanya kemudian indeksnya menjadi 0. Tetapi satu peningkatan akan memperbaiki masalah ini, dan, sekarang, jikacodepoint
ada dalam daftar kami, kami akan dapatkan indeksnya + 1, yang selalu merupakan angka positif, dengan demikian selalu benar, sedangkan jika tidak ada kita akan mendapatkan -1 +1 = 0, yaitu falsey.Kami akhirnya menerapkan fungsi yang saya jelaskan ke setiap karakter input, dan kami hanya mengambil karakter yang fungsinya mengembalikan hasil yang benar.
Selanjutnya kita harus menentukan apakah masing-masing karakter adalah vokal atau konsonan. Karena vokal lebih sedikit dari konsonan, membuat string vokal sehingga kami memeriksa kondisi itu lebih pendek daripada membuat string konsonan, jadi kami memeriksa apakah masing-masing karakter adalah vokal. Tetapi, untuk memeriksa apakah daftar boolean adalah palindromik, kita membutuhkan boolean, yang tidak kita dapatkan hanya dengan mengambil indeks +1, karena itu dapat menghasilkan sejumlah [1..10] jika char adalah vokal. Dan, seperti kebanyakan bahasa golf, yang satu ini, tidak memiliki
bool
fungsi juga. Jadi, kami cukup menggunakannot not x
, karenanot
selalu mengembalikan boolean. Tapi tunggu; apakah kita benar-benar perlu memiliki boolean tertentu? Karenanot
selalu mengembalikan boolean, mengapa kita tidak menghapus yang kedua sajanot
, dan benar-benar memeriksa apakah masing-masing char adalah konsonan? Ya, itulah yang akan kami lakukan!Setelah cek, yang mengembalikan daftar boolean, kami memeriksa apakah daftar boolean yang kami dapatkan adalah palindrom, yang merupakan tantangan yang diminta oleh kami untuk dilakukan. Nah, apa definisi palindrome? Ya, palindrome adalah daftar atau string yang sama dengan kebalikannya. Jadi, bagaimana kita memeriksanya? Sederhana, kami menduplikasinya, mengambil kebalikannya, dan memeriksa daftar asli. Hasil yang kita dapatkan adalah, akhirnya , apa yang harus dikembalikan oleh kode kita.
sumber
PHP , 87 byte
Regex versi PHP gratis. Menambahkan "vokal" karena stripos dapat mengembalikan 0 yang salah dalam PHP.
Cacat diperbaiki oleh Jörg.
Cobalah online!
sumber
for(;a&$c=$argn[$p++];)ctype_alpha($c)?$s.=stripos(_aeiou,$c)?0:1:0;echo$s==strrev($s);
tetapi mendapatkan hasil yang tepat untuk string yang mengandung nolq / kdb +,
4238 byteLarutan:
Contoh:
Penjelasan:
Suntingan:
reverse
ke k setara|:
sumber
CJam , 26 byte
Cobalah online!
-1 berkat Buah Esolanging .
sumber
26,'af+
dengan'{,97>
untuk menyimpan byte.Braingolf,
43 byte-1 byte terima kasih kepada Erik the Outgolfer
Ternyata saya sudah
P
bersama, bahkan sebelum tantangan ini.J
Namun, meskipun diciptakan sebelum tantangan ini, tidak didorong ke github sebelum tantangan, dengan demikian masih non-bersaing.Penjelasan:
sumber
n
?Alex A.
?Python 2, 83 byte
Menentukan fungsi yang memberikan
True
atauFalse
sumber
"aeiouAEIOU".__contains__
bukanlambda y:y.lower()in"aeiou"
.CJam , 79 byte
Timer pertama! (Saya melakukan apa yang saya bisa)
Cobalah online!
sumber
Python 3 ,
928774726968 byteCobalah online!
sumber
for c in s
s
variabel dengan menggantis
pada baris kedua keinput().lower()
Ruby, 57 byte
Cobalah online!
sumber
Bash , 82 byte
Cobalah online!
Menerima nama sebagai parameter, menghapus non-leter, mengganti vokal dengan 0, non-vokal atau 0 dengan 1 dan membandingkan dengan yang sama terbalik.
Bisa bermain golf lagi jika bisa mulai bekerja substitusi ganda atau tiga kali lipat
Status keluar adalah 0 untuk true dan 1 untuk no.
sumber
i=${i^^*};
konversii
ke huruf besar. Tapi saya pikir itu hanya menghemat Andaa-z
danaeiou
, yang kurang dari 10B harganya.Japt v2.0a0,
1911 byteCobalah online
Penjelasan
sumber
APL (Dyalog) ,
3433 byteCobalah online!
Golf sedang berlangsung.
sumber
819⌶⍨∘1
(⊢≡⌽)
PowerShell, 108 byte
sumber
Aksioma, 126 byte
uji
sumber
Pyke, 12 byte
Coba di sini!
sumber
PowerShell, 87 Bytes
Dapatkan salinan string di mana vokal 0 dan konsonan 1, dengan semua karakter khusus dihapus, bandingkan string itu dengan versi terbalik yang digabungkan kembali ke string
Keluaran:
sumber
Retina , 47 byte
Cobalah online!
Ini hanya pendekatan yang berbeda untuk karakter non-alfabet
sumber