ความชื่นชมจากผู้ใช้ # 1: เดนนิส♦


53

ฉันมีความคิดที่เกิดขึ้นเองในการสร้างชุดของความท้าทายของผู้ใช้ที่ได้ช่วยเหลือและดำเนินการต่อเพื่อช่วยให้ชุมชน PPCG เป็นสถานที่ที่สนุกสนานสำหรับทุกคนหรืออาจเป็นเพียงสำหรับฉันโดยเฉพาะ : P

หากคุณแปลงชื่อของเดนนิสให้เป็นอาเรย์ของ1s และ0s ที่แต่ละตัวอักษรเป็น1และสระแต่ละ0ตัวอาเรย์คือ[1, 0, 1, 1, 0, 1]ซึ่งมีความสมมาตร ดังนั้นความท้าทายของคุณคือการกำหนดชื่ออื่นเช่นนี้

ท้าทาย

รับสตริง ASCII ลบอักขระทั้งหมดที่ไม่ใช่ตัวอักษรและพิจารณาว่าการกำหนดค่าของสระและพยัญชนะมีความสมมาตรหรือไม่ yไม่ใช่เสียงสระ

โปรดทราบว่าโปรแกรมของคุณไม่จำเป็นต้องเป็นสตริงประเภทนี้

กรณีทดสอบ

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

การดำเนินการอ้างอิง

รหัส Python 3 นี้จะให้ผลลัพธ์ที่ถูกต้องในกรณีทดสอบ มันไม่ได้เลวร้ายอย่างที่ฉันสามารถทำได้โดยไม่ต้องไร้สาระ

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

ลองออนไลน์!


เมื่อไหร่และใครคืออันดับที่ 2
caird coinheringaahing

@cairdcoinheringaahing ขอบคุณที่เตือนฉัน มันจะเกี่ยวกับMego (TNB RO ดังนั้นตัวเอียง) แต่ฉันยังไม่ได้ไปรอบ ๆ เพื่อสรุปมัน
HyperNeutrino

ฉันควรจะบอกเขาหรือว่าเขาแค่กระโดดลงน้ำเพื่อหาปลา?
caird coinheringaahing

@cairdcoinheringaahing ฉันค่อนข้างแน่ใจว่าเขารู้แล้ว; ฉันบอกว่าฉันจะทำอย่างใดอย่างหนึ่งเกี่ยวกับเขา แต่ฉันยังไม่ได้ตัดสินใจว่าฉันจะทำอะไรบางอย่างที่เกี่ยวข้องกับเพนกวินหรือไตรวิวเลย
HyperNeutrino

ฉันคิดว่าเพนกวิน มันเป็นสิ่งที่เขารู้ (สำหรับฉัน)
caird coinheringaahing

คำตอบ:


15

05AB1E , 9 ไบต์

žM¹álSåÂQ

ลองออนไลน์!

ขอบคุณ -2 ถึงAdnan

การโจมตีครั้งนี้ทำให้ความเจ็บปวดของเยลลี่ชี้อย่างแน่นอน มันใช้lและAเทียบเท่า 1 ไบต์สำหรับเจลลี่ŒlและØaตามลำดับ


คุณแน่ใจหรือว่าใช้งานได้? เรียกใช้สิ่งนี้
MCCCS

@MCCCS อืมคุณอาจพูดถูก
Erik the Outgolfer

คุณสามารถแทนที่โดยáและโดยDR Â
Adnan

@Adnan ลืมáไม่ทราบว่าÂทำอะไรขอบคุณ!
Erik the Outgolfer

11
@alexis ภาษากอล์ฟเหล่านี้ส่วนใหญ่ใช้ 256 อักขระที่แตกต่างกันและเพจรหัสที่กำหนดเองซึ่งแมปเลขฐานสิบหก00กับFFอักขระ 256 ตัวเหล่านั้นให้ดูคำตอบของเยลลี่
สตีเฟ่น

18

วุ้น 11 ไบต์

ŒufØAe€ØCŒḂ

ลองออนไลน์!

รุ่นอื่น:

ŒlfØae€ØCŒḂ

ŒufØAe€ØcŒḂ

ŒlfØae€ØcŒḂ

แน่นอนว่าความท้าทายที่เดนนิสชื่นชมต้องมีคำตอบในภาษาของเขา


15
Œufเป็นEggในภาษาฝรั่งเศส เพียงแค่พูดใน
YSC

13

x86 ฟังก์ชันรหัสเครื่อง 32 บิต, 42 41 ไบต์

ปัจจุบันคำตอบที่ไม่ใช่การเล่นกอล์ฟภาษาที่สั้นที่สุดที่ 1B สั้นกว่า@ streetster ของ Q / kdb +

ด้วย 0 สำหรับความจริงและไม่เป็นศูนย์สำหรับความเท็จ: 41 40 ไบต์ (โดยทั่วไปประหยัด 1 ไบต์สำหรับ 32- บิต 2 ไบต์สำหรับ 64- บิต)

ด้วยสตริงที่มีความยาวโดยนัย (สิ้นสุด C-style 0 สิ้นสุด): 45 44 ไบต์

x86-64 เครื่องรหัส (มีตัวชี้ 32 บิตเช่น x32 ABI) ที่: 44 43 ไบต์

x86-64 พร้อมสตริงที่มีความยาวโดยนัยยังคงเป็น 46 ไบต์ (กลยุทธ์บิตแมปกะ / หน้ากากเป็นจุดคุ้มทุนแม้ตอนนี้)

_Bool dennis_like(size_t ecx, const char *esi)นี้เป็นฟังก์ชั่นที่มีลายเซ็น C หลักการเรียกใช้นั้นไม่ได้มาตรฐานเล็กน้อยใกล้กับ MS vectorcall / fastcall แต่มีการลงทะเบียน arg ที่แตกต่างกัน: สตริงใน ESI และความยาวใน ECX มันบดบัง arg-regs และ EDX เท่านั้น AL เก็บค่าส่งคืนโดยมีไบต์สูงถือขยะ (ตามที่อนุญาตโดย SysV x86 และ x32 ABIs IDK สิ่งที่ MSIs ของ MS พูดเกี่ยวกับขยะสูงเมื่อคืนค่าบูลหรือจำนวนเต็มแคบ)


คำอธิบายของอัลกอริทึม :

วนรอบสตริงอินพุตการกรองและการจัดประเภทเป็นอาร์เรย์บูลีนบนสแต็ก: สำหรับแต่ละไบต์ให้ตรวจสอบว่าเป็นอักขระตัวอักษร (ถ้าไม่ใช่ให้ไปยังอักขระถัดไป) และแปลงเป็นจำนวนเต็มตั้งแต่ 0-25 (AZ) . ใช้จำนวนเต็ม 0-25 เพื่อตรวจสอบบิตแมปของสระ = 0 / พยัญชนะ = 1 (บิตแมปถูกโหลดลงทะเบียนเป็นค่าคงที่ทันที 32 บิต) กด 0 หรือ 0xFF ลงบนสแต็กตามผลลัพธ์บิตแมป (จริง ๆ แล้วในไบต์ต่ำขององค์ประกอบ 32 บิตซึ่งอาจมีขยะใน 3 ไบต์บนสุด)

ลูปแรกสร้างอาร์เรย์ 0 หรือ 0xFF (ในองค์ประกอบ dword ที่เต็มไปด้วยขยะ) ทำการตรวจสอบ palindrome ตามปกติด้วยการวนซ้ำครั้งที่สองซึ่งหยุดเมื่อพอยน์เตอร์พอยน์เตอร์อยู่ตรงกลาง (หรือเมื่อทั้งคู่ชี้ไปที่องค์ประกอบเดียวกันหากมีจำนวนตัวอักษรแปลก ๆ ) ตัวชี้เลื่อนขึ้นด้านบนคือตัวชี้สแต็กและเราใช้ POP เพื่อโหลด + การเพิ่มขึ้น แทนที่จะเปรียบเทียบ / setcc ในลูปนี้เราสามารถใช้ XOR เพื่อตรวจจับสิ่งที่เหมือนกัน / แตกต่างกันเนื่องจากมีค่าที่เป็นไปได้สองค่าเท่านั้น เราสามารถสะสม (ด้วยหรือ) ว่าเราพบองค์ประกอบที่ไม่ตรงกันหรือไม่ แต่สาขาที่กำหนดไว้ล่วงหน้าในแฟล็กที่ XOR กำหนดไว้เป็นอย่างน้อยก็ดี

โปรดสังเกตว่าการวนซ้ำครั้งที่สองใช้byteขนาดตัวถูกดำเนินการดังนั้นจึงไม่สนใจว่าขยะวงแรกจะปล่อยให้อยู่ด้านนอกไบต์ต่ำของแต่ละองค์ประกอบแถวลำดับ


มันใช้ไม่มีเอกสารประกอบsalcการเรียนการสอนที่จะตั้ง AL จาก CF ในลักษณะเดียวกับที่sbb al,alจะ รองรับทุกซีพียูของ Intel (ยกเว้นในโหมด 64 บิต) หรือแม้แต่ Knight's Landing! Agner Fog แสดงเวลาที่กำหนด CPU AMD ทั้งหมดเช่นกัน (รวมถึง Ryzen) ดังนั้นหากผู้ขาย x86 ยืนยันที่จะผูกไบต์พื้นที่ว่าง opcode นับตั้งแต่ 8086 เราอาจใช้ประโยชน์จากมันเช่นกัน

เทคนิคที่น่าสนใจ:

  • เคล็ดลับที่ไม่ได้ลงชื่อ - เปรียบเทียบสำหรับ isalpha ที่รวมกัน () และ toupper () และศูนย์ขยายไบต์เพื่อเติม eax ตั้งค่าสำหรับ:
  • บิตแมปได้ทันทีในการลงทะเบียนสำหรับbt, แรงบันดาลใจจากการส่งออกคอมไพเลอร์บางอย่างดีสำหรับswitchแรงบันดาลใจจากการส่งออกคอมไพเลอร์บางอย่างดีสำหรับ
  • การสร้างอาเรย์ขนาดตัวแปรบนสแต็กด้วยการกดลูป (มาตรฐานสำหรับ asm แต่ไม่ใช่สิ่งที่คุณสามารถทำได้กับ C สำหรับรุ่นสตริงที่มีความยาวโดยนัย) มันใช้พื้นที่สแต็ค 4 ไบต์สำหรับอักขระอินพุตทุกตัว แต่บันทึกอย่างน้อย 1 ไบต์เทียบกับการเล่นกอล์ฟที่ดีที่สุดstosbไบต์เทียบกับการเล่นกอล์ฟที่ดีที่สุดรอบ
  • แทนที่จะเป็น cmp / setne บนอาเรย์บูลีน XOR บูลีนเข้าด้วยกันเพื่อรับค่าความจริงโดยตรง ( cmp/ salcไม่ใช่ตัวเลือกเนื่องจากsalcใช้งานได้เฉพาะกับ CF เท่านั้นและ 0xFF-0 ไม่ได้ตั้งค่า CF. ไว้ที่ sete3 ไบต์ แต่จะหลีกเลี่ยงincนอกลูปสำหรับค่าใช้จ่ายสุทธิ 2 ไบต์ (1 ในโหมด 64 บิต )) vs. xor ในลูปและแก้ไขด้วย inc
; 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

นี่อาจเป็นหนึ่งในคำตอบที่เร็วที่สุดเนื่องจากไม่มีนักกอล์ฟคนใดได้รับบาดเจ็บอย่างรุนแรงเกินไปอย่างน้อยก็สำหรับสายอักขระที่มีอักขระไม่กี่พันตัวที่การใช้หน่วยความจำ 4x ไม่ทำให้แคชหายไปมากนัก (มันอาจจะสูญเสียคำตอบที่ใช้สายอักขระที่ไม่เหมือนเดนนิสก่อนที่จะวนตัวอักขระทั้งหมด) salcช้ากว่าsetccในซีพียูจำนวนมาก (เช่น 3 uops เทียบกับ 1 ใน Skylake) แต่การตรวจสอบบิตแมปด้วยbt/salcยังเร็วกว่าการค้นหาสตริงหรือการจับคู่ regex และไม่มีค่าใช้จ่ายในการเริ่มต้นดังนั้นมันจึงถูกมากสำหรับสตริงสั้น ๆ

การทำแบบนี้ในครั้งเดียวในทันทีนั้นหมายถึงการทำซ้ำรหัสการจำแนกประเภทสำหรับทิศทางขึ้นและลง นั่นจะเร็วกว่า แต่มีขนาดรหัสใหญ่กว่า (แน่นอนถ้าคุณต้องการความรวดเร็วคุณสามารถทำ 16 หรือ 32 ตัวอักษรในแต่ละครั้งด้วย SSE2 หรือ AVX2 ยังคงใช้เคล็ดลับการเปรียบเทียบโดยการเลื่อนช่วงไปทางด้านล่างของช่วงที่เซ็นชื่อ)


ทดสอบโปรแกรม (สำหรับ ia32 หรือ x32 Linux)เพื่อเรียกใช้ฟังก์ชันนี้ด้วย cmdline arg และออกจากสถานะ status = return value strlenการดำเนินงานจากint80h.org

; 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

รุ่น 64 บิตของฟังก์ชั่นนี้สามารถใช้sbb eax,eaxซึ่งเป็นเพียง 2 ไบต์แทน setc al3 มันจะต้องมีไบต์พิเศษสำหรับdecหรือnotในตอนท้าย (เนื่องจากมีเพียง 32 บิตที่มี 1 ไบต์ inc / dec r32) การใช้ x32 ABI (ตัวชี้แบบ 32 บิตในโหมดยาว) เรายังสามารถหลีกเลี่ยงคำนำหน้า REX ได้แม้ว่าเราจะคัดลอกและเปรียบเทียบตัวชี้

setc [rdi]สามารถเขียนโดยตรงไปยังหน่วยความจำ แต่การสำรอง ECX ไบต์ของพื้นที่สแต็กมีค่าใช้จ่ายมากกว่าขนาดรหัสที่ประหยัด (และเราต้องย้ายผ่านอาร์เรย์เอาต์พุต [rdi+rcx]ใช้เวลาหนึ่งไบต์พิเศษสำหรับโหมดการกำหนดแอดเดรส แต่จริงๆแล้วเราต้องการตัวนับที่ไม่ได้อัปเดตสำหรับตัวอักขระที่กรองดังนั้นมันจะแย่กว่านั้น)


นี่คือแหล่ง YASM / NASM พร้อม%ifเงื่อนไข มันสามารถสร้างขึ้นด้วย-felf32(รหัส 32 บิต) หรือ-felfx32(รหัส 64 บิตพร้อม x32 ABI) และมีความยาวโดยปริยายหรืออย่างชัดเจน ฉันทดสอบทั้ง 4 เวอร์ชั่นแล้ว ดูคำตอบนี้สำหรับสคริปต์เพื่อสร้างไบนารีคงที่จากแหล่ง NASM / YASM

ในการทดสอบเวอร์ชัน 64 บิตบนเครื่องโดยไม่รองรับ x32 ABI คุณสามารถเปลี่ยนเรจิสเตอร์ของตัวชี้เป็น 64- บิต (จากนั้นเพียงลบจำนวน REX.W = 1 คำนำหน้า (0x48 ไบต์) จากการนับในกรณีนี้คำแนะนำ 4 คำต้องใช้คำนำหน้า REX เพื่อทำงานบน regs 64 บิต) หรือเพียงแค่เรียกมันด้วยrspและตัวชี้เข้าในพื้นที่ที่อยู่ในระดับต่ำ 4G

%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 (ธงทิศทางที่ควบคุมlodsd/ scasdและอื่น ๆ ) แต่มันก็ดูเหมือนจะไม่ชนะ ABIs ปกติต้องการให้ DF ถูกล้างข้อมูลในรายการฟังก์ชันและออก สมมติว่าเคลียร์เมื่อเข้า แต่การตั้งค่าไว้ที่ทางออกจะเป็นการโกง IMO มันจะดีถ้าใช้ LODSD / SCASD เพื่อหลีกเลี่ยง 3 ไบต์sub esi, 4โดยเฉพาะอย่างยิ่งในกรณีที่ไม่มีขยะสูง


กลยุทธ์บิตแมปสำรอง (สำหรับ x86-64 สตริงความยาวโดยนัย)

ปรากฎว่าสิ่งนี้ไม่ได้บันทึกไบต์ใด ๆ เพราะbt r32,r32ยังทำงานได้กับขยะในดัชนีบิต มันไม่ใช่เอกสารอย่างที่shrเป็นอยู่

แทนที่จะbt / sbbใช้บิตเข้า / ออกของ CF ให้ใช้ shift / mask เพื่อแยกบิตที่เราต้องการจากบิตแมป

%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

เนื่องจากสิ่งนี้สร้าง 0/1 ใน AL ที่ส่วนท้าย (แทน 0 / 0xFF) เราสามารถทำการผกผันที่จำเป็นของค่าส่งคืนในตอนท้ายของฟังก์ชันด้วยxor al, 1(2B) แทนdec eax(เช่น 2B ใน x86-64) เพื่อ ยังคงสร้างมูลค่าที่เหมาะสมbool/_Boolผลตอบแทน

สิ่งนี้ใช้เพื่อบันทึก 1B สำหรับ x86-64 ด้วยสายอักขระความยาวโดยนัยโดยหลีกเลี่ยงความจำเป็นในการเป็นศูนย์ไบต์สูงของ EAX (ฉันเคยใช้and eax, 0x7F ^ 0x20เพื่อบังคับให้ตัวพิมพ์ใหญ่และเป็นศูนย์ส่วนที่เหลือของ eax ด้วย 3 ไบต์and r32,imm8แต่ตอนนี้ฉันกำลังใช้การเข้ารหัสแบบ 2 ไบต์ทันทีด้วยการเข้ารหัส AL ที่คำสั่ง 8086 ส่วนใหญ่มีเหมือนที่ฉันทำไปแล้ว สำหรับsubและcmp.)

มันสูญเสียไปถึงbt/ salcในโหมด 32 บิตและสตริงที่มีความยาวอย่างชัดเจนต้องใช้ ECX สำหรับการนับดังนั้นจึงไม่สามารถใช้งานได้

แต่แล้วฉันก็ตระหนักว่าฉันผิด: bt edx, eaxยังคงทำงานกับขยะจำนวนมากใน eax เห็นได้ชัดว่าปิดบังการเปลี่ยนแปลงนับแบบเดียวกับที่shr r32, clทำได้ (ดูที่ cl 5 บิตต่ำ) สิ่งนี้แตกต่างจากbt [mem], regซึ่งสามารถเข้าถึงภายนอกหน่วยความจำที่อ้างอิงโดยที่อยู่โหมด / ขนาดถือว่าเป็นบิตสตริง (Crazy CISC ... )

คู่มืออ้างอิงชุด insn ของ Intel ไม่ได้กล่าวถึงการปิดบังดังนั้นอาจเป็นพฤติกรรมที่ไม่มีเอกสารที่ Intel กำลังรักษาไว้ในตอนนี้ (สิ่งนั้นไม่ใช่เรื่องแปลกอะไร bsf dst, srcกับ src = 0 จะไม่มีการแก้ไข dst แม้ว่าจะมีการบันทึกไว้ว่าให้ dst ถือค่าที่ไม่ได้กำหนดไว้ในกรณีนั้นเอเอ็มดีจะบันทึกพฤติกรรมของ src = 0) จริง ๆ แล้วฉันทดสอบกับ Skylake และ Core2 และbtรุ่นใช้งานได้กับขยะที่ไม่เป็นศูนย์ใน EAX นอก AL

เคล็ดลับเรียบร้อยที่นี่ใช้xchg eax,ecx(1 ไบต์) เพื่อให้ได้จำนวนเป็น CL น่าเสียดายที่ BMI2 shrx eax, edx, eaxคือ 5 ไบต์เทียบกับเพียง 2 ไบต์shr eax, clเท่านั้น การใช้bextrต้องมีขนาด 2 ไบต์mov ah,1(สำหรับจำนวนบิตที่ต้องการแยก) ดังนั้นจึงมีขนาด 5 + ​​2 ไบต์เช่น SHRX + AND


รหัสแหล่งที่มาได้ยุ่งสวยหลังจากเพิ่ม%ifเงื่อนไข นี่คือการแยกส่วนของสตริงความยาวโดยนัย x32 (ใช้กลยุทธ์ทางเลือกสำหรับบิตแมปดังนั้นจึงยังคงเป็น 46 ไบต์)

ความแตกต่างหลักจากรุ่นความยาวอย่างชัดเจนอยู่ในลูปแรก สังเกตว่ามันมีlodsมาก่อนและที่ด้านล่างแทนที่จะเป็นเพียงหนึ่งที่ด้านบนของลูป

    ; 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

จอตาตา49 47 45 ไบต์

\P{L}

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

ลองออนไลน์!

บันทึก 2 ไบต์ต้องขอบคุณ Neil

บันทึกอีก 2 ไบต์ด้วย Martin

ลบไม่ใช่ตัวอักษรแล้วแทนที่สระด้วย 1 และพยัญชนะที่มี 2 เพื่อให้ได้ค่าที่สอดคล้องกัน จากนั้นจะลบอักขระตัวแรกและอักขระสุดท้ายซ้ำ ๆ กันหากอักขระนั้นเหมือนกัน เมื่อพวกเขาไม่ได้คำว่าสมมาตรหากมีหนึ่งหรือศูนย์อักขระที่เหลืออยู่


ไม่\D 2ทำงานเพื่อช่วยให้คุณประหยัดคู่ของไบต์มากกว่าT`lL`2?
Neil

@Neil ใช่มันดูเหมือนว่าจะดีจับ!
FryAmTheEggman

ทำได้ดี. ฉันพยายามทำสิ่งนี้: (
Christopher

7

PHP, 82 ไบต์

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

ลองออนไลน์!


คุณสามารถเติม typecasting (bool)และลบ$s=และ==$sตรวจสอบเพื่อบันทึก 1 ไบต์
ไกเซอร์

หากฉันไม่ผิดคุณสามารถแทนที่(bool)ด้วยเพียง0||เพื่อบอกว่าเป็นเท็จหรือ…แทนช่วยประหยัด 3 ไบต์เพิ่มเติม
ไกเซอร์

ฮึ่ม คุณไม่สามารถใช้\wสำหรับตัวอักษรคำแทนที่จะเป็นa-z?
ไกเซอร์

@kaiser \wมีเครื่องหมายขีดเส้นใต้และตัวอักษร สิ่งนี้จะไม่ทำงานและ[^/p{L}]จะนานกว่า[^a-z]บวก ฉันเปรียบเทียบสตริงย้อนกลับกับสตริงดังนั้น$sจำเป็นต้องใช้เพื่อสร้างบูลีน
JörgHülsermann

มันเป็นความจริง. ยังคนอื่น ๆ ควรทำงาน "ควร" ... พวกเขาทำ
ไกเซอร์

6

MATL, 14 ไบต์

t3Y2m)13Y2mtP=

ลองมันที่MATL ออนไลน์

นี่คือรุ่นที่แก้ไขเล็กน้อยเพื่อตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

        % 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

คุณสาธิตด้วย "Martin Ender" แทนที่จะเป็น "Dennis" หรือไม่? ฉันต้องดูชื่อการท้าทายอีกครั้ง
Roman Gräf

1
สันนิษฐานว่า Suever ต้องการการสาธิตที่มีการกรองจำนวนหนึ่งในขั้นตอนแรก
Greg Martin

จากนั้นเขาควรใช้ "Alex A. " แต่จะมีระยะเวลาด้วย
Erik the Outgolfer

2
ฉันสับสนว่าปัญหาคืออะไร ฉันเลือกมาร์ตินเอนเดอร์เพราะจริง ๆ แล้วมันจะเป็นจริงถ้าคุณลบช่องว่างและเท็จอย่างอื่น ฉันรวมลิงก์ไปยังกรณีทดสอบทั้งหมด
Suever

6

Haskell, 84 75 74 69 ไบต์

-10 ขอบคุณ @nimi
-5 ขอบคุณ @Zgarb

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

รายการความเข้าใจจะแทนที่ตัวอักษรแต่ละตัวด้วยบูลีนและลบอักขระอื่นทั้งหมด ส่วนแรกตรวจสอบว่ารายการผลลัพธ์หรือไม่เป็น palindrome

ลองออนไลน์!


เคล็ดลับสองข้อ: 1) ความเข้าใจในรายการมักสั้นลงกว่าfilterตามด้วยmapแม้ว่าคุณจะต้องเปลี่ยนไปใช้แบบที่ไม่มีค่าใช้จ่าย 2) <$>idฟุ่มเฟือย elemf x=(==)<*>reverse$[elem c"aeiouAEIOU"|c<-x,c ['A'..'Z']++['a'..'z']]
nimi

คุณสามารถปล่อยช่องว่างระหว่างcและ"อีกหนึ่งไบต์
nimi

1
ฉันคิดว่าc`elem`['A'..'Z']++['a'..'z']สามารถย่อให้เหลือ'@'<c,c<'{','`'<c||c<'['
Zgarb

5

Pyth, 18 15 ไบต์

_I/L"aeiou"@Gr0

ลองที่นี่

-2 ขอบคุณKarlKastorและต่อมา -1


16 ไบต์: _I/L"aeiou"@Grz0(ใช้ตัวดำเนินการ invariance I)
KarlKastor

@KarlKastor ฉันรู้ว่าต้องมีตัวดำเนินการบางอย่างเช่นนั้น ... ขอบคุณ (BTW ฉันสามารถลบได้zเช่นกันฉันจะถือว่าข้อมูลที่ป้อนเข้า)
Erik the Outgolfer


3

อลิซ 28 ไบต์

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

ลองออนไลน์!

เอาต์พุต1เป็นความจริงและไม่มีอะไรผิดเพี้ยน

คำอธิบาย

ทุกคำสั่งในโปรแกรมนี้ทำงานในโหมดเลขลำดับ แต่มีการบิดเล็กน้อยในแม่แบบที่ช่วยให้ฉันบันทึกไบต์ หากการขึ้นบรรทัดใหม่เป็นค่าความจริงที่ยอมรับได้ฉันสามารถบันทึกได้อีกหนึ่งไบต์ด้วยวิธีการเดียวกัน

เป็น Linearized โปรแกรมดังต่อไปนี้:

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

JavaScript (ES6), 72 69 ไบต์

บันทึก 3 ไบต์ขอบคุณ Neil

ส่งคืนบูลีน

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

กรณีทดสอบ


บันทึกคู่ของไบต์โดยการแทนที่สตริงว่าง 22
Shaggy

1
คุณต้องการแม้แต่+''ตอนจบหรือไม่? นั่นจะประหยัดได้ 3 ไบต์แทน
Neil

ฉันชอบความคิดของ @ Neil ดีกว่า!
Shaggy

2

Mathematica, 113 ไบต์

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

คุณสามารถกำจัดไบต์ได้ค่อนข้างน้อย:PalindromeQ@StringReplace[#,{Characters@"aeiouAEIOU"->"1",LetterCharacter->"0",_->""}]&
ไม่ใช่ต้นไม้

2

GolfScriptขนาด 42 ไบต์

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

ลองออนไลน์!

ส่วนที่ยากคือการสร้างทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็กในหนึ่งสตริงซึ่งเราจะใช้ในฟังก์ชั่นตัวกรองเพื่อกรองตัวอักษรออกจากอินพุต โชคดีเนื่องจากสตริงใน GolfScript เป็นเพียงอาร์เรย์ codepoint ที่มีคุณสมบัติพิเศษดังนั้นเราจึงสามารถสร้าง codepoints ได้อย่างมีประสิทธิภาพ นี่คือวิธีที่เราสร้างพวกเขา:

ครั้งแรกที่เราสร้างช่วง [0..122] 122 zเป็นจุดโค้ดสำหรับ จากนั้นเรานำองค์ประกอบจากองค์ประกอบที่ดัชนี 65 เป็นต้นไป 65 คือ codepoint สำหรับAจุดโค้ดสำหรับ ตอนนี้เรามี [65..122] ทุกอย่างดียกเว้นเรามี codepoints ที่ไม่ต้องการ ([91..96]) อยู่ในนั้น ดังนั้นก่อนอื่นเราต้องทำซ้ำของช่วงนั้น จากนั้นเรานำองค์ประกอบจากดัชนี 26 เป็นต้นไปและเรามี [91..122] หลังจากนั้นเราได้รับองค์ประกอบและรวมถึงดัชนี 5 ตอนนี้เรามี [91..96] ในที่สุดเราก็ลบองค์ประกอบเหล่านั้นออกจาก [65..122] ของเราปล่อยให้เรา [65..90, 97..122] หายไป สิ่งเหล่านี้คือจุดรหัสที่เราต้องการ

ตอนนี้เราได้ทำรายการ codepoint ตัวอักษรตัวบน / ล่างแล้วเรายังคงฟังก์ชั่นการกรองของเรา ฟังก์ชั่นได้รับการแมปกับตัวละครแต่ละตัวในสตริงอินพุตซึ่งตามที่ฉันพูดในตอนแรกว่าจะได้รับการแยกวิเคราะห์เป็น codepoint ของมันแทน [codepoint, [65..90, 97..122]]ดังนั้นตอนนี้เราเป็นหลักมี เพื่อดูว่าถ่านcodepointเป็นตัวอักษรหรือไม่เราเพียงนำดัชนีไปไว้ในรายการที่เราทำ หากไม่มีเราจะได้รับ-1เป็นดัชนีแทน

ตอนนี้เราได้รับค่าเท็จถ้าcodepoint == 65นั่นคือดัชนีแรกของรายการของเราเนื่องจากดัชนีนั้นจะเป็น 0 แต่การเพิ่มขึ้นครั้งเดียวจะแก้ไขปัญหานี้และตอนนี้ถ้าcodepointอยู่ในรายการของเราเราจะ รับดัชนี + 1 ซึ่งเป็นจำนวนบวกเสมอดังนั้นจึงเป็นจริงเสมอในขณะที่ถ้าไม่มีเราจะได้รับ -1 + 1 = 0 นั่นคือความเท็จ

ในที่สุดเราก็ใช้ฟังก์ชั่นที่ฉันอธิบายกับตัวอักษรทุกตัวของอินพุทและเราจะใช้ตัวอักษรที่ฟังก์ชันส่งคืนผลลัพธ์ที่เป็นความจริงเท่านั้น

ต่อไปเราต้องพิจารณาว่าถ่านแต่ละตัวเป็นสระหรือพยัญชนะ เนื่องจากสระนั้นมีจำนวนน้อยกว่าพยัญชนะการสร้างสตริงของสระเพื่อให้เราตรวจสอบว่าเงื่อนไขนั้นสั้นกว่าการสร้างสตริงของพยัญชนะดังนั้นเราตรวจสอบว่าถ่านแต่ละตัวเป็นสระหรือไม่ แต่เพื่อตรวจสอบว่ารายการบูลีนเป็น palindromic หรือไม่เราต้องการบูลีนซึ่งเราไม่เพียงแค่รับดัชนี + 1 เนื่องจากมันอาจส่งผลให้จำนวน [1..10] ถ้าถ่านเป็นสระ และในฐานะภาษากอล์ฟส่วนใหญ่ภาษานี้ไม่มีboolฟังก์ชั่นเช่นกัน ดังนั้นเราจึงใช้เพียงnot not xเพราะnotส่งคืนบูลีนเสมอ แต่เดี๋ยวก่อน; เราจำเป็นต้องมีบูลีนที่เฉพาะเจาะจงจริงๆเหรอ? เนื่องจากnotส่งคืนบูลีนเสมอทำไมเราไม่ลบเพียงแค่วินาทีnotนั้นมาและตรวจสอบว่าถ่านแต่ละตัวเป็นพยัญชนะหรือไม่ ใช่นั่นคือสิ่งที่เราจะทำ!

หลังจากการตรวจสอบซึ่งส่งกลับรายการบูลีนเราจะตรวจสอบว่ารายการบูลีนที่เราได้รับนี้เป็น Palindrome หรือไม่ซึ่งเป็นความท้าทายนี้ที่ขอให้เราทำ แล้วนิยามของ palindrome คืออะไร? ใช่ palindrome เป็นรายการหรือสตริงที่เท่ากับย้อนกลับ ดังนั้นเราจะตรวจสอบอย่างไร ง่ายเราลอกมันกลับด้านและตรวจสอบกับรายการต้นฉบับ ผลลัพธ์ที่เราได้รับคือในที่สุดรหัสของเราควรกลับมา


1
คำอธิบายที่ยิ่งใหญ่สำหรับโปรแกรมขนาด 42 ไบต์ ตอนนี้ผมคิดว่ามันเป็นตัวอธิบายสวยมาก ...
เอริก Outgolfer

2

PHP , 87 ไบต์

รุ่น PHP ของ Regex ฟรี เพิ่ม "สระ" เนื่องจาก stripos สามารถส่งคืน 0 ซึ่งเป็นเท็จใน PHP

แก้ไขข้อบกพร่องโดยJörg

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

ลองออนไลน์!


จำนวนไบต์เดียวกัน for(;a&$c=$argn[$p++];)ctype_alpha($c)?$s.=stripos(_aeiou,$c)?0:1:0;echo$s==strrev($s);แต่จะได้ผลลัพธ์ที่ถูกต้องสำหรับสตริงที่มี
เลข

@ JörgHülsermannขอบคุณ
ฉัน

2

q / kdb +, 42 38 ไบต์

วิธีการแก้:

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

ตัวอย่าง:

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

คำอธิบาย:

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'

การแก้ไข:

  • -4 ไบต์; เปลี่ยนreverseเป็น k เทียบเท่า|:

2

CJam , 26 ไบต์

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

ลองออนไลน์!

ขอบคุณ -1 ถึงEsolanging ผลไม้


คุณสามารถแทนที่26,'af+ด้วย'{,97>เพื่อบันทึกไบต์
แยกผลไม้

@EsolangingFruit เป็นคำตอบเก่า ๆ ...
Erik the Outgolfer

ไบต์ที่บันทึกไว้ครึ่งปีที่ผ่านมาไม่แตกต่างจากไบต์ที่บันทึกไว้ในขณะนี้ มันไม่เหมือนกับว่ามีอัตราเงินเฟ้อแบบไบต์หรืออะไรก็ตาม: P
ผลไม้ที่ละลายน้ำอยู่

@EsolangingFruit ฉันหมายถึงประสบการณ์ที่พัฒนาอยู่เสมอกับการเล่นกอล์ฟ ... แน่นอนว่าคุณได้รับเครดิตตามปกติไม่ต้องกังวล!
Erik the Outgolfer

2

Braingolf,  4  3 ไบต์

&JP

-1 ไบต์ขอบคุณ Erik the Outgolfer

ปรากฎว่าฉันมีมาPตลอดแม้กระทั่งก่อนที่ความท้าทายนี้

J อย่างไรก็ตามแม้จะถูกสร้างขึ้นก่อนการท้าทายนี้ไม่ได้ถูกผลักไปยัง GitHub ก่อนการท้าทายดังนั้นจึงยังไม่สามารถแข่งขันได้

คำอธิบาย:

&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

ทำไมคุณต้องn?
Erik the Outgolfer

@EriktheOutgolfer เพราะฉันเป็นคนปัญญาอ่อนที่ผ่านการรับรอง
Skidsdev

อืมคุณลืมที่จะลบออกจากคำอธิบาย
Erik the Outgolfer

@EriktheOutgolfer ฉันเป็น gunna เขียน "Erick" จากนั้นก็ตี c แต่มันดูเหมือนว่า "Eriek"
Skidsdev

จะไม่ล้มเหลวนี้ชอบของAlex A.?
ปุย

1

Python 2, 83 ไบต์

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

กำหนดฟังก์ชั่นที่ให้TrueหรือFalse


คุณสามารถบันทึก 2 ไบต์โดยใช้แทน"aeiouAEIOU".__contains__ lambda y:y.lower()in"aeiou"
เครื่องปั่น




1

Bash , 82 ไบต์

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

ลองออนไลน์!

ชื่อซ้ำเป็นพารามิเตอร์ลบ non-leters แทนที่สระด้วย 0, ไม่ใช่สระหรือ 0 กับ 1 และเปรียบเทียบกับการย้อนกลับที่เหมือนกัน

สามารถตีกอล์ฟได้มากกว่านี้หากสามารถไปทำงานทดแทนได้สองครั้งหรือสามครั้ง

สถานะการออกคือ 0 สำหรับจริงและ 1 สำหรับไม่


ในเวอร์ชันทุบตีล่าสุดi=${i^^*};แปลงiเป็นตัวพิมพ์ใหญ่ แต่ฉันคิดว่ามันจะช่วยคุณa-zและประหยัดได้aeiouซึ่งน้อยกว่า 10B ที่คุ้มค่า
Peter Cordes

1

Japt v2.0a0, 19 11 ไบต์

k\L mè\v ê¬

ลองออนไลน์


คำอธิบาย

        :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

ความจริง 126 ไบต์

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

ทดสอบ

(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

PowerShell, 87 ไบต์

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

รับสำเนาของสตริงโดยที่เสียงสระเป็น 0 และพยัญชนะเป็น 1 โดยลบตัวอักษรพิเศษทั้งหมดแล้วเปรียบเทียบสตริงนั้นกับรุ่นที่กลับด้านเข้าร่วมกับสตริง

เอาท์พุท:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.