ユーザー感謝の課題#1:デニス♦


53

私は、PPCGコミュニティがすべての人にとって、あるいは多分私だけのために楽しい場所になるのを助け、これからも助けてくれるユーザーの一連の挑戦をするという自発的なアイデアを得ました。:P

Dennisの名前を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ですか?
コイナーリンガーをケアします。

@cairdcoinheringaahing思い出させてくれてありがとう。Mego(TNB RO、イタリック体)についての話になりますが、まだ最終決定に至っていません。
ハイパーニュートリノ

私は彼に言うべきですか、それとも魚を探すために彼はただ水に飛び込むでしょうか?
コイナーリンガーをケアします。

@cairdcoinheringaahing私は彼がすでに知っていると確信しています。私は彼について何かをするつもりだと言ったが、ペンギンやTNBに関連する何かをするかどうかはまだ決めていない。
ハイパーニュートリノ

ペンギンを数えます。それは彼が知っていることです(私にとって)
5

回答:


15

05AB1E、9バイト

žM¹álSåÂQ

オンラインでお試しください!

-2 Adnanに感謝します。

これは、ゼリーの痛みのポイントを正確に攻撃します。これは、使用していますlし、Aゼリーのために、1バイトの同等物ŒlØaそれぞれ。


これは確かに機能しますか?これを実行
-MCCCS

@MCCCSうーん、あなたは正しいかもしれません。
エリックアウトゴルファー

あなたは置き換えることができますによってáおよびDRによってÂ
アドナン

@Adnanを忘れたá、何をÂしたのかわからなかった、ありがとう!
エリックアウトゴルファー

11
これらのゴルフの言語のほとんどは、256種類の文字と六角をマップするカスタムコードページを使用@alexis 00FFそれらの256個の文字を、ゼリーの答えを参照
スティーブン


13

x86 32ビットマシンコード関数、42 41バイト

現在、ゴルフ言語以外の最短の回答で、@ streetsterのq / kdb +よりも1B短くなっています。

真実の場合は0、偽の場合は0以外:41 40バイト。 (一般的に、32ビットでは1バイト、64ビットでは2バイト節約されます)。

暗黙の長さの文字列(Cスタイル0で終了):45 44バイト

(X32 ABIのような32ビット・ポインタを有する)x86-64の機械コード44 43バイト

暗黙の長さの文字列を持つx86-64、まだ46バイト(シフト/マスクビットマップ戦略は損益分岐点になりました)。

これはC署名付きの関数_Bool dennis_like(size_t ecx, const char *esi)です。呼び出し規約はやや非標準で、MS vectorcall / fastcallに近いですが、異なる引数レジスタ(ESIの文字列とECXの長さ)があります。arg-regsとEDXのみを破壊します。ALは戻り値を保持し、上位バイトはガベージを保持します(SysV x86およびx32 ABIで許可されています。boolまたは狭い整数を返すときのMSのABIが高ガベージについて言うIDK)。


アルゴリズムの説明

入力文字列をループし、スタック上のブール配列にフィルタリングおよび分類します。各バイトについて、アルファベット文字であるかどうかを確認し(そうでない場合は次の文字に進みます)、0-25(AZ)の整数に変換します。母音= 0 /子音= 1のビットマップをチェックするには、0〜25の整数を使用します。(ビットマップは、32ビットの即時定数としてレジスタにロードされます)。ビットマップの結果に応じて、スタックに0または0xFFをプッシュします(実際には、32ビット要素の下位バイトで、上位3バイトにゴミがある可能性があります)。

最初のループは、0または0xFFの配列を生成します(ゴミで埋められたdword要素内)。通常の回文チェックは、ポインタが中央で交差するとき(または、アルファベット文字の数が奇数の場合に両方が同じ要素を指すとき)に停止する2番目のループで行います。上に移動するポインターはスタックポインターであり、POPを使用して読み込みとインクリメントを行います。このループでは、compare / setccの代わりに、XORを使用して、2つの可能な値しかないため、同じ/異なるものを検出できます。一致しない要素が見つかったかどうかを(ORを使用して)累積できますが、XORによって設定されたフラグのアーリーアウトブランチは、少なくとも同等です。

2番目のループはbyteoperand-sizeを使用するため、最初のループが各配列要素の下位バイトの外側に残すゴミを気にしないことに注意してください。


文書化さsalcれていない命令を使用して、同じ方法でCFからALを設定しsbb al,alます。Knight's Landingも含め、すべてのIntel CPU(64ビットモードを除く)でサポートされています! Agner Fogは、すべてのAMD CPU(Ryzenを含む)でのタイミングもリストしているため、x86ベンダーが8086以降、そのバイトのオペコードスペースを使用すること要求する場合は、それを利用することもできます。

興味深いトリック:

  • isalpha()とtoupper()を組み合わせたunsigned-compareトリック。eaxを埋めるためにバイトをゼロ拡張し、次の設定を行います。
  • 以下のためのレジスタとイミディエイトビットマップbtのためのいくつかの素晴らしいコンパイラの出力に触発されましたswitch
  • プッシュインループでスタック上に可変サイズの配列を作成します。(asmの標準ですが、暗黙の長さの文字列バージョンではCでできることではありません)。すべての入力文字に対して4バイトのスタックスペースを使用しますが、最適なゴルフの周りで少なくとも1バイトを節約しstosbます。
  • ブール配列のcmp / setneの代わりに、ブール値をXORして直接真理値を取得します。(cmp/ salcsalcCFでのみ動作し、0xFF-0はCFを設定しないため、オプションではありません sete。3バイトですがinc、ループの外側を回避します。2バイトの純コスト(64ビットモードで1 ))vs. xor in the loop and infix with 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

これはおそらく最速の答えの1つでもあります。少なくとも4倍のメモリ使用量が多くのキャッシュミスを引き起こさない数千文字未満の文字列の場合、ゴルフはそれほどひどく痛くないからです。(すべての文字をループする前にデニスのような文字列を早期に取得する回答も失われる可能性があります。) 多くのCPU salcよりも遅いsetcc(たとえば、Skylakeで1 uopに対して3 uops)が、ビットマップチェックではbt/salc文字列検索や正規表現一致よりも高速です。また、起動時のオーバーヘッドがないため、短い文字列には非常に安価です。

オンザフライで1つのパスで行うと、上下方向の分類コードを繰り返すことになります。それは高速ですが、コードサイズが大きくなります。(もちろん、高速にしたい場合は、SSE2またはAVX2で一度に16文字または32文字を実行できますが、符号付き範囲の下部に範囲をシフトする比較トリックを使用します)。


テストプログラム(ia32またはx32 Linux用)は、cmdline argを使用してこの関数を呼び出し、status =戻り値で終了します。 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バイトではなく2バイトのみですsetc al。それはまたのために余分なバイトが必要になりますdecnot(32ビットのみが1バイトのINC] / [DEC R32を持っているので)最後に。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ビットバージョンをテストするには、ポインターregsを64ビットに変更できます。(その後、単純にカウントからREX.W = 1プレフィックス(0x48バイト)の数を減算します。この場合、64ビットregで動作するには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をクリアする必要があります。入場時にクリアされたものの、退場時にセットされたままにすると、不正行為となるIMO。sub esi, 4特に高ガベージがない場合、LODSD / SCASDを使用して3バイトを回避するとよいでしょう。


代替ビットマップ戦略(x86-64の暗黙的な長さの文字列の場合)

bt r32,r32ビットインデックスのガベージが多い場合でも動作するため、これはバイトを節約しません。方法shrが文書化されていないだけです。

bt / sbbビットをCFに入れたり出したりする代わりに、シフト/マスクを使用して、ビットマップから必要なビットを分離します。

%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

これにより、最後にALで0/1が生成されるため(0 / 0xFFではなく)、関数の最後で戻り値の必要な反転をxor al, 1dec eaxx86-64でも2B )ではなく(2B)で行うことができますそれでも適切なbool/_Bool戻り値を生成します。

これは、EAXの上位バイトをゼロにする必要を回避することにより、暗黙的な長さの文字列でx86-64の1Bを節約するために使用されていました。(and eax, 0x7F ^ 0x203バイトでeaxの残りを強制的に大文字にしてゼロにするために使用していましたがand r32,imm8、今ではほとんどの8086命令が持っているように、ほとんどの8086命令が持っている2バイトのALエンコードを使用しています用subしてcmp。)

32ビットモードではbt/ に失われsalc、明示的な長さの文字列はカウントにECXを必要とするため、そこでも機能しません。

しかし、それから私は自分が間違っていることに気付きました。bt edx, eaxそれでも、eaxの高いゴミで動作します。それは明らかにマスクシフト数えるのと同じ方法がshr r32, clない(唯一のCLの低5ビットを見て)。これはbt [mem], reg、addressing-mode / sizeによって参照されるメモリの外部にアクセスでき、ビット文字列として扱うことができるとは異なります。(クレイジーCISC ...)

Intelのinsn set refマニュアルはマスキングを文書化していないため、Intelが現在保存している文書化されていない動作の可能性があります。(そのようなことは珍しいことではありません bsf dst, src。src= 0を使用すると、dstが未定義の値を保持することが文書化されていますが、常にdstは変更されません。AMDは実際にsrc = 0の動作を文書化します。)SkylakeとCore2でテストしましたこのbtバージョンは、ALの外部のEAXでゼロ以外のガベージで動作します。

ここでの巧妙なトリックは、xchg eax,ecx(1バイト)を使用してカウントをCLに入れることです。残念ながら、BMI2 shrx eax, edx, eaxは5バイトで、vs.2 はわずか2バイトですshr eax, cl。を使用bextrするにはmov ah,1(抽出するビット数に対して)2バイトが必要なので、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
ニール

@ニールはい、いいね!
-FryAmTheEggman

よくやった。私はこれをやろうとしていた:(
クリストファー

7

PHP、82バイト

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

オンラインでお試しください!


型キャストを追加(bool)$s===$sチェックを削除して1バイトを節約できます。
カイザー

間違っていない場合は、falseを言う(bool)だけで0||を置き換える、代わりに3バイトを節約できます。
カイザー

ふむ あなたは使用できませんでした\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

「デニス」ではなく「マーティン・エンダー」でデモンストレーションしますか?私は再びチャレンジタイトルを見なければなりません。
ローマングラフ

1
おそらく、Sueverは最初のステップである程度のフィルタリングを行うデモを望んでいました。
グレッグマーティン

次に、「Alex A」を使用する必要があります。代わりに、期間もあります。
エリックアウトゴルファー

2
私は問題が何であるか混乱しています。Martin Enderを選択したのは、スペースを削除すると実際にtrueになり、そうでなければfalseになるからです。私はまた、すべてのテストケースへのリンクが含ま
Suever

6

Haskell、84 75 74 69バイト

-10 @nimiに
感謝-5 @Zgarbに感謝

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

リスト内包表記では、各文字がブール値に置き換えられ、他のすべての文字が削除されます。最初の部分では、結果のリストが回文であるかどうかを確認します。

オンラインでお試しください!


2つのヒント:1)リストを理解することは、非poitfreeに切り替える必要がある場合でも、filterその後に続くよりもしばしば短くなりmapます。2)<$>idは不要です。f 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不変演算子Iを使用)
カールカストール

@KarlKastorそのようなオペレーターがいなければならないことは知っていました...ありがとう。(ところで私も今削除することができzます、引用された入力を仮定します)
エリックアウトゴルファー


3

アリス、28バイト

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

オンラインでお試しください!

出力 1真実として、偽物としてはしません。

説明

このプログラムのすべてのコマンドは通常モードで実行されますが、テンプレートを少しひねってバイトを保存できます。改行が受け入れられる真理値であれば、同じ方法でもう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

JavaScript(ES6)、72 69バイト

ニールのおかげで3バイト節約

ブール値を返します。

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

テストケース


2つの空の文字列をに置き換えて、数バイトを節約します2
シャギー

1
あなたも+''最後に必要ですか?代わりに3バイト節約できます。
ニール

@Neilのアイデアがもっと好きです!
シャギー

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%=

オンラインでお試しください!

難しい部分は、1つの文字列に大文字と小文字の両方のアルファベットを生成することです。これをフィルター関数で使用して、入力から文字をフィルター処理します。幸いなことに、GolfScriptの文字列は特別なプロパティを持つ単なるコードポイント配列であるため、効率的な方法でコードポイントを生成することができます。生成方法は次のとおりです。

まず、範囲[0..122]を生成します。122はのコードポイントですz。次に、インデックス65以降の要素から要素を取得します。65はのコードポイントですA。現在、[65..122]があります。不要なコードポイント([91..96])がそこにあることを除き、すべて問題ありません。そのため、最初にその範囲の複製を作成します。次に、インデックス26以降の要素を取得し、[91..122]を取得します。その後、インデックス5までの要素を取得します。[91..96]があります。最後に、これらの要素を[65..122]から削除し、[65..90、97..122]のままにします。これらは私たちが望むコードポイントです。

アルファベットの上位/下位コードポイントリストを作成したので、フィルタリング機能を継続します。関数は入力文字列の各文字にマップされます。最初に言ったように、その文字列は代わりにコードポイントとして解析されます。だから今、私たちは本質的に持ってい[codepoint, [65..90, 97..122]]ます。char codepointが文字であるかどうかを確認するには、作成したリストでそのインデックスを取得します。存在しない場合は-1、代わりにインデックスとして取得します。

現時点では、falseの値を取得するのcodepoint == 65は、インデックスが0になるため、リストの最初のインデックスである場合のみです。しかし、1つの増分でこの問題が修正さcodepointれ、リストにある場合、そのインデックス+ 1を取得します。これは常に正の数であり、したがって常に真実です。一方、存在しない場合は-1 + 1 = 0、つまり偽になります。

最後に、説明した関数を入力のすべての文字に適用し、関数が真の結果を返した文字のみを取得します。

次に、各文字が母音か子音かを判断する必要があります。母音は子音よりも少ないため、その条件を確認するために母音の文字列を作成することは、子音の文字列を作成するよりも短いため、各charが母音であるかどうかを確認します。しかし、ブールリストが回文であるかどうかを確認するには、ブール値が必要です。これは、インデックス+ 1を取得するだけでは取得できません。なぜなら、charが母音の場合、[1..10] また、ほとんどのゴルフ言語と同様、この言語にもbool機能はありません。したがって、常にブール値を返すためnot not x、単にを使用しnotます。ちょっと待って; 本当に特定のブール値が必要ですか?not常にブール値を返すので、なぜ2番目を削除しないのですかnot、実際に各文字が子音かどうかを確認しますか?ええ、それはまさに私たちがやることです!

ブール値のリストを返すチェックの後、取得したこのブール値リストが回文であるかどうかをチェックします。これがこのチャレンジで求められることです。さて、回文の定義は何ですか?はい、回文はその逆に等しいリストまたは文字列です。それでは、どのように確認しますか?単純です。複製し、その逆を取り、元のリストと照合します。最終的に得られる結果は、コードが返すものです。


1
42バイトプログラムの巨大な説明。今私は...それはかなり自明だと思います
エリックOutgolfer

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);それはゼロが含まれている文字列の正しい結果を得る
イェルク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%=

オンラインでお試しください!

-1 Esolanging Fruitに感謝します。


を置き換え26,'af+'{,97>バイトを保存できます。
エソランジングフルーツ

@EsolangingFruitそのような古い答え...
エリックアウトゴルファー

半年前に保存されたバイトは、現在保存されているバイトと同じです。バイトインフレーションなどはありません:P
エソランジングフルーツ

@EsolangingFruit私はいつもゴルフの経験を積んでいます...もちろんあなたはいつものようにクレジットを得ました、心配しないでください!
エリックアウトゴルファー

2

Braingolf、 4  3バイト

&JP

Erik the Outgolferのおかげで-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ですか?
エリックアウトゴルファー

@EriktheOutgolfer私は認定バカだから
Skidsdev

うーん、説明からそれを削除するのを忘れた。
エリックアウトゴルファー

@EriktheOutgolfer「Erick」と書いてからcを
打ち抜いたが、

のようなもののためにこれは失敗しません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


"aeiouAEIOU".__contains__代わりにを使用すると、2バイト節約できます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` ]

オンラインでお試しください!

パラメータとして名前を受け取り、非文字を削除し、母音を0に置き換え、非母音も0も1に置き換え、同じものと比較します。

ダブルまたはトリプル置換を動作させることができれば、さらにゴルフをすることができます

終了ステータスは、真の場合は0、いいえの場合は1です。


最近のbashバージョンでは、大文字にi=${i^^*};変換さiれます。しかし、節約できるのはan a-zとan だけaeiouで、コストは10B未満です。
ピーターコーデス

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.