사용자 감사 과제 # 1 : Dennis ♦


53

PPCG 커뮤니티가 모든 사람이 즐길 수있는 곳, 또는 나에게 특별히 도움이 될 수 있도록 지속적으로 도움을주고있는 일련의 사용자 도전 과제를 자발적으로 생각했습니다. :피

Dennis의 이름을 각 자음이 있고 모음이 인 1s 및 0s 의 배열로 변환 하면 배열 은 대칭입니다. 따라서 다른 이름이 어떤 것인지 결정해야합니다.10[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 코드는 테스트 사례에 따라 올바른 출력을 제공합니다. 내가 우스운 일없이 만들 수있는만큼 골치 아픈 일입니다.

파이썬 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 2016 년

내가 그에게 말해야합니까 아니면 물고기를 찾기 위해 물 속으로 뛰어들 것입니까?
caird coinheringaahing 2016 년

@cairdcoinheringaahing 나는 그가 이미 알고 있다고 확신한다; 나는 그에 대해 한 가지를 할 것이라고 말했지만 펭귄이나 TNB와 관련하여 아직 할 일을 결정하지 않았습니다.
HyperNeutrino 2016 년

나는 펭귄을 생각합니다. 그가 알고있는 것입니다 (나를 위해)
caird coinheringaahing

답변:


15

05AB1E , 9 바이트

žM¹álSåÂQ

온라인으로 사용해보십시오!

Adnan 에게 -2 감사합니다 .

이것은 젤리의 고통 ​​지점을 정확하게 공격합니다. 그것은 사용 l하고 A젤리의를 위해, 1 바이트의 등가물 ŒlØa각각.


이것이 효과가 있습니까? 이것을 실행
MCCCS

@MCCCS 흠, 당신이 옳을지도 모른다.
Outgolfer Erik

당신은 대체 할 수 áDR에 의해 Â.
Adnan

@Adnan 약 잊어 버렸 á는지 몰랐어요, Â, 않습니다 감사합니다!
Outgolfer Erik

11
@alexis이 골프 언어의 대부분은 256 가지 문자와 16 진수 00FF256 문자로 매핑하는 사용자 지정 코드 페이지를 사용 합니다. 젤리 답변 참조
Stephen


13

x86 32 비트 기계 코드 기능, 42 41 바이트

현재 가장 짧은 비 골프 언어 답변, @streetster의 q / kdb + 보다 1B 짧습니다 .

진실의 경우 0, 거짓의 경우 0이 아닌 경우 : 41 40 바이트. 일반적으로 32 비트의 경우 1 바이트, 64 비트의 경우 2 바이트를 저장합니다.

암시 적 길이의 문자열 사용 (C 스타일 0으로 종료) : 45 44 바이트

x86-64 머신 코드 (x32 ABI와 같은 32 비트 포인터 포함) : 44 43 바이트 .

암시 적 길이의 문자열을 가진 x86-64, 여전히 46 바이트 (이동 / 마스크 비트 맵 전략은 현재 손익분기)

이것은 C 서명을 가진 함수입니다 _Bool dennis_like(size_t ecx, const char *esi). 호출 규칙은 약간 비표준이며 MS 벡터 콜 / 패스트 콜과 비슷하지만 다른 인수 레지스터가 있습니다 : ESI의 문자열과 ECX의 길이. 그것은 단지 arg-regs와 EDX를 방해합니다. AL은 SysV x86 및 x32 ABI에서 허용하는 높은 바이트를 가비지로 반환 값을 보유합니다. IDK는 bool 또는 좁은 정수를 반환 할 때 고가 쓰레기에 대해 MS의 ABI가 말한 내용입니다.


알고리즘 설명 :

입력 문자열을 반복하여 필터링하고 스택의 부울 배열로 분류하십시오. 각 바이트에 대해 알파벳 문자인지 확인하고 (아니면 다음 문자로 계속) 0-25 (AZ)의 정수로 변환하십시오. . vowel = 0 / consonant = 1의 비트 맵을 확인하려면 0-25 정수를 사용하십시오. 비트 맵은 32 비트 즉시 상수로 레지스터에로드됩니다. 비트 맵 결과에 따라 스택에 0 또는 0xFF를 푸시합니다 (실제로는 32 비트 요소의 하위 바이트에 최상위 3 바이트에 가비지가있을 수 있음).

첫 번째 루프는 0 또는 0xFF의 배열 (가비지로 채워진 dword 요소)을 생성합니다. 포인터가 중간에서 교차 할 때 (또는 홀수의 알파벳 문자가있는 경우 둘 다 동일한 요소를 가리킬 때) 중지되는 두 번째 루프로 일반적인 회문 검사를 수행하십시오. 위로 움직이는 포인터는 스택 포인터이며 POP를 사용하여로드 + 증가시킵니다. 이 루프에서 비교 / setcc 대신 두 개의 가능한 값만 있기 때문에 XOR을 사용하여 동일 / 다른 것을 감지 할 수 있습니다. 일치하지 않는 요소가 있는지 여부를 OR로 누적 할 수 있지만 XOR에서 설정 한 플래그의 초기 분기는 적어도 좋습니다.

두 번째 루프는 byte피연산자 크기를 사용하므로 첫 번째 루프가 각 배열 요소의 하위 바이트 외부에 남겨진 쓰레기를 신경 쓰지 않습니다.


문서화되지 않은 salc명령어 를 사용하여 동일한 방식으로 CF에서 AL을 설정 sbb al,al합니다. Knight 's Landing까지 모든 Intel CPU (64 비트 모드 제외)에서 지원됩니다! Agner Fog는 Ryzen을 포함한 모든 AMD CPU에 대한 타이밍을 나열 하므로 x86 공급 업체가 8086 이후로이 바이트의 opcode 공간을 차지할 것을 요구하면이를 활용할 수도 있습니다.

흥미로운 속임수 :

  • 결합 된 isalpha ()와 toupper ()에 대한 unsigned-compare 비교 , eax를 채우기 위해 바이트를 0으로 확장하여 다음을 설정합니다.
  • 에 대한 멋진 비트 맵 출력bt 에서 영감을 얻은switch 레지스터의 즉각적인 비트 맵 .
  • 루프를 밀어서 스택에 가변 크기 배열 만들기 (asm의 표준이지만 암시 적 길이 문자열 버전의 경우 C로 수행 할 수있는 작업은 아님). 모든 입력 문자에 대해 4 바이트의 스택 공간을 사용하지만 최적의 골프와 비교하여 최소 1 바이트를 절약합니다 stosb.
  • 부울 배열의 cmp / setne 대신 XOR 부울이 함께 진리 값을 직접 가져옵니다. ( cmp/ salc는 옵션 salc입니다. CF에서만 작동하고 0xFF-0은 CF sete를 3 바이트로 설정하지 않지만 inc2 바이트의 순 비용 (64 비트 모드에서 1)으로 루프 외부를 피 합니다. )) 대 루프에서 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

이것은 아마도 가장 빠른 해답 중 하나 일 것입니다. 적어도 4 배의 메모리 사용으로 인해 많은 캐시 누락이 발생하지 않는 수 천 자 미만의 문자열에 대해서는 골프 중 어느 것도 그렇게 심하게 다 치지 않기 때문입니다. (또한 모든 문자를 반복하기 전에 데니스와 같은 문자열이 아닌 경우 초기에 걸리는 답을 잃을 수도 있습니다.) 많은 CPU (예 : 3 uops vs. Skylake에서 1) salc보다 느리지 setcc만 비트 맵 검사는 bt/salc문자열 검색 또는 정규식 일치보다 여전히 빠릅니다. 또한 시작 오버 헤드가 없으므로 짧은 문자열에는 매우 저렴합니다.

한 번에 한 번에 수행하면 위아래 방향에 대한 분류 코드가 반복됩니다. 그것은 더 빠르지 만 더 큰 코드 크기입니다. (물론 빨리 원한다면 SSE2 또는 AVX2를 사용하여 한 번에 16 자 또는 32자를 수행 할 수 있지만 부호있는 범위의 맨 아래로 범위를 이동하여 비교 트릭을 계속 사용할 수 있습니다).


cmdline arg로이 함수를 호출하고 status = return value로 종료하는 테스트 프로그램 (ia32 또는 x32 Linux 용) . int80h.orgstrlen 에서 구현 .

; 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. 이는 3 대신 3 바이트입니다 setc al. 또한 32 비트에만 1 바이트 inc / dec r32가 있기 때문에 추가 바이트 dec또는 not끝에 추가 바이트가 필요합니다 . x32 ABI (긴 모드의 32 비트 포인터)를 사용하면 포인터를 복사하고 비교하더라도 REX 접두사를 피할 수 있습니다.

setc [rdi]메모리에 직접 쓸 수는 있지만 스택 공간의 ECX 바이트를 예약하면 절약되는 것보다 코드 크기가 더 비쌉니다. (그리고 우리는 출력 배열을 통해 이동해야합니다. [rdi+rcx]어드레싱 모드를 위해 1 바이트가 더 필요하지만 실제로 필터링 된 문자를 업데이트하지 않는 카운터가 필요하므로 그보다 나빠질 것입니다.)


%if조건 이있는 YASM / NASM 소스입니다 . -felf32(32 비트 코드) 또는 -felfx32(x32 ABI가있는 64 비트 코드) 및 암시 적 또는 명시 적 길이 로 빌드 할 수 있습니다 . 4 가지 버전을 모두 테스트했습니다. NASM / YASM 소스에서 정적 바이너리를 빌드하는 스크립트는 이 답변 을 참조하십시오 .

x32 ABI를 지원하지 않는 컴퓨터에서 64 비트 버전을 테스트하려면 포인터 등록을 64 비트로 변경할 수 있습니다. (카운트에서 REX.W = 1 접두사 (0x48 바이트)의 수를 빼면됩니다.이 경우 64 비트 정규식에서 작동하려면 4 개의 명령어에 REX 접두사가 필요합니다.) 또는 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등 을 제어하는 ​​방향 플래그)를 어지럽히는 것을 보았지만 승리하지는 않았습니다. 일반적인 ABI에서는 기능 진입 및 종료시 DF를 지워야합니다. 입국이 허가되었지만 출국시 설정된 채로두면 부정 행위가 될 것입니다. sub esi, 4특히 쓰레기가 많지 않은 경우 3 바이트를 피하기 위해 LODSD / SCASD를 사용하는 것이 좋습니다 .


대체 비트 맵 전략 (x86-64 암시 길이 문자열의 경우)

bt r32,r32비트 인덱스의 가비지가 여전히 높기 때문에 바이트를 저장하지 않습니다 . 방법 shr이 문서화되어 있지 않습니다 .

bt / sbbCF로 비트를 가져 오거나 내보내는 대신 시프트 / 마스크를 사용하여 비트 맵에서 원하는 비트를 분리하십시오.

%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 / 0xFF 대신) AL에서 0/1이 생성되므로 xor al, 1( dec eaxx86-64에서 2B) 대신 (2B)를 사용 하여 함수 끝에서 반환 값을 필요한 반전으로 수행 할 수 있습니다. 여전히 올바른 bool/_Bool 반환 값을 생성 합니다.

이것은 높은 바이트의 EAX를 0으로 만들 필요가 없으므로 암시 적 길이의 문자열로 x86-64의 1B를 절약하는 데 사용되었습니다. (나는 and eax, 0x7F ^ 0x203 바이트로 나머지 eax를 대문자로 강제로 제로로 and r32,imm8사용했지만 지금은 이미했던 것처럼 대부분의 8086 명령어가 가지고있는 2 바이트 AL 코드 포함 인코딩을 사용하고 있습니다. 에 subcmp.)

32 비트 모드에서 bt/ salc로 손실 되며 명시 길이 문자열은 카운트에 ECX가 필요하므로 작동하지 않습니다.

그러나 나는 내가 틀렸다는 것을 깨달았다 : bt edx, eax여전히 도끼의 높은 쓰레기로 작동합니다. 그것은 분명히 마스크 변화는 계산 같은 방법 shr r32, cl않습니다 (CL의 낮은 5 비트에서만보고). 이는 bt [mem], reg주소 지정 모드 / 크기에서 참조하는 메모리 외부에서 액세스하여 비트 열로 취급 할 수있는와 다릅니다. (미친 CISC ...)

인텔의 insn set ref manual은 마스킹을 문서화하지 않으므로 인텔이 현재 보존하고있는 문서화되지 않은 동작 일 수 있습니다. (이런 경우는 드문 일이 아닙니다. bsf dst, srcsrc = 0을 사용하면 dst가 정의되지 않은 값을 유지하는 것으로 문서화 되었음에도 불구하고 dst는 항상 수정되지 않은 채로 남아 있습니다. AMD는 실제로 src = 0 동작을 문서화합니다.) Skylake 및 Core2에서 테스트했습니다. 그리고 bt버전은 AL의 외부 EAX에 비 제로 쓰레기와 함께 작동합니다.

깔끔한 트릭은 xchg eax,ecx(1 바이트)를 사용 하여 카운트를 CL로 가져옵니다. 불행하게도, BMI2 shrx eax, edx, eax는 5 바이트이며, 2 바이트 만입니다 shr eax, cl. 를 사용 bextr하려면 2 바이트 mov ah,1(추출 비트 수)가 필요하므로 SHRX + AND와 마찬가지로 5 + 2 바이트입니다.


%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
^.?$

온라인으로 사용해보십시오!

Neil 덕분에 2 바이트를 절약했습니다.

Martin 덕분에 2 바이트를 더 절약했습니다.

비 문자를 제거한 다음 모음을 1로 바꾸고 자음을 2로 바꾸어 일관된 값을 얻습니다. 그런 다음 첫 번째 문자와 마지막 문자가 동일한 경우 반복적으로 제거합니다. 그렇지 않은 경우, 1 ~ 0 개의 문자가 남아 있으면 단어가 대칭이됩니다.


않습니다 \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;

온라인으로 사용해보십시오!


타입 캐스팅을 앞에 추가 (bool)하고 $s===$s1 바이트를 저장하기 위한 확인을 제거 할 수 있습니다.
kaiser

내가 잘못 아니에요 경우 대체 할 수있는 (bool)단지로이 0||말을 ... 거짓, 또는 3 추가 바이트를 저장하는 대신.
kaiser

흠. 당신은 사용할 수 없습니다 \w에 대한 단어 대신 문자 a-z?
카이저

@kaiser \w는 숫자 밑줄과 문자를 포함합니다. 이것은 작동하지 않으며 [^/p{L}]더 이상 [^a-z]i입니다. 그래서 문자열로 반대 문자열을 비교 $s부울 만들 필요
요 르그 Hülsermann

사실입니다. 여전히 다른 사람들은 일해야합니다. "해야한다"…
카이저

6

MATL, 14 바이트

t3Y2m)13Y2mtP=

MATL Online 에서 사용해보십시오 .

다음 은 모든 테스트 사례를 확인하기 위해 약간 수정 된 버전입니다.

설명

        % 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"대신 "Martin Ender"로 시연합니까? 챌린지 제목을 다시 봐야합니다.
Roman Gräf

1
아마도 Suever는 첫 단계에서 약간의 필터링이있는 데모를 원했을 것입니다.
Greg Martin

그런 다음 "Alex A"를 사용해야합니다. 대신 마침표도 있습니다.
Outgolfer Erik

2
문제가 무엇인지 혼란 스럽습니다. 공백을 제거하면 실제로 true이고 그렇지 않으면 false이기 때문에 Martin Ender를 선택했습니다. 또한 모든 테스트 사례에 대한 링크를 포함했습니다
Suever

6

하스켈, 84 75 74 69 바이트

@nimi
덕분에 -10-@Zgarb 덕분에 -5

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

목록 이해는 각 문자를 부울로 바꾸고 다른 모든 문자를 제거합니다. 첫 번째 부분은 결과 목록이 회문인지 여부를 확인합니다.

온라인으로 사용해보십시오!


두 가지 팁 : 1) 비 포이트로 전환해야하더라도 목록 이해력이 filter뒤 따르는 것보다 종종 단축 map됩니다. 2) <$>id불필요하다. f x=(==)<*>reverse$[elem c"aeiouAEIOU"|c<-x,celem ['A'..'Z']++['a'..'z']].
nimi

당신은 사이의 공간을 놓을 수 c"하나 더 바이트를 위해.
nimi

1
내 생각 c`elem`['A'..'Z']++['a'..'z']으로 단축 할 수'@'<c,c<'{','`'<c||c<'['
Zgarb


4

Brachylog , 13 바이트

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

온라인으로 사용해보십시오!

설명

ḷ                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 바이트

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

온라인으로 사용해보십시오!

1진실로 출력 하고 거짓으로 출력 하지 않습니다.

설명

이 프로그램의 모든 명령은 서수 모드로 실행되지만 템플릿을 약간 꼬아 서 바이트를 저장할 수 있습니다. 줄 바꿈이 수용 가능한 진실한 값이면 동일한 방법으로 하나 이상의 바이트를 절약 할 수 있습니다.

선형화 된 프로그램은 다음과 같습니다.

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

자바 스크립트 (ES6), 72 69 바이트

Neil 덕분에 3 바이트 절약

부울을 반환합니다.

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

테스트 사례


두 개의 빈 문자열을로 바꾸어 몇 바이트를 절약하십시오 2.
Shaggy

1
당신 +''은 결국에 필요 합니까? 대신 3 바이트를 절약 할 수 있습니다.
Neil

@Neil의 아이디어가 더 좋습니다!
Shaggy

2

수학, 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의 문자열은 특별한 속성을 가진 코드 포인트 배열이므로 코드 포인트를 효율적으로 생성 할 수 있습니다. 이를 생성하는 방법은 다음과 같습니다.

먼저 범위 [0..122]를 생성합니다 z. 122는의 코드 포인트입니다 . 그런 다음 인덱스 65부터 요소에서 요소를 가져옵니다. 의 코드 포인트는 65입니다 A. 지금은 [65..122]입니다. 원치 않는 코드 포인트 ([91..96])가 있다는 점을 제외하고는 모두 괜찮습니다. 따라서 먼저 해당 범위를 복제합니다. 그런 다음 인덱스 26부터 요소를 가져오고 [91..122]를 갖습니다. 그 후, 인덱스 5까지의 요소를 얻습니다. 이제 [91..96]이됩니다. 마지막으로 [65..122]에서 해당 요소를 제거하여 wil [65..90, 97..122]로 남겨 둡니다. 이것이 우리가 원하는 코드 포인트입니다.

알파벳 상한 / 하한 코드 포인트 목록을 만들었으므로 필터링 기능을 계속합니다. 함수는 입력 문자열의 각 문자에 매핑되며, 처음에 말했듯이 대신 코드 포인트로 구문 분석됩니다. 그래서 지금 우리가 본질적으로 가지고 [codepoint, [65..90, 97..122]]. char codepoint이 문자 인지 확인하려면 목록에서 색인을 가져옵니다. 존재하지 않으면 -1대신 인덱스로 얻습니다 .

현재, 우리는 codepoint == 65목록, 즉 목록의 첫 번째 색인 인 경우에만 색인이 0 일 때만 잘못된 값을 얻습니다. 그러나 한 번의 증가로이 문제가 해결 될 것이며, 현재 codepoint목록에 있다면 , 우리는 색인 + 1을 얻습니다. 항상 양수이므로 항상 진실입니다. 그렇지 않으면 -1 + 1 = 0, 즉 거짓입니다.

마지막으로 입력 한 모든 문자에 설명 된 함수를 적용하고 함수가 정확한 결과를 반환 한 문자 만 가져옵니다.

다음으로 각 문자가 모음인지 자음인지 확인해야합니다. 모음은 자음보다 적으므로 모음을 만들어서 그 조건을 확인하는 것은 자음 줄을 만드는 것보다 짧으므로 각 문자가 모음인지 확인합니다. 그러나 부울리스트가 회 문형인지 확인하려면 부울이 필요합니다. 부울은 색인 + 1을 가져 와서 얻을 수는 없습니다. 그리고 대부분의 골프 언어 로서이 언어는 bool기능 이 없습니다 . 그래서, 우리는 단순히 사용 not not x하기 때문에, not항상 부울을 반환합니다. 하지만 기다려; 실제로 특정 부울을 가져야합니까? not항상 부울을 반환 하므로 두 번째를 제거하지 않는 이유는 무엇입니까?not실제로 각 문자가 자음인지 확인합니까? 그래, 바로 우리가 할 일이야!

부울 목록을 반환하는 확인 후, 우리는 우리가 가진이 부울 목록이 회문인지 확인합니다. 음, 회 문의 정의는 무엇입니까? 그렇습니다. 회문은 그와 같은 목록이나 문자열입니다. 우리는 어떻게 확인합니까? 간단하게, 우리는 그것을 복제하고 그 반대를 취하여 원래 목록과 비교합니다. 우리가 얻는 결과는 마침내 코드가 반환 해야하는 것입니다.


1
42 바이트 프로그램에 대한 대단한 설명. 이제는 설명이 거의 필요없는 것 같습니다 ...
Outgolfer Erik

2

PHP , 87 바이트

정규식 무료 PHP 버전. stripos가 0을 반환 할 수 있기 때문에 "모음"을 추가했습니다. PHP에서는 false입니다.

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);그러나 그것은 0을 포함하는 문자열에 대한 올바른 결과를 얻습니다
Jörg Hülsermann

@ JörgHülsermann 감사합니다.
ME

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 바이트; reversek 상당으로 전환|:

2

CJam , 26 바이트

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

온라인으로 사용해보십시오!

Esolanging Fruit 덕분에 -1 .


당신은 대체 할 수 26,'af+'{,97>바이트를 저장합니다.
Esolanging Fruit

@EsolangingFruit 그런 오래된 대답 ...
Outgolfer Erik

반 년 전에 저장된 바이트는 지금 저장된 바이트와 다르지 않습니다. 바이트 인플레이션이나 다른 것은 없습니다 : P
Esolanging Fruit

@EsolangingFruit 나는 골프에 대한 나의 발전하는 경험을 언급하고 있었다.
Outgolfer Erik

2

Braingolf,  4  3 바이트

&JP

Outgolfer Erik 덕분에 -1 바이트

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가요?
Outgolfer Erik

@EriktheOutgolfer 내가 인증 된 바보이기 때문에
Skidsdev

흠, 당신은 설명에서 그것을 제거하는 것을 잊었다.
Outgolfer Erik

@EriktheOutgolfer 나는 "Erick"이라고 쓴 다음 c를 쳤다. 그러나 "Eriek"처럼 보인다
Skidsdev

좋아하는 사람에게는 이것이 실패하지 Alex A.않습니까?
얽히고 설킨

1

파이썬 2, 83 바이트

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

True또는 제공하는 기능을 정의합니다False


"aeiouAEIOU".__contains__대신을 사용하여 2 바이트를 절약 할 수 있습니다 lambda y:y.lower()in"aeiou".
Blender




1

배쉬 , 82 바이트

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

온라인으로 사용해보십시오!

이름을 매개 변수로 수신하고, 문자가 아닌 문자를 제거하고, 모음을 0으로, 모음이 아닌, 0을 1로 바꾸고, 반대로 반전 한 것과 비교합니다.

이중 또는 삼중 치환 을 할 수 있다면 골프를 더 할 수 있습니다.

종료 상태는 true이고 0은 no입니다.


최근 bash 버전에서는 대문자 i=${i^^*};로 변환 i됩니다. 그러나 나는 그것이 당신에게 비용을 절약 하는 10B보다 작은 a-zand를 절약한다고 생각합니다 aeiou.
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

PowerShell, 108 바이트

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

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.