Kullanıcı Değerlendirmesi Mücadelesi # 1: Dennis ♦


53

PPCG topluluğunun herkes için veya belki de sadece benim için eğlenceli bir yer olmasına yardım eden ve yardım etmeye devam eden bir dizi zorlukla başa çıkma konusunda kendiliğinden bir fikrim var. : P

Dennis'in ismini, her ünsüzün ve her ünlüün olduğu 1s ve 0s dizisine dönüştürürseniz , dizi simetriktir. Bu nedenle, zorluğunuz diğer isimlerin bu şekilde olduğunu belirlemektir.10[1, 0, 1, 1, 0, 1]

Meydan okuma

Bir ASCII dizgisi verildiğinde harf olmayan tüm karakterleri kaldırın ve ünlü ve ünsüzlerin konfigürasyonunun simetrik olup olmadığını belirleyin. yünlü değil.

Lütfen programınızın bu tür bir dizgenin olması gerekmediğini unutmayın.

Test Kılıfları

Dennis -> truthy
Martin -> truthy
Martin Ender -> truthy
Alex -> falsy
Alex A. -> truthy
Doorknob -> falsy
Mego -> falsy

Referans uygulaması

Bu Python 3 kodu bir test senaryosunda verilen doğru çıkışı verecektir. Saçma olmadan yapabildiğim kadar ağladı.

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 = '')

Çevrimiçi deneyin!


2. ve ne zaman kim?
caird coinheringaahing

@cairdcoinheringaahing Bana hatırlattığın için teşekkürler. Yaklaşık olacak Mego (TNB RO dolayısıyla italik) ama henüz son şekli verilmek üzere etrafında kazanılmış değil.
HyperNeutrino

Söylemeli miyim yoksa sadece balık aramak için suya dalıyor mu?
caird coinheringaahing

@cairdcoinheringaahing Zaten bildiğinden eminim; Onun için bir tane yapacağımı söyledim ama henüz penguenlerle veya TNB ile ilgili bir şeyler yapıp yapmayacağım konusunda karar vermedim.
HyperNeutrino

Penguenleri düşünüyorum. Onun için bildiği bir şey (benim için)
caird coinheringaahing

Yanıtlar:


15

05AB1E , 9 bayt

žM¹álSåÂQ

Çevrimiçi deneyin!

-2 Adnan sayesinde .

Bu Jelly'in acı noktasına tam olarak saldırır. Bu kullanır lve Ajöle en için, 1 bayt eşdeğerleri Œlve Øasırasıyla.


Bunun işe yarayacağına emin misin? Çalıştır
MCCCS

@CCCS Hmm, haklı olabilirsiniz.
Outgolfer Erik,

Sen yerine göre áve DRtarafından Â.
Adnan,

@Adnan Unuttum á, ne yaptığını bilmiyordum Â, teşekkürler!
Outgolfer Erik, 28:17

11
@alexis bu golf dillerin en 256 farklı karakterler ve onaltılık eşleştiren özel bir kod sayfası kullanmak 00için FFbu 256 karakter, Jelly cevaba bakınız
Stephen

18

Jöle , 11 bayt

ŒufØAe€ØCŒḂ

Çevrimiçi deneyin!

Alternatif sürümler:

ŒlfØae€ØCŒḂ

ŒufØAe€ØcŒḂ

ŒlfØae€ØcŒḂ

Elbette Dennis'i takdir eden bir mücadelenin kendi dilinde bir cevabı olmalı.


15
Oeuf olan yumurta içinde Fransız. Sadece söylüyorum
YSC

13

x86 32 bit makine kodu işlevi, 42 41 bayt

Şu anda en kısa golf dili olmayan cevap, @ streetster'in q / kdb + değerinden 1B daha kısa .

Truthy için 0, falsy için sıfır olmayan: 41 40 bayt. (genel olarak 32 bit için 1 bayt, 64 bit için 2 bayt kaydeder).

Örtük uzunluklu dizelerle (0-sonlandırılmış C tarzı): 45 44 bayt

x86-64 makine kodu (x32 ABI gibi 32 bit işaretçilerle): 44 43 bayt .

Örtük uzunluklu dizelerle x86-64, hala 46 bayt (vardiya / maske bitmap stratejisi artık eşit değil).

Bu C imzalı bir fonksiyondur _Bool dennis_like(size_t ecx, const char *esi). Çağıran kural biraz standart dışıdır, MS vectorcall / fastcall'a yakındır, fakat farklı argüman kayıtlıdır: ESI'de dize ve ECX'de uzunluk. Sadece arg-reg'lerini ve EDX'ini engelliyor. AL, çöpleri tutan yüksek baytlarla (SysV x86 ve x32 ABI'lerin izin verdiği gibi) geri dönüş değerini tutar. IDK, MS'in ABI'lerinin bool veya dar tamsayılar döndürürken yüksek çöp hakkında söylediklerini belirtir.)


Algoritmanın açıklaması :

Girdi dizgisini gezdirin, yığında bir boolean dizisine filtreleyin ve sınıflandırın: Her bayt için, alfabetik bir karakter olup olmadığını kontrol edin (değilse, sonraki karaktere devam edin) ve onu 0-25 (AZ) arasında bir tam sayıya dönüştürün . Ünlü bir bit eşlemini kontrol etmek için bu 0-25 tamsayısını kullanın = 0 / ünsüz = 1. (Bitmap, 32 bitlik bir anlık sabit olarak bir kayıt defterine yüklenir). Bitmap sonucuna göre yığının üstüne 0 veya 0xFF (aslında en üstteki 3 baytta çöp olabilecek 32 bitlik bir öğenin düşük baytında) itin.

İlk döngü 0 veya 0xFF dizisi oluşturur (dword öğelerinde çöple doldurulmuş). Normal palindromu, işaretçiler ortasından geçtiğinde duran (ya da tek sayıda alfabetik karakter varsa, ikisi de aynı öğeye işaret ettiğinde) duran ikinci bir döngü ile kontrol edin. Yukarı doğru hareket eden işaretçi yığın işaretçisidir ve + artışını yüklemek için POP kullanıyoruz. Bu döngüdeki compare / setcc yerine, yalnızca iki olası değer olduğundan XOR'u aynı / farklı algılamak için kullanabiliriz. Eşleşmeyen herhangi bir öğe bulup bulamadığımızı (OR ile) biriktirebiliriz, ancak XOR tarafından belirlenen bayrakların ilk çıkardığı dal en azından iyidir.

İkinci döngünün byteişlemsel boyut kullandığına dikkat edin , bu nedenle ilk döngünün her bir dizi öğesinin düşük baytının dışında ne kadar çöp bıraktığını önemsemez.


Belgelendirilmemiş salctalimatı , AL'yi CF'den ayarlamak için olduğu gibi kullanır sbb al,al. Her Intel işlemcisinde (64 bit modu hariç), Knight's Landing! Agner Fog bunun için tüm AMD işlemcilerinde (Ryzen dahil) zamanlamaları listeliyor , bu nedenle x86 satıcıları 8086'dan beri bu opcode alan baytını bağlamakta ısrar ediyorlarsa, bundan faydalanabiliriz.

İlginç püf noktaları:

  • birleştirilmiş isalpha () ve toupper () için işaretsiz karşılaştırmalı hile ve sıfır, baytı doldurmak için baytı doldurarak aşağıdakileri ayarlar:
  • bir kayıt anında bitmap bt, bazı güzel derleyici çıkışı esinlenerekswitch .
  • Bir döngü içinde push ile istif üzerinde değişken boyutlu bir dizi oluşturma. (Asm için standart, ancak kapalı uzunluklu dize sürümü için C ile yapabileceğiniz bir şey değil). Her giriş karakteri için 4 bayt yığın alanı kullanır, ancak en az 1 bayttan daha fazla golf oynamayı önler stosb.
  • Boolean dizisindeki cmp / setne yerine, XOR doğrudan bir doğruluk değeri elde etmek için bir araya gelir. ( cmp/ salcbir seçenek değildir, çünkü salcyalnızca CF için çalışır ve 0xFF-0 CF ayarlamaz. sete3 bayttır, ancak inc2 bayt net bir ücret karşılığında döngünün dışından kaçınır (64 bit modunda 1) )) vs. xor ve döngüde inc ile sabitleme.
; explicit-length version: input string in ESI, byte count in ECX
08048060 <dennis_like>:
 8048060:       55                      push   ebp
 8048061:       89 e5                   mov    ebp,esp  ; a stack frame lets us restore esp with LEAVE (1B)
 8048063:       ba ee be ef 03          mov    edx,0x3efbeee ; consonant bitmap

08048068 <dennis_like.filter_loop>:
 8048068:       ac                      lods   al,BYTE PTR ds:[esi]
 8048069:       24 5f                   and    al,0x5f    ; uppercase
 804806b:       2c 41                   sub    al,0x41    ; range-shift to 0..25
 804806d:       3c 19                   cmp    al,0x19    ; reject non-letters
 804806f:       77 05                   ja     8048076 <dennis_like.non_alpha>
 8048071:       0f a3 c2                bt     edx,eax    # AL = 0..25 = position in alphabet
 8048074:       d6                      SALC     ; set AL=0 or 0xFF from carry.  Undocumented insn, but widely supported
 8048075:       50                      push   eax
08048076 <dennis_like.non_alpha>:
 8048076:       e2 f0                   loop   8048068 <dennis_like.filter_loop>   # ecx = remaining string bytes
 ; end of first loop

 8048078:       89 ee                   mov    esi,ebp  ; ebp = one-past-the-top of the bool array
0804807a <dennis_like.palindrome_loop>:
 804807a:       58                      pop    eax      ; read from the bottom
 804807b:       83 ee 04                sub    esi,0x4
 804807e:       32 06                   xor    al,BYTE PTR [esi]
 8048080:       75 04                   jne    8048086 <dennis_like.non_palindrome>
 8048082:       39 e6                   cmp    esi,esp             ; until the pointers meet or cross in the middle
 8048084:       77 f4                   ja     804807a  <dennis_like.palindrome_loop>

08048086 <dennis_like.non_palindrome>:
 ; jump or fall-through to here with al holding an inverted boolean
 8048086:       40                      inc    eax
 8048087:       c9                      leave  
 8048088:       c3                      ret    
;; 0x89 - 0x60 = 41 bytes

Bu muhtemelen aynı zamanda en hızlı cevaplardan biridir, çünkü golf oynamaların hiçbiri gerçekten çok fazla acı vermez, en azından 4x bellek kullanımının çok fazla önbellek kaybına neden olmadığı birkaç bin karakterin altındaki karakter dizileri için. (Ayrıca, tüm karakterlerin üzerinden geçmeden önce Dennis'e benzeyen dizgiler için erken çıkış yapan cevapları kaybedebilir.) Birçok CPU'dan salcdaha yavaş setcc(örneğin Skylake'de 1 veya 3); bt/salchala bir dize arama veya regex maçtan daha hızlı. Ve ek yükü yok, bu yüzden kısa dizeleri için son derece ucuz.

Anında bir geçişle yapmak, yukarı ve aşağı yönler için sınıflandırma kodunu tekrarlamak anlamına gelir. Bu daha hızlı ancak daha büyük kod boyutunda olurdu. (Elbette hızlı istiyorsanız, SSE2 veya AVX2 ile bir seferde 16 veya 32 karakter yapabilirsiniz, yine de hile işaretli aralığın altına geçerek karşılaştırma hilesini kullanabilirsiniz).


Bu işlevi bir cmdline argümanıyla çağırmak için programı (ia32 veya x32 Linux için) test edin ve status = return değeriyle çıkın. int80h.org'danstrlen uygulama .

; build with the same %define macros as the source below (so this uses 32-bit regs in 32-bit mode)
global _start
_start:
    ;%define PTRSIZE 4   ; true for x32 and 32-bit mode.

    mov  esi, [rsp+4 + 4*1]  ; esi = argv[1]
    ;mov  rsi, [rsp+8 + 8*1]  ; rsi = argv[1]   ; For regular x86-64 (not x32)

%if IMPLICIT_LENGTH == 0
        ; strlen(esi)
         mov     rdi, rsi
         mov     rcx, -1
        xor     eax, eax
        repne scasb    ; rcx = -strlen - 2
        not     rcx
        dec     rcx
%endif

    mov  eax, 0xFFFFAEBB   ; make sure the function works with garbage in EAX
    call dennis_like

    ;; use the 32-bit ABI _exit syscall, even in x32 code for simplicity
    mov ebx, eax
    mov eax, 1
    int 0x80           ; _exit( dennis_like(argv[1]) )

    ;; movzx edi, al   ; actually mov edi,eax is fine here, too
    ;; mov eax,231     ; 64-bit ABI exit_group( same thing )
    ;; syscall

Bu işlevin 64 bit sürümü, sbb eax,eaxbunun yerine 3 yerine yalnızca 2 bayt olan kullanılabilir setc al. Aynı zamanda decya notda sonunda fazladan bir bayta ihtiyaç duyacaktır (çünkü sadece 32-bit 1 bayt inc / dec r32'ye sahiptir). X32 ABI (uzun modda 32 bit işaretçiler) kullanarak, işaretçileri kopyalayıp karşılaştırsak bile REX öneklerinden kaçınabiliriz.

setc [rdi]doğrudan belleğe yazabilir, ancak ECX byte yığın alanını saklamak, kaydettiğinden daha fazla kod boyutundadır. (Çıktı dizisinde ilerlememiz gerekiyor. [rdi+rcx]Adresleme modu için bir bayt daha alıyor, ancak gerçekten filtrelenmiş karakterler için güncelleme yapmayan bir sayaca ihtiyacımız var, bu yüzden bundan daha kötü olacak.)


Bu, koşullu YASM / NASM kaynağıdır %if. Bu inşa edilebilir -felf32(32-bit kod) veya -felfx32(x32 ABI'lı 64 bit kod) ve örtülü veya açık uzunluğu . 4 sürümü de test ettim. NASM / YASM kaynağından statik bir ikili oluşturmak için bir komut dosyası için bu cevaba bakın .

64 bit sürümünü x32 ABI desteği olmayan bir makinede test etmek için işaretçi reglerini 64 bit olarak değiştirebilirsiniz. (Ardından, REX.W = 1 öneklerinin sayısını (0x48 bytes) sayıdan çıkarın. Bu durumda, 4 komutun 64-bit regs üzerinde çalışması için REX önekleri gerekir). Ya da sadece rsp4G adres boşluğundaki ve ile giriş işaretçisini arayın .

%define IMPLICIT_LENGTH 0

; This source can be built as x32, or as plain old 32-bit mode
; x32 needs to push 64-bit regs, and using them in addressing modes avoids address-size prefixes
; 32-bit code needs to use the 32-bit names everywhere

;%if __BITS__ != 32   ; NASM-only
%ifidn __OUTPUT_FORMAT__, elfx32
%define CPUMODE 64
%define STACKWIDTH 8    ; push / pop 8 bytes
%else
%define CPUMODE 32
%define STACKWIDTH 4    ; push / pop 4 bytes
%define rax eax
%define rcx ecx
%define rsi esi
%define rdi edi
%define rbp ebp
%define rsp esp
%endif

    ; A regular x86-64 version needs 4 REX prefixes to handle 64-bit pointers
    ; I haven't cluttered the source with that, but I guess stuff like %define ebp rbp  would do the trick.


    ;; Calling convention similar to SysV x32, or to MS vectorcall, but with different arg regs
    ;; _Bool dennis_like_implicit(const char *esi)
    ;; _Bool dennis_like_explicit(size_t ecx, const char *esi)
global dennis_like
dennis_like:
    ; We want to restore esp later, so make a stack frame for LEAVE
    push  rbp
    mov   ebp, esp   ; enter 0,0 is 4 bytes.  Only saves bytes if we had a fixed-size allocation to do.

    ;         ZYXWVUTSRQPONMLKJIHGFEDCBA
    mov  edx, 11111011111011111011101110b   ; consonant/vowel bitmap for use with bt

;;; assume that len >= 1
%if IMPLICIT_LENGTH
    lodsb   ; pipelining the loop is 1B shorter than  jmp .non_alpha
.filter_loop:
%else
.filter_loop:
    lodsb
%endif

    and   al, 0x7F ^ 0x20  ; force ASCII to uppercase.
    sub   al, 'A'          ; range-shift to 'A' = 0
    cmp   al, 'Z'-'A'      ; if al was less than 'A', it will be a large unsigned number
    ja  .non_alpha
    ;; AL = position in alphabet (0-25)

    bt    edx, eax              ; 3B
%if CPUMODE == 32
    salc                        ; 1B   only sets AL = 0 or 0xFF.  Not available in 64-bit mode
%else
    sbb   eax, eax              ; 2B   eax = 0 or -1, according to CF.
%endif
    push  rax

.non_alpha:
%if IMPLICIT_LENGTH
    lodsb
    test   al,al
    jnz .filter_loop
%else
    loop .filter_loop
%endif
    ; al = potentially garbage if the last char was non-alpha
    ; esp = bottom of bool array

    mov   esi, ebp  ; ebp = one-past-the-top of the bool array
.palindrome_loop:
    pop   rax

    sub   esi, STACKWIDTH
    xor   al, [rsi]   ; al = (arr[up] != arr[--down]).  8-bit operand-size so flags are set from the non-garbage
    jnz .non_palindrome

    cmp   esi, esp
    ja .palindrome_loop

.non_palindrome:  ; we jump here with al=1 if we found a difference, or drop out of the loop with al=0 for no diff
    inc   eax     ;; AL transforms 0 -> 1  or  0xFF -> 0.
    leave
    ret           ; return value in AL.  high bytes of EAX are allowed to contain garbage.

Df (kontrol yönü bayrağı ile karıştırmasını baktı lodsd/ scasdböyle devam eder), ama sadece bir kazan olarak görünmüyordu. Her zamanki ABI'ler, DF'nin işlev girişi ve çıkışı sırasında temizlenmesini gerektirir. Girişte silinmiş kabul edilir, ancak çıkışta ayarlanmış bırakılmak, hile yapmak IMO olacaktır. 3-bayttan kaçınmak için LODSD / SCASD kullanmak sub esi, 4, özellikle de yüksek çöp bulunmadığı durumlarda kullanmak iyi olurdu .


Alternatif bitmap stratejisi (x86-64 tam uzunlukta dizeler için)

Görünüşe göre, bu herhangi bir bayt tasarruf etmiyor, çünkü bt r32,r32hala bit indeksinde yüksek çöplerle çalışıyor. Sadece bu şekilde belgelenmemiş shr.

Bitin bt / sbbCF'ye girip çıkması yerine , bitmap'ten istediğimiz bit'i izole etmek için bir shift / mask kullanın.

%if IMPLICIT_LENGTH && CPUMODE == 64
    ; incompatible with LOOP for explicit-length, both need ECX.  In that case, bt/sbb is best
    xchg  eax, ecx
    mov   eax, 11111011111011111011101110b   ; not hoisted out of the loop
    shr   eax, cl
    and   al, 1
%else
    bt    edx, eax
    sbb   eax, eax
%endif
    push  rax

Bu, sonunda AL'de 0/1 ürettiğinden (0 / 0xFF yerine), fonksiyonun sonunda xor al, 1(2B) yerine (x86-64'te 2B) yerine dönüş değerinin gerekli inversiyonunu yapabiliriz dec eax. Yine de uygun bool/_Bool dönüş değeri üretir .

Bu, EAX'in yüksek baytlarını sıfırlamaktan kaçınmak suretiyle, örtük uzunlukta dizelerle x86-64 için 1B tasarruf etmek için kullanılır. ( and eax, 0x7F ^ 0x203-byte ile eax geri kalanını büyük-küçük harf zorlamak ve sıfırlamak için and r32,imm8kullanıyordum. Ama şimdi yaptığım gibi, 8086 komutlarının çoğunda olduğu gibi 2-by-AL kodlu hemen kullanıyorum. için subve cmp.)

32 bit modunda bt/ salcmodunda kaybeder ve açık uzunluklu dizelerin sayım için ECX'e ihtiyacı vardır, bu nedenle orada da çalışmaz.

Ama sonra yanıldığımı farkettim: bt edx, eaxhala eax'ta yüksek çöplerle çalışıyor. Görünüşe maskeleri vardiya saymak aynı şekilde shr r32, clyok (cl düşük 5 bit sadece bakarak). Bu, bt [mem], regadresleme modu / büyüklüğü tarafından başvurulan belleğin dışına erişerek, onu bir bit karesi olarak algılayandan farklıdır . (Çılgın CISC ...)

Intel'in ayarlanan ref el kitabı maskelemeyi belgelemiyor, bu yüzden belki de Intel'in koruduğu belgelenmemiş davranış. (Bu tip şeyler nadir değildir. bsf dst, srcSrc = 0 daima dst değiştirilmemiş bırakır ile, söz konusu durumda tanımlanmamış bir değer tutan dst bırakmak belgelenir bile. AMD aslında src = 0 davranışını belgeler.) Ben Skylake ve Core2 üzerinde test, ve btsürüm, EAX’de AL dışındaki sıfır olmayan çöplerle çalışır.

Burada düzgün bir numara, xchg eax,ecxCL'yi saymak için (1 byte) kullanıyor . Ne yazık ki, BMI2 shrx eax, edx, eax5 byte, sadece 2 byte shr eax, cl. Kullanımı bextr2 bayt mov ah,1(ayıklanacak bit sayısı için) gerektirir, bu yüzden yine SHRX + AND gibi 5 + 2 bayttır.


Kaynak kodu %ifkoşullu ekledikten sonra oldukça karışık olmuştur . İşte x32 örtük uzunlukta dizgelerin (bitmap için alternatif bir strateji kullanarak, bu yüzden hala 46 bayt) sökülmesi .

Açık uzunluklu sürümden temel fark ilk döngüdedir. lodsDöngünün en üstünde bir tane yerine ondan önce ve en altında nasıl olduğuna dikkat edin .

    ; 64-bit implicit-length version using the alternate bitmap strategy
    00400060 <dennis_like>:
      400060:       55                      push   rbp
      400061:       89 e5                   mov    ebp,esp
      400063:       ac                      lods   al,BYTE PTR ds:[rsi]

    00400064 <dennis_like.filter_loop>:
      400064:       24 5f                   and    al,0x5f
      400066:       2c 41                   sub    al,0x41
      400068:       3c 19                   cmp    al,0x19
      40006a:       77 0b                   ja     400077 <dennis_like.non_alpha>
      40006c:       91                      xchg   ecx,eax
      40006d:       b8 ee be ef 03          mov    eax,0x3efbeee  ; inside the loop since SHR destroys it
      400072:       d3 e8                   shr    eax,cl
      400074:       24 01                   and    al,0x1
      400076:       50                      push   rax
    00400077 <dennis_like.non_alpha>:
      400077:       ac                      lods   al,BYTE PTR ds:[rsi]
      400078:       84 c0                   test   al,al
      40007a:       75 e8                   jne    400064 <dennis_like.filter_loop>

      40007c:       89 ee                   mov    esi,ebp
    0040007e <dennis_like.palindrome_loop>:
      40007e:       58                      pop    rax
      40007f:       83 ee 08                sub    esi,0x8
      400082:       32 06                   xor    al,BYTE PTR [rsi]
      400084:       75 04                   jne    40008a <dennis_like.non_palindrome>
      400086:       39 e6                   cmp    esi,esp
      400088:       77 f4                   ja     40007e <dennis_like.palindrome_loop>

    0040008a <dennis_like.non_palindrome>:
      40008a:       ff c8                   dec    eax  ; invert the 0 / non-zero status of AL.  xor al,1 works too, and produces a proper bool.
      40008c:       c9                      leave  
      40008d:       c3                      ret    

   0x8e - 0x60 = 0x2e = 46 bytes

8

retina ,49 47 45 bayt

\P{L}

i`[aeiou]
1
\D
2
+`^(.)(.*)\1$
$2
^.?$

Çevrimiçi deneyin!

Neil sayesinde 2 bayt kaydedildi.

Martin sayesinde 2 bayt daha kaydedildi.

Harfleri kaldırır, ardından tutarlı değerleri elde etmek için ünlü harfleri 1 ve ünsüz harfleri 2 ile değiştirir. Sonra, aynıysa, ilk ve son karakteri tekrar tekrar kaldırır. Bir kez olmadıklarında, bir veya sıfır karakter kalıyorsa kelime simetriktir.


\D 2Seni bir kaç bayttan kurtarmak için çalışıyor mu T`lL`2?
Neil,

@Neil Evet, güzel gözüküyor!
FryAmTheEggman

Aferin. Bunu yapmaya çalışıyordum :(
Christopher

7

PHP, 82 Bayt

<?=strrev($s=preg_replace(["#[^a-z]#i","#[aeiou]#i","#\pL#"],["",0,1],$argn))==$s;

Çevrimiçi deneyin!


Yazma işlemini hazırlayabilir (bool)ve 1 bayt kaydetmek için $s=ve ==$sişaretini kaldırabilirsiniz .
kaiser

Yanılmıyorsam, yanlış söylemek için veya yerine 3 ek bayt kaydederek (bool)ile değiştirebilirsiniz . 0||
kaiser

Hm. Kullanmak Could \wiçin kelime yerine karakterler a-z?
kaiser

@kaiser \w, rakamların altını ve harflerini içerir. Bu işe yaramayacak ve artı i [^/p{L}]kadar uzundur [^a-z]. Ters diziyi dizeyle karşılaştırdım, bu yüzden $sboole oluşturmak için gerekli
Jörg Hülsermann

Bu doğru. Yine de diğerleri çalışmalı. "Olmalı"… yapıyorlar.
kaiser

6

MATL, 14 bayt

t3Y2m)13Y2mtP=

MATL Online'da deneyin .

İşte tüm test durumlarını kontrol etmek için biraz değiştirilmiş bir versiyonudur.

açıklama

        % Implicitly grab the input as a string
        %     STACK: {'Martin Ender'}
t       % Duplicate the input
        %     STACK: {'Martin Ender', 'Martin Ender'}
3Y2     % Push the string 'ABC...XYZabc...xyz'
        %     STACK: {'Martin Ender', 'Martin Ender', 'ABC...XYZabc...xyz'}
m       % Find which characters of the input are letters using this string
        %     STACK: {'Martin Ender', [1 1 1 1 1 1 0 1 1 1 1]}
)       % Use this boolean array to select only the letters
        %     STACK: {'MartinEnder'}
13Y2    % Push the string literal 'aeiouAEIOU' to the stack
        %     STACK: {'MartinEnder', 'aeiouAEIOU'}
m       % Check for membership of each letter of the input in this string.
        %     STACK: {[0 1 0 0 1 0 1 0 0 1 0]}
tP      % Create a reversed copy
        %     STACK: {[0 1 0 0 1 0 1 0 0 1 0], [0 1 0 0 1 0 1 0 0 1 0]}
=       % Perform an element-wise comparison yielding a truthy (all 1's) or 
        % falsey (any 0's) result
        %     STACK: {[1 1 1 1 1 1 1 1 1 1 1]}
        % Implicitly display the result

"Dennis" yerine "Martin Ender" ile mi gösterdin? Yine meydan okuma başlığına bakmak zorundayım.
Roman Gräf

1
Muhtemelen Suever, ilk adımda bir miktar filtreleme olan bir gösteri istedi.
Greg Martin,

O zaman "Alex A." kullanmalı. bunun yerine bir de dönemi var.
Outgolfer Erik

2
Sorunun ne olduğu kafam karıştı. Martin Ender'i seçtim, çünkü boşlukları kaldırır ve aksi takdirde false yaparsanız doğru olur. Ayrıca tüm test vakalarına bir link de
ekledim

6

Haskell, 84 75 74 69 bayt

-10 @nimi
sayesinde -5 @Zgarb sayesinde

f x=(==)<*>reverse$[elem c"aeiouAEIOU"|c<-x,'@'<c,c<'{','`'<c||c<'[']

Liste anlama her harfi bir boolean ile değiştirir ve diğer tüm karakterleri siler. İlk bölüm, sonuç listesinin bir palindrom olup olmadığını kontrol eder.

Çevrimiçi deneyin!


İki ipucu: 1) Liste anlama, çoğu kez poitfree olmayan bir gruba geçmek zorunda olsanız bile filtertakip edilenden daha kısa mapolur. 2) <$>idGereksiz. f x=(==)<*>reverse$[elem c"aeiouAEIOU"|c<-x,celem ['A'..'Z']++['a'..'z']].
nimi

Bir bayt arasındaki cve arasındaki boşluğu bırakabilirsiniz ".
nimi

1
Sanırım c`elem`['A'..'Z']++['a'..'z']kısaltılabilir'@'<c,c<'{','`'<c||c<'['
Zgarb


4

Brachylog , 13 bayt

ḷ{∈Ṿg|∈Ḅg}ˢ.↔

Çevrimiçi deneyin!

açıklama

ḷ                Lowercase the input
 {       }ˢ.     Select each char if:
  ∈Ṿg              it's a vowel, and replace it with ["aeiou"]            
     |             Or
      ∈Ḅg          it's a consonant, and replace it with ["bcdfghjklkmnpqrstvwxyz"]
           .↔    The resulting list is a palindrome

3

Alice , 28 bayt

/uia.QN."-e@
\1"lyuy.Ra$i1/o

Çevrimiçi deneyin!

Çıkışlar 1truthy ve falsy olarak hiçbir şey.

açıklama

Bu programdaki her komut sıralı modda çalışır, ancak şablonda bir bayt kaydetmeme izin veren hafif bir bükülme ile çalışır. Eğer bir yeni satır kabul edilebilir bir gerçek değerse, aynı yöntemle bir bayt daha tasarruf edebilirim.

Doğrusallaştırılmış program aşağıdaki gibidir:

1il.uN."aei ou"ayQy.R-$@1o1@

1                           % Append "1" to top of stack
                            % STACK: ["1"]
 i                          % Push input to stack
                            % STACK: ["1", "Dennis"]
  l                         % Convert to lowercase
                            % STACK: ["1", "dennis"]
   .                        % Duplicate
                            % STACK: ["1", "dennis", "dennis"]
    u                       % Convert to uppercase
                            % STACK: ["1", "dennis", "DENNIS"]
     N                      % Take multiset difference; this removes all non-alphabetic characters
                            % STACK: ["1", "dennis"]
      .                     % Duplicate
                            % STACK: ["1", "dennis", "dennis"]
       "aei ou"             % Push "aei ou"
                            % STACK: ["1", "dennis", "dennis", "aei ou"]
              a             % Push newline
                            % STACK: ["1", "dennis", "dennis", "aeiou", "\n"]
               y            % Transliterate: replace all vowels with newlines
                            % STACK: ["1", "dennis", "d\nnn\ns"]
                Q           % Reverse stack
                            % STACK: ["d\nnn\ns", "dennis", "1"]
                 y          % Transliterate: replace remaining characters with "1"
                            % STACK: ["1\n11\n1"]
                  .         % Duplicate
                            % STACK: ["1\n11\n1", "1\n11\n1"]
                   R        % Reverse top of stack
                            % STACK: ["1\n11\n1", "1\n11\n1"]
                    -       % Remove occurrences: for same-length strings, result is "" iff strings are equal.
                            % STACK: [""]
                     $      % Pop stack, and skip next command if ""
                      @     % Terminate (skipped if c/v pattern is palindromic)
                       1o   % Output "1"
                         1  % Push "1" (useless)
                          @ % Terminate

3

Python 3 , 72 71 bayt

@Ovs sayesinde -1 bayt

def f(s):s=[c in'AEIOU'for c in s.upper()if'@'<c<'['];return s==s[::-1]

Çevrimiçi deneyin!


def f(s):s=[c in'AEIOU'for c in s.upper()if'@'<c<'['];return s==s[::-1]71 bayt için
ovs

3

JavaScript (ES6), 72 69 bayt

Neil sayesinde 3 bayt kurtardı

Bir boole döndürür.

s=>(a=s.match(/[a-z]/gi).map(c=>!/[aeiou]/i.exec(c)))+''==a.reverse()

Test durumları


2 boş dizgiyi değiştirerek birkaç bayttan tasarruf edin 2.
Shaggy

1
+''Sonuna bile ihtiyacınız var mı? Bunun yerine 3 bayt kurtarır.
Neil,

@ Neil'in fikrini daha çok seviyorum!
Shaggy,

2

Mathematica, 113 bayt

PalindromeQ@StringCases[StringReplace[#,{Characters["aeiouAEIOU"]->"1",CharacterRange["A","z"]->"0"}],{"0","1"}]&

Birkaç bayttan kurtulabilirsiniz:PalindromeQ@StringReplace[#,{Characters@"aeiouAEIOU"->"1",LetterCharacter->"0",_->""}]&
Ağaç değil

2

GolfScript , 42 bayt

{123,65>.26>6<-?)},{"AEIOUaeiou"?)!}%.-1%=

Çevrimiçi deneyin!

Zor kısım, büyük ve küçük harfleri bir dizgede oluşturuyor, harfleri girdiden filtrelemek için bir filtre işlevinde kullanacağız. Neyse ki, GolfScript'teki dizgiler özel bir özelliğe sahip kod noktası dizileri olduğundan, kod noktaları yalnızca verimli bir şekilde oluşturabiliriz. İşte onları nasıl üretiyoruz:

İlk önce, 122 için kod noktası olan menzil [0..122] üretiyoruz z. Daha sonra, elementi elementten 65 indeksinde alırız. 65 için kod noktasıdır A. Şu an elimizde [65..122]. Tamam, orada istenmeyen bazı kod noktalarımız ([91..96]) dışında. Böylece, önce bu aralığın bir kopyasını çıkarırız. Sonra, 26 nolu indeksten gelen elementleri alıyoruz ve [91..122]. Ondan sonra, indeks 5'e kadar olan elementleri elde ederiz. Şimdi elimizde [91..96]. Sonunda, bu unsurları [65..122] 'den kaldırıyoruz, bizi wil [65..90, 97..122] bırakıyoruz. Bunlar istediğimiz kod noktaları.

Şimdi üst / alt alfabe kod noktası listesini yaptıktan sonra filtreleme fonksiyonumuza devam ediyoruz. İşlev, başlangıçta söylediğim gibi onun yerine kod noktası olarak ayrıştırılan giriş dizesindeki her karakterle eşlenir. Yani şimdi aslında biz var [codepoint, [65..90, 97..122]]. Char'in codepointbir harf olup olmadığını anlamak için, yaptığımız listenin dizinine giriyoruz. Eğer orada değilse, -1bunun yerine indeks olarak alacağız .

Şu anda, yalnızca codepoint == 65listenin ilk dizini, yani dizinin 0 olması durumunda falsey değeri elde ediyoruz, ancak tek bir artış bu sorunu çözecek ve şimdi de codepointlistemizdeyse, her zaman pozitif bir sayı olan + 1 indeksini alın, dolayısıyla her zaman truthy olur, eğer orada değilse -1 + 1 = 0, yani falsey elde ederiz.

Sonunda, girdiğim her karaktere tanımladığım işlevi uyguluyoruz ve sadece fonksiyonun bir gerçeği döndürdüğü karakterleri alıyoruz.

Daha sonra her karakterin bir ünlü veya ünsüz olup olmadığını belirlememiz gerekir. Ünlüler ünsüzlerden daha az olduğu için, bu durumu kontrol etmemiz için bir ünsüz dizisi oluşturmak, bir ünsüz dizisi oluşturmaktan daha kısa olduğundan, her karakterin ünlü olup olmadığını kontrol ederiz. Ancak, boolean listesinin palindromik olup olmadığını kontrol etmek için, sadece + 1 indeksini alarak alamadığımız boolerlere ihtiyacımız var, çünkü eğer karakter bir ünlü ise herhangi bir sayıdaki [1..10] ile sonuçlanabilir. Ve çoğu golf dilinde olduğu gibi, bunun da bir boolişlevi yoktur. Bu yüzden, basitçe kullanırız not not x, çünkü notdaima bir boole döndürür. Fakat bekle; Gerçekten de belirli boole'lara ihtiyacımız var mı? Yana nothep bir boolean döndüren, neden ikinci çıkarmayınnotve aslında her karakterin ünsüz olup olmadığını kontrol edin. Evet, tam olarak yapacağımız şey bu!

Bir boolean listesi döndüren kontrolden sonra, sahip olduğumuz bu boolean listesinin bir palindrom olup olmadığını kontrol ediyoruz, bu da bu zorluğun yapmamızı istediği şeydir. Bir palindromun tanımı nedir? Evet, bir palindrome, tersine eşit bir liste veya dizedir. Peki nasıl kontrol ederiz? Basit, kopyalarız, geri alırız ve orijinal listesine bakarız. Aldığımız sonuç olduğunu nihayet bizim kod dönmelidir ne.


1
42 baytlık bir program için dev açıklama. Şimdi sanırım oldukça açıklayıcı bir durum ...
Outgolfer Erik,

2

PHP , 87 bayt

Regex ücretsiz PHP versiyonu. Stripos PHP'de yanlış olan 0 döndürdüğü için bir "ünlü" eklendi.

Jörg tarafından belirlenen kusur.

for(;a&$c=$argn[$p++];)!ctype_alpha($c)?:$s.=stripos(_aeiou,$c)?0:1;echo$s==strrev($s);

Çevrimiçi deneyin!


Aynı bayt sayısı. for(;a&$c=$argn[$p++];)ctype_alpha($c)?$s.=stripos(_aeiou,$c)?0:1:0;echo$s==strrev($s);fakat sıfır içeren karakter dizileri için doğru sonucu
alıyoruz

@ JörgHülsermann Teşekkürler.
ME,

2

q / kdb +, 42 38 bayt

Çözüm:

{x~|:[x]}{inter[x;.Q.a]in"aeiou"}lower

Örnek:

q){x~|:[x]}{inter[x;.Q.a]in"aeiou"}lower"Dennis"
1b
q){x~|:[x]}{inter[x;.Q.a]in"aeiou"}lower"Adam"
0b
q){x~|:[x]}{inter[x;.Q.a]in"aeiou"}lower"Alex A."
1b

Açıklama:

lower        // converts argument on the right to lowercase
.Q.a         // lowercase alphabet "abc..xyz"
inter[x;y]   // intersection of x and y (thus only return a-z)
x in "aeiou" // returns boolean list whether x is a vowel; "dennis" = 010010b
|:           // k shorthand for 'reverse'

Düzenlemeler:

  • -4 bayt; reversek eşdeğeri için anahtarlama|:

2

CJam , 26 bayt

lel_'{,97>--"aeiou"fe=_W%=

Çevrimiçi deneyin!

-1 Esolanging Fruit'e teşekkürler .


Bir bayt kaydetmek için 26,'af+ile değiştirebilirsiniz '{,97>.
Esolanging Fruit

@EsolangingFruit gibi eski bir cevap ...
Outgolfer Erik

Yarım yıl önce kaydedilen bir bayt, şimdi kaydedilen bir bayttan farklı değil. Bayt enflasyonu falan yok gibi değil: P
Esolanging Meyve

@EsolangingFruit Golf ile ilgili sürekli gelişen deneyimimden bahsediyordum ... tabii ki her zamanki gibi bir kredi kazandınız, endişelenmeyin!
Outgolfer Erik,

2

Braingolf,  4  3 bayt

&JP

-1 The Outgolfer sayesinde bayt

PBu zorluktan önce bile başından beri yaşadığım ortaya çıktı .

J ancak, bu mücadeleden önce yaratılmış olmasına rağmen, mücadeleden önce github'a itilmemiştir, bu yüzden hala rekabet etmemektedir.

Açıklama:

&JP  Implicit input, push ASCII value of each char in string to stack
&J   Replace each item in stack with 1 if vowel, otherwise 0
  P  Pop entire stack, push 1 if stack is palindromic, 0 otherwise
     Implicit output of last item on stack

Neden Gereklidir n?
Outgolfer Erik,

@EriktheOutgolfer çünkü sertifikalı bir
moronum

Hmm, açıklamadan çıkarmayı unuttun.
Outgolfer Erik, 15: 39'da

@EriktheOutgolfer "Erick" yazacaktım, sonra c'ye saldırdım, ama sadece "Eriek" gibi görünüyor
Skidsdev

Bu beğeniler için başarısız olmaz Alex A.mı?
Shaggy,

1

Python 2, 83 bayt

def f(x):k=map(lambda y:y.lower()in"aeiou",filter(str.isalpha,x));return k==k[::-1]

Veren Trueveya veren bir işlevi tanımlar.False


Sen kullanarak 2 bayt kaydedebilirsiniz "aeiouAEIOU".__contains__yerine lambda y:y.lower()in"aeiou".
Blender




1

Bash , 82 bayt

i=${1//[^a-zA-Z]};a=aeouiAEOUI;b=${i//[$a]/0};c=${b//[!0$a]/1};[ $c = `rev<<<$c` ]

Çevrimiçi deneyin!

Parametre olarak isimleri alır, harfleri çıkarmaz, ünlü harfleri 0, ünlü olmayanlar veya 0 ile 1 ile değiştirir ve aynı tersi ile karşılaştırır.

Eğer iki ya da üçlü ikame çalışması yapabilirsem biraz daha golf oynayabilir miyim

Çıkış durumu true için 0, hayır için 1'dir.


Son bash sürümlerinde, büyük harfe i=${i^^*};dönüştürür i. Ama bence sadece seni a-zve birisini kurtarıyor aeiou, ki bu da 10B'den daha düşük.
Peter Cordes

1

Japt v2.0a0, 19 11 bayt

k\L mè\v ê¬

Çevrimiçi deneyin


açıklama

        :Implicit input of string U.
 k\L    :Remove all non-letter characters from U.
 m      :Map over resulting string, replacing each character ...
 è\v    :with the count of the number of vowels in each single character substring.
 ê¬     :Is the above a palindrome?
        :Implicit output of boolean result.


0

PowerShell, 108 bayt

read-host|%{[char[]]$_|%{$d=$_-replace'\P{L}'-replace'[aeiou]',0-replace'\D',1;$s="$s$d";$r="$d$r"};$s-eq$r}

0

Aksiyom, 126 bayt

g(x)==~member?(x,alphabetic());v(s:String):Boolean==(w:=remove(g,s);a:=[member?(w.r,"aeiouAEIOU")for r in 1..#w];a=reverse(a))

Ölçek

(8) -> [[i,v(i)] for i in ["Dennis", "Martin", "Martin Ender", "Alex", "Alex A.", "Doorknob", "Mego"]]
   (8)
   [["Dennis",true], ["Martin",true], ["Martin Ender",true], ["Alex",false],
    ["Alex A.",true], ["Doorknob",false], ["Mego",false]]
                                                      Type: List List Any

0

Pyke, 12 bayt

#B)l1~-L{D_q

Burada dene!

#B)          -    filter(is_alpha, input)
   l1        -   ^.lower()
     ~-L{    -  ^ - "bcdfghjklmnpqrstvwxyz"
         D_q - ^ == reversed(^)

0

PowerShell, 87 Bayt

$s=("$args"-replace '\P{L}'-replace'[aeiou]',0-replace'\D',1);$s-eq(-join($s[-1..-99]))

Ünlü harflerin 0 ve ünsüzlerin 1 olduğu dizgenin bir kopyasını alın, tüm özel karakterler silindiğinde, bu dizgiyi dizgeye geri eklenen ters bir sürümle karşılaştırın

Çıktı:

PS C:\Users\Connor> "Dennis","Martin","Martin Ender","Alex","Alex A.","Doorknob","Mego" | % {
    $s=("$_"-replace '\P{L}'-replace'[aeiou]',0-replace'\D',1);$s-eq(-join($s[-1..-99]))
}
True
True
True
False
True
False
False

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.