アルファベットポジションファインダー


10

Codewars Kataに触発されました。

あなたの目標は次のような入力文字列を取ることです:

"'Twas a dark and stormy night..."

次のように、スペースで区切られ、アルファベット以外の文字を無視して、アルファベットの各文字の位置を含む文字列を返します。

"20 23 1 19 1 4 1 18 11 1 14 4 19 20 15 18 13 25 14 9 7 8 20"

追加の課題として、元の文字列の数字を自分自身+ 27に置き換えることができます。たとえば、"25"になり"29, 32"ます。これは完全にオプションです。

あなたは1-インデックスを使用する必要があります('a'==1'b'==2、など)

追加のルール:

  • 配列ではなく文字列を返す必要があります。

  • 末尾の空白は問題ありません。

勝者はバイト数が最も少ないです。

幸運を!



5
@TheoCなんで?一般的なコンセンサスは、回答が適切な形式で出力できるようにすることです。膨らみが多すぎて、スペースでより短い方法で結合できる言語に不公平になる可能性があるためです。
Okx 2018年

1
@TheoCなぜ両方を許可しないのですか?
Okx

3
PPCGへようこそ!これは全体的にまともなチャレンジですが、次回チャレンジを投稿するときは、次の点に注意してください。1)この課題は非常に簡単です。オプションの部分が必須だった場合はもっとおもしろいと思います(ただし、今はその部分を変更しないでください。手遅れです)。2)あなたはいくつかの任意の部分についてかなり制限的です。配列を許可しないのはなぜですか?それはより当社の基準だ文字の配列がある文字列このスレッドを読んでアイデアを得ることをお勧めします。
James

2
将来の注意:1と0のインデックス付けは通常1つと同じであり、通常両方が許可されます。また、出力形式の制約は避けられます。値のリストの場合は、言語が形式を決定します。課題は、出力のフォーマットに関するものではなく、インデックスのシフトに関するものでもありません。したがって、言語が自然にやっていることを実行できるようにして、課題の意図に焦点を当てることができる場合、それは制約ではありません。
マジックタコの壷2018年

回答:


5

05AB1E、(5?)7 バイト

右端の2バイトは出力フォーマットです

áÇ32%ðý

ポート私のゼリーの答えが、O5AB1Eはアルファベットのフィルタリングのための、より簡潔です。

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

どうやって?

áÇ32%ðý - take input implicitly
á       - filter keep alphabetical characters
 Ç      - to ordinals
  32    - thirty-two
    %   - modulo (vectorises)
     ð  - push a space character
      ý - join

OPはスペースで分割して印刷する必要があるため、末尾ðýを追加できます。しかし、回答の出力リストは半分になっているので、ここではそのままにしておきます。
Kevin Cruijssen、2018年

ああ。私は私の答えでそれを逃しました...
ジョナサンアラン

5

Java 8、82 78 72 69 69 62バイト

s->{for(int c:s)System.out.print(c>64&~-c%32<26?c%32+" ":"");}

@OlivierGrégoireのおかげで-13バイト。

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

説明:

s->                    // Method with character-array parameter and no return-type
  for(int c:s)         //  Loop over its characters as integers
    System.out.print(  //   Print:
     c>64&~-c%32<26?   //    If the current character is a letter:
      c%32+" "         //     Print the position in the alphabet with a trailing space
     :                 //    Else:
      "");}            //     Print nothing

1
s->s.chars().forEach(c->{if(c>64&~-c%32<26)System.out.print(c%32+" ");})(72バイト)。
オリヴィエ・グレゴワール

1
@OlivierGrégoireありがとう!そして、それを三項ifに変更することにより、さらに-3バイト。:)
Kevin Cruijssen、2018年

s->{for(int c:s)System.out.print(c>64&~-c%32<26?c%32+" ":"");}(62バイト)char[]入力の代わりにaを使用しStringます。
OlivierGrégoire18年


4

R55 50バイト

cat(utf8ToInt(gsub("[^A-Za-z]","",scan(,"")))%%32)

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

、STDINからの入力を読み取り、大文字に変換削除し、非大文字のアルファベット文字、コードポイントに変換64の減算スペースで区切られた32により改造、およびstdoutに印刷、。

ゴルフをしてくれたKevin Cruijssenに感謝!



@KevinCruijssen * facepalm * duh
ジュゼッペ

私は質問に2つのコメント(質問)を追加しました-回答に応じて、これを46文字または39文字まで下げる機会があります。
JayCe

1
あなたは47を使用して行うことができます[^A-z]
MickyT 2018年

4

APL(Dyalogユニコード)24、20、14の、13バイト

Zacharý(およびXcoder氏)のおかげで-4バイト!

アダムのおかげで-6バイト!

ngnのおかげで-1バイト!

A⍳⎕A∩⍨≡819⌶⊢

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

説明:

        819⌶⊢  - to uppercase
   A∩⍨         - intersect with the letters A-Z (args swapped to preserve the order)
                 - index in
A               - the A-Z letters list

私の最初の解決策:

APL(Dyalog Unicode)24 20バイト

{⍵/⍨27>⍵}⎕A1(819⌶)⊢

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

説明:

                        indices of     
              1(819⌶)⊢  the right argument (⊢) changed to uppercase
          A            in the list of uppercase letters
{⍵/⍨     }              copy (filter) those items from the list of indeces
     27>⍵               which are smaller than 27 (all non A-Z chars will have index 27)

私を笑わないでください。APLは初めてです。


1
これは、APLを初めて使用する人にとっては非常に便利です。括弧は必要ありません。想定されています。また、{1(819⌶)⍵}することができます1(819⌶)⊢。そうでなければ、素晴らしい仕事です!今後、APLをお楽しみください。
ザカリー

@Zacharýありがとう!私はそう願っています(私はJについてある程度の知識があります。私は配列言語にまったく慣れていません)
Galen Ivanov

1
Zacharyが指摘したように、括弧は想定されているため、バイトカウントに含める必要はなく、20バイトになります。
Xcoder氏、18年

1
@ジョナ私は説明を追加しました。あなたは正しい、活用しているとアルファベット自体がよりJ.に多くの費用がかかる
ガレン・イワノフ

1
良くやった!あなたは、合成してバイトを保存することができます1819⌶直接27Sを除去することにより、5割引:27~⍨⎕A⍳819⌶⍨∘1; :またはアルファベットで交差点を取る⎕A⍳⎕A∩⍨819⌶⍨∘1
アダム

3

Python 2、(45?)55バイト

出力をフォーマットするために11バイトが追加されました。これにより、これもPythonと互換性がなくなります3)

lambda s:' '.join(`ord(c)%32`for c in s if c.isalpha())

私のゼリー回答の別のポート。

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


フォーマットされていないバージョン(整数のリストを返す):

lambda s:[ord(c)%32for c in s if c.isalpha()]

1
OPは残念ながらスペースで区切られた文字列出力を
Sok

1
うん-私は私のすべての答えでそれを逃しました-1つはサイトの規範にとても慣れます!
ジョナサンアラン

3

JavaScript(Node.js)69 55 54バイト

t=>t.match(/[a-z]/gi).map(i=>parseInt(i,36)-9).join` `

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

説明 :

t =>                       // lambda function accepting a string as input
    t.match(/a-z/gi).      // returns all parts of string that match as an array 
        map(i=>            // map over that array with argument i 
            parseInt(i,36) // convert to base 36 
                - 9        // and subtract 9 from it
        ).                 // end map
        join` `            // convert to space separated string

@Kevinのおかげで11バイト節約

@Neilのおかげでさらに1バイト


いくつかの追加バイトの数値のサポートを追加できます(@neilに感謝)

JavaScript(Node.js)、62バイト

t=>t.match(/[^_\W]/g).map(i=>(parseInt(i,36)+26)%36+1).join` `

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


変更することにより、-11バイトa-zまでA-Za-zi.toLowerCase().charCodeAt()-96するi.charCodeAt()%32
ケビンCruijssen

1
parseInt(i,36)-9別のバイトを保存します。
ニール、

.match(/[^_\W]/g).map(i=>(parseInt(i,36)+26)%36+1)数値をサポートできますが、それが最善の方法かどうかはわかりません。
ニール、

2

ゼリー(7?)8 バイト

右端のバイトは出力フォーマットです

fØẠO%32K

結果をSTDOUTに出力するPython形式の文字列を受け入れる完全なプログラム

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

どうやって?

fØẠO%32K - Main Link: list of characters (created from the string input)
 ØẠ      - yield the alphabet = ['A','B',...,'Z','a','b',...,'z']
f        - filter keep (discard non alphabet characters)
   O     - ordinals          ('A':65, 'Z':90, 'a':97, 'z':122, etc.)
     32  - literal thirty-two
    %    - modulo            (65:1,   90':26,  97:1,  122:26,  etc.)
       K - join with spaces (makes a list of characters and integers)
         - implicit print


2

x86オペコード、35バイト

0080h: AC 3C 24 75 04 88 45 FF C3 0C 20 2C 60 76 F1 D4
0090h: 0A 0D 30 30 86 E0 3C 30 74 01 AA 86 E0 AA B0 20
00a0h: AA EB DD                                       

f:  lodsb
    cmp al, '$'
    jnz @f
        mov [di-1], al
        ret
    @@:
    or al, 32
    sub al, 96
    jbe f
    aam
    or ax, 3030H
    xchg ah, al
    cmp al, 48
    jz @f
        stosb
    @@:
    xchg ah, al
    stosb
    mov al, 32
    stosb
    jmp f

結果に少なくとも1つの文字が含まれ、 {|}~

40バイト、すべてのASCII文字を許可

0080h: AC 3C 24 75 04 88 45 FF C3 0C 20 2C 60 76 F1 3C
0090h: 1A 77 ED D4 0A 0D 30 30 86 E0 3C 30 74 01 AA 86
00a0h: E0 AA B0 20 AA EB D9                           

「x86オペコード」とは何ですか?これは単なるx86マシンコードの提出ですか?
ヤコブ

@Jakob true。ここでは「.COM」とは言わないでください。これは関数であり、「。
COM

うーん。ええ、マシンコードソリューションは完全な実行可能ファイルである必要はないと想定されていると思います。「x86マシンコード」というラベルを付ける方が実際には良いかもしれません
Jakob

2

Stax9 10 9 バイト

üpÉÿ%}},√

実行してデバッグする

@recursiveによる-1バイト

説明:

v{VaIvm0-J Full program, unpacked, implicit input
v          Lowercase
 {    m    Map:
  VaI        Index in lowercase alphabet (0-based, -1 for not found)
     ^       Increment
       0-  Remove zeroes
         J Join by space
           Implicit output

Stax、7 バイト

É▌Xl»↔"

実行してデバッグする

これは改行で区切られて出力されます。開梱:vmVaI^|c。同様ですが、マップがあり、暗黙的に末尾の改行で出力されます。


うーん。宇宙で終わるプログラムのパッキングに問題があるようです
再帰的な

@recursiveああ、それに気づきませんでした(通常はリンクを試しますが、どうやらここでは忘れていました)。回避策を追加しました。
wastl

このバグにも気づかなかった。Staxの次のリリースで修正します。既存のパックされたプログラムは変更されません。
再帰的

ここにあなたのトラブルのための9つのバックがあります。
再帰的

2

空白152 117バイト

@Lynnのおかげで-35バイト。

[N
S S N
_Create_Label_LOOP][S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   S _Read_STDIN_as_character][T   T   T   _Retrieve][S N
S _Duplicate_input][S S S T S S S S S N
_Push_32][T S T T   _Modulo][S N
T   _Swap_top_two][S S S T  T   T   T   T   T   N
_Push_63][T S T S _Integer_divide][T    S S N
_Multiply][S N
S _Duplicate][S S S T   T   S T T   N
_Push_27][S T   S S T   N
_Copy_1st][S S S T  N
_Push_1][T  S S S _Add][T   S T S _Integer_divide][T    S S N
_Mulitply][N
T   S N
_If_0_Jump_to_Label_LOOP][T N
S T _Print_as_number][S S S T   S S S S S N
_Push_32_space][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

文字S(スペース)、T(タブ)、およびN(改行)が強調表示としてのみ追加されました。
[..._some_action]説明としてのみ追加されました。

オンラインでお試しください(未加工のスペース、タブ、改行のみを使用)。

疑似コードの説明:

Start LOOP:
  Character c = STDIN as character
  Integer n = (c modulo-32) * (c integer-divided by 63)
  Integer m = 27 integer-divided by (n + 1) * n;
  If(m == 0):
    Go to next iteration of LOOP
  Else:
    Print n as integer to STDOUT
    Print a space to STDOUT
    Go to next iteration of LOOP

1
私はそれをホワイトスペースで書く時間はありませんが、多分あなたはこの
リン

1
それは117バイトのようです!(*私はコードで64から63に変更しました。これは同等ですが、空白で表すのに短いためです):)
Lynn

@Lynn悪くはない、そこに-35バイト。ありがとう。:)
Kevin Cruijssen



1

チャコール、21バイト

≔⁺β⭆χιβF↧S¿№βι«I⊕⌕βι→

オンラインでお試しください!リンクはコードの詳細バージョンです。説明:

≔⁺β⭆χιβ

事前定義された小文字の変数に数字を追加します。

F↧S

小文字の入力をループします。

¿№βι«

現在の文字が文字または数字の場合、

I⊕⌕βι

1インデックスのインデックスを出力します。

次の値のためのスペースを残します。


1

、93バイト

func[s][a: charset[#"a"-#"z"]parse lowercase s[any[copy c a(prin[-96 + to-char c""])| skip]]]

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


Redについてはよくわかりませんが#"a"-#"z"、小文字と大文字の両方に変更できます。そして、lowercase削除することができます。そして、-96 + to-char cモジュロ32にすることができますか?それでも、赤でバイトを節約できるかどうかはわかりません。
Kevin Cruijssen、

@Kevin Cruijssenおかげで、後で試してみる
Galen Ivanov

@KevinCruijssen parse関数は、一致が1文字の場合でも文字列を収集するため、常にが必要to-charです。大文字の場合、文字セット# "A"-# "Z"に追加する必要があります。これにより、(もしあれば)除去の効果が損なわれlowercaseます。
Galen Ivanov

ええ、私はそれが1バイトだけ短いので#"A"-#"Z"、と比較してそれほど多くを得ることができないかもしれないとちょっと恐れていましたlowercase。そして、私はあなたがを必要とすることを知っていましたが、modulo-32のサイズが似てto-charいるかどうかは-96 + わかりませんでした。
Kevin Cruijssen


1

PHP、70バイト

for(;$c=$argv[1][$i++];)if(($c=ord($c))>64&($c%=32)>0&$c<27)echo"$c ";

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

ケビンのおかげで-5バイト


ここではスニペットを送信することはできませんが、関数または完全なプログラムにすることができます。
Nissa、

申し訳ありませんが、今では入力として最初の引数使用しています
user2803033

こんにちは、PPCGへようこそ!あなたがまだの場合は、PHPでのゴルフのためのヒント<すべての言語>でゴルフのためのヒントは通じ読んでも面白いかもしれません。あなたがゴルフできるパーツに関しては:&&することができ&ord(strtolower($c))-96することができますord($c)%32。また、~以前は削除できると思いますが$c、よくわかりません。PHPであまりプログラミングしておらず、何~を使っているのか本当にわかりません。
Kevin Cruijssen、

ご入力いただきありがとうございます。Mod 32は良い考えです。これは、いくつかのバイトを節約できますが、必ずORD($ cを)作るために追加のチェックを要求する64より大きい
user2803033

1

Perl 5、35 -pバイト

$_="@{[map{(-64+ord uc)%43}/\w/g]}"

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

数字に関する余分な部分を含みます。


1
/\w/ 含む _
Brad Gilbert b2gills

私が遊んでいたものよりもずっと小さい!あなたは使用して、1つのバイトを保存し、BradGilbertb2gillsは言及@バグを修正することができます-F/[^0-9\pL]|/オンラインそれをお試しください!
ドンヘイスティングス

1

ジャプト 2.0 -S、9つのバイト

f\l ®c %H

オンラインで実行する

説明:

f\l ®c %H                                    Input: "Hello..."
f            Match:
 \l             [A-Za-z]                     ["H","e","l","l","o"]
    ®        Map Z over the results:
     c         char-code of Z                [72,101,108,108,111]
       %H      mod 32                        [8,5,12,12,15]
-S           Join the chars with a space     8 5 12 12 15

1

Perl 6、32バイト(アルファ)、41バイト(アルファ+数字)

{~(.uc.comb(/<:L>/)».ord X-64)}

試してみる(32バイトのアルファ版)

{~((.uc.comb(/<:L+:N>/)».ord X-64)X%43)}

試す(41バイトの英字+数字)

拡張:

32バイトのアルファ

{  # bare block lambda with implicit parameter $_

  ~( # coerce to string (space separated)

      .uc                      # uppercase
      .comb( / <:L > / )\      # get letters as a sequence
      ».ord                    # get the ordinal of each
      X- 64                    # subtract 64 from each
  )
}

41バイトのアルファ+数字

{  # bare block lambda with implicit parameter $_

  ~( # coerce to string (space separated)
    (
      .uc                      # uppercase
      .comb( / <:L + :N > / )\ # get letters and numbers as a sequence
      ».ord                    # get the ordinal of each
      X- 64                    # subtract 64 from each
    ) X% 43                    # modulus 43 for each
  )
}

これはのような非ASCII文字にも一致Эしますが、入力がASCIIのみかどうかについてOPに説明を求めました。
ジョーキング


1

PHP 108の 105バイト

オンラインで試す(108バイト)

オンラインで試す試す(105バイト)

-3バイト、@ manassehkatzのおかげ(strtolowerのレベルを変更し、正規表現からAZを削除)

コード、ループを回避しようとしました

<?=strtr(implode(" ",str_split(preg_replace(
"/[^a-z]/",'',strtolower($argv)))),array_flip(range("`",z)));

説明

$string = preg_replace("/[^a-z]/",'',strtolower($argv))  
//the string only contains letters

$string = implode(" ",str_split($string)); 
//the string has a space after every letter

$string = strtr($string, array_flip(range("`",z)));  
//replace every letter   acording to the array

$replacementArray = array_flip(range("`",z));
//this array contains the ansi characters from "`" to the "z"
//array_flip to change the keys with the values
//final array ["`"=>0,"a"=>1, "b"=>2...."z"=>26]

これを警告なしで実行するには、(a)$ argvを$ argv [1]に変更し、(b)最後のzの周りに "を追加する必要がありました。 5.6)を使用しています、あなたはレベルで)(strtolowerを移動することによって、3つのバイトを保存することができますstrtolower($argv)し、削除資本A-Z正規表現から。
manassehkatz-移動2 Codidact

php 7では警告をスローします。今度は答えを変更します。チェックする時間がなかっただけで申し訳ありません:-D
Francisco Hahn

1
@manassehkatz提案を受け取り、3バイト節約しました。ありがとうございました。
フランシスコハーン

はずのそれは可能$argv[1]か、$argn代わりに$argv?。joinよりも3バイト短いimplode
タイタス


0

Python 2、110 バイト 104バイト、ユーザー入力あり

a="abcdefghijklmnopqrstuvwxyz";print" ".join(str(a.index(l)+1)for l in list(input().lower())if l in a)

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


Python 2、105バイト 104バイト 96バイト、ここでtは事前定義されています:

a="abcdefghijklmnopqrstuvwxyz";print" ".join(str(a.index(l)+1)for l in list(t.lower())if l in a)

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

より読みやすいバージョンに分解してみましょう。

alphabet = "abcdefghijklmnopqrstuvwxyz"
foo = [str(alphabet.index(letter) + 1) for letter in list(t.lower()) if letter in alphabet]
print " ".join(foo)

まず、定義します alphabetはアルファベットします。

次に、リスト内包表記を使用して次のことを行います。

  1. 各項目が小文字であるリストを作成します t
  2. 各文字について、それがアルファベットにない場合は、それを破棄します。
  3. もしそうなら、アルファベットでそのインデックスを見つけ、
  4. 1を追加します(1から数えるため)。
  5. そしてそれを文字列にします。

最後に、すべてを結合して印刷します。


編集:printバイトを保存し、関数の外部で機能するように(および移植性が失われました)に変更されました

編集2:input()事前定義された変数の代わりにバージョンを追加しました

編集3:Jo Kingのおかげでソリューション1および2の8バイトを削除


コードに6つの余分なスペースがある
Jo King

@JoKing 3つ見つかりました(セミコロンの後、周囲+)、他はどこですか?
Theo C

以前ifforおよび" "
Jo King、

あなたはまた、削除することができます[]join
ジョー・キング

再び、PPCGへようこそ!デフォルトでは(つまり、質問で明示的にオーバーライドされていない場合)回答は、関数またはフルプログラム(104バイトバージョンなど)ではなく、スニペット(96バイトバージョンなど)である可能性があります。ここでは、 100バイトの文字列を返す関数作成するバージョンを送信できます:)
Jonathan Allan

0

PowerShell、63バイト

"$(([char[]]"$args".ToUpper()|%{$_-($_,64)[$_-in65..90]})-ne0)"

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

(長いようです...)

入力を受け取り$args.ToUpper大文字と小文字を変換し、それをchar-array としてキャストし、それをfor eachループにフィードします。ループ内で、我々は現在の値であるか否かに基づいて、(ASCII int型)の値から、それ自体または64のいずれかを引く-in範囲6590(すなわち、それはASCIIの大文字です)。これらの値はパイプラインに残され、文字以外の値を排除するために-not equal を使用します(すべてゼロであるため)。配列のデフォルトの文字列化はスペースで区切るため、これらの数値は文字列にカプセル化されます。そのため、非常に安価に取得できます。その文字列はパイプラインに残され、出力は暗黙的です。


0

MS-SQL、133バイト

SELECT STRING_AGG(ASCII(substring(upper(s),number+1,1))-64,' ')FROM
spt_values,t WHERE type='P'AND substring(s,number+1,1)LIKE'[a-z]'

私たちのIOルールに従って、入力はvarcharフィールドsを持つ既存のテーブルtを介して取得されます

SQL 2017以降が必要です。実行する必要がありますmaster私はと呼ばれるシステムテーブルの利点を取っているので、データベースspt_valuesによってフィルタリング(、type='P')0から2047までのカウント数が含まれています。

基本的にSUBSTRING()、を使用して数値テーブルを入力文字列と結合しています。これは、個々の文字ごとに個別の行を返します。これはLIKE'[a-z]'、を使用して文字のみがフィルタリングされ、ASCII値を取得して64を減算します。これらの数値は、(SQL 2017の新機能)を使用して文字列に結合されますSTRING_AGG




0

jq、45バイト

[gsub("\\W";"")|explode[]%32|@text]|join(" ")

 gsub("\\W";"")                                # remove non-alpha characters
               |explode[]                      # get decimal values of characters
                         %32                   # get positions in alphabet
                            |@text             # convert back to string
[                                 ]|join(" ")  # join with a space

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.