文の内側のラマを引き出す


33

あなたの目的は

Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.

そして、「Llama」という単語を構成する文字が現れる文字列のインデックスの配列を作成します(それぞれ順番に1つ)。たとえば、インデックスを表示するために、キャレットで示された文字を表示します。

Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.
                                            ^                      ^        ^                            ^        ^

したがって、配列は次のようになります。

[44, 67, 76, 105, 114]

(アプリケーションが0ベースではないインデックスを使用している場合、数値は異なって見えます。それで問題ありません。)

テキストにラマがない場合、配列は空、nil、null、または未定義でなければなりません。

すべてのコード言語が受け入れられます。これはコンテストですので、最も少ないキャラクターが勝ちます!


7
@TheWobbuffetあなたはユーザー名と写真を変え続けています。あなたが「ドアノブ」で、彼の写真を持っていた時代がありました。今、あなたの写真は羊です。ラマに変更する必要があります。
ジャスティン

1
0ベースのインデックス作成と1ベースのインデックス作成はどうですか?言語で使用されているインデックスを使用するだけでいいのでしょうか、それともすべての提出物が1つの規則(どちらか)に準拠する必要がありますか?
マーティンエンダー

1
@Quincunx羊は「42」と言っています!
シラン

2
@TheWobbuffetは数学指向のものが多すぎます:-/(Matlab、Mathematica、Julia、Rについては知りません)... LuaとSmalltalkも。ただし、コードゴルフに関係するのはMathematicaだけですが、おそらく文字列操作タスクには関係しません。
マーティンエンダー

3
それだけの機能が必要ですか、それともプログラム全体が必要ですか?入出力コードも必要ですか?
JZM

回答:


11

CJam-33

lel"llama"{1$#)_T+:T\@>}/;]___|=*

1ベースのインデックスを取得します(0ベースの場合はさらに2バイト)

説明:

l入力から行を読み取り(入力q全体で置換)
el、小文字に変換し
"llama"{...}/て「ラマ」文字ごとにブロックを実行します
1$現在の文字列
#をコピーし、文字の
)_増分と重複のインデックスを見つけて
T+:TT(最初は0)を追加し、Tを更新して残しますスタック上で
\@アイテムをスワップし、現在のT、インデックス、文字列
>スライスを取得します。インデックスから始まる
;文字列
]はポップし、残りの文字列は配列内のインデックスを収集し
ます。文字が見つからなかった場合、配列には重複があります。
___アレイのコピーをさらに3つ作成し
|(2つのアレイコピーを使用)、重複を削除します
=比較し、重複があった場合は0を返し、そうでない場合
*は配列をそれに応じて0または1回乗算します


言語の詳細については、sourceforge.net / p / cjam / wiki / Homeを参照してください。私に新しい。
TankorSmash

12

Perl、52バイト

このソリューションは、引数として文字列を受け取り、位置のリストを返す関数として提供されます。

  • 1ベースの位置、大文字と小文字を区別した検索、改行なし:52バイト

    sub l{pop=~/(l).*?(l).*?(a).*?(m).*?(a)/;@+[1..$#+]}

    大文字と小文字を区別した検索では、質問の例では空の配列が返さmれます。これは、最初の3文字と一致した後、入力テキストに小文字が含まれていないためです。

  • 改行のサポート:+ 1バイト= 53バイト

    sub l{pop=~/(l).*?(l).*?(a).*?(m).*?(a)/s;@+[1..$#+]}

    テキストは複数行にまたがることができます。

  • 大文字と小文字を区別しない検索:+ 1バイト= 54バイト

    sub l{pop=~/(l).*?(l).*?(a).*?(m).*?(a)/si;@+[1..$#+]}

    質問の例では、インデックス位置のリストが報告されます。これらは1から始まる番号です。

    [45 68 77 106 115]
    
  • ゼロベースの位置:+ 9バイト= 63バイト

    sub l{pop=~/(l).*?(l).*?(a).*?(m).*?(a)/si;map{$_-1}@+[1..$#+]}

    質問の例の結果:

    [44 67 76 105 114]
    

ゴルフをしていない:

後者の亜種には、多かれ少なかれ他の亜種が含まれます。

sub l {
    # pop() gets the last argument 
    pop() =~ /(l).*?(l).*?(a).*?(m).*?(a)/si;
    # the letters inbetween are matched against ".*?",
    # the non-greedy variant of ".*". Thus ".*?"
    # matches only as few as possible characters.
    # The modifier /i controls the case-sensitivity
    # and means ignore case. Without the case matters.
    # Modifier /s treats the string as single line,
    # even if it contains newlines.
    map { $_-1 }   # subtract 1 for zero-based positions
        @+[1..$#+]
    # Array @+ contains the end-positions of the last
    # submatches, and of the whole match in the first position.
    # Therefore the first value is sliced away.
    # @+ is available since Perl 5.6.
}

# test
my @result = l(<<"END_STR");
Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.
END_STR
print "[@result]\n";

1
また、これは、入力がASCII、または少なくとも完全なUnicodeではないことを前提としています。Perlの正規表現が最近、書記素の境界を正しく尊重しない限り(私はそれを使用する不幸があったときに確かに戻っていませんでした。)
Trejkaz

@Trejkaz:Unicodeはここではまったく関係ありません:(a)「llama」はASCIIであり、その文字は非ASCII Unicode文字またはUTF-8のバイト表現と衝突しません。(b)マルチバイトエンコーディングを念頭に置いて、質問の「インデックス」という用語は指定不足です。インデックスは、文字位置またはバイト(ストレージ)位置に関連付けることができます。(c)文字位置でのエンコーディングのサポートは、エンコーディングが既知であり、追加の引数として提供される必要があることを意味します。
ヘイコオベルディク

最初の2つのソリューションが印刷さ[]れ、3番目のソリューションが印刷さ[ ]れます(長い方が正しく機能します)。「msys-64int用にビルドされたperl v5.8.8」を実行しています。バグがありますか、それともperlの異なるバージョンで動作しますか?
ティムS.

@TimS .: []最初のソリューションでは正しいですMが、大文字と小文字を区別した検索では一致しません。大文字と小文字の区別に関する質問は非常に不明確です。
ハイコオベルディク

OK、[]最初の2つは許容範囲です。しかし、最初の3つの解決策はまだ私のために右働いていない:あなたはそれをインデックスを返す必要があります入力を与えた場合、それは返す[ ]
ティムS.

10

sed、299 + 1

はい、sedはラマを見つけることができます。いいえ、sedは数学を実行できません。これは、これまでで299 + 1文字という最も長い答えです。カウントするためにsedを教える必要があったからです。

この答えには、拡張正規表現(sed -Eまたはsed -r)を含むsedが必要です。OpenBSD sed(1)を使用しました。入力は1行に1つの文字列です。(したがって、文字列には改行が含まれない場合があります。)出力は数字の行であるか、または何もありません。

使用法(に+1文字-r):

$ echo 'All arms on all shoulders may ache.' | sed -rf llama.sed
1 2 12 26 30 

ソースコード(299文字):

s/%/z/g
s/(.*)[Aa]/\1%/
s/(.*)[Mm](.*%)/\1%\2/
s/(.*)[Aa]((.*%){2})/\1%\2/
s/(.*)[Ll]((.*%){3})/\1%\2/
s/(.*)[Ll]((.*%){4})/\1%\2/
/(.*%){5}/!d
s/[^%]/z/g
:w
s/(z*)%/\10 z\1/
s/z*$//
s/z0/1/
s/z1/2/
s/z2/3/
s/z3/4/
s/z4/5/
s/z5/6/
s/z6/7/
s/z7/8/
s/z8/9/
s/([0-9]z*)z9/z\10/g
s/(z*)z9/1\10/
/[%z]/bw

プログラムは、最初にラマを5に置き換え%ます。(%このプログラムのすべてはリテラルです。)最初のコマンドは、入力行でs/%/z/gany %を変更しますz。次の5つのコマンドはラマを検出するため、すべての肩のすべての腕が痛む場合があります。%ll肩で%%腕のA %%腕になります。各ので.*貪欲で、私はいつも右のラマを見つけた:ラマラマはなるラマ%%%%%。私は5を得ることができない場合は%、その後、/(.*%){5}/!d入力行を削除し、次のコマンドをスキップします。

s/[^%]/z/g以外のすべての文字を変更%zます。その後、ループに入ります。s/(z*)%/\10 z\1/最初の%0に変更し、ゼロ以上zを左から右にコピーし、もう1つzを右に追加します。これは、その数がzインデックスに等しいためです。例えば、zz%zzz%...なるzz0 zzzzzzzz%...第一ので、%インデックス2であった、そして次の%8指標であるs/z*$//削除し、余分なz文字列の末尾から。

次の11個のコマンドはz、それぞれzを削除してからカウントアップし0ます。それは次のようにカウントしzzz0zz1z23。また、1zzzz9となりz1zzz0(後23)、またはzzzz9なった1zzz0(後13)。これ以上存在しなくなるまでこのループは続きます%z


1
カウントするsedを教えるための+1。sedよりもラマに数えることを教えるほうが簡単です。
アンドレイKostyrka

9

Fortran- 154 148

Fortranはゴルフを嫌いますが、文字列の解析が数学ベースの言語で行えることを証明するために、私はそれを行いました。

function f result(r);integer::r(5),j=1;do i=1,len(s);if(s(i:i)==a(j:j).or.s(i:i)==b(j:j)) then;r(j)=i;j=j+1;endif;enddo;if(any(r==0))r=0;endfunction

f最後に不要な文字を削除して数文字を保存し、の代わりにendfunction使用しif(any(r==0))ましたif(.not.all(r>0))

これには以下が必要です。

  1. s テキスト付きの文字列に
  2. a小文字のテスト(つまり、llama
  3. b大文字のテスト(つまり、LLAMA

ゴルフをしない完全なプログラムは

program find_llama
   character(len=123) :: s = "Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good."
   character(len=5) :: a="llama",b="LLAMA"

   print *,f()
 contains
   function f result(r)
     integer::r(5),j=1
     do i=1,len(s)
        if(s(i:i)==a(j:j).or.s(i:i)==b(j:j)) then
           r(j)=i
           j=j+1
        endif
     enddo
     if(any(r==0)) r=0
   end function
end program find_llama

最新のFortranは、少なくともピッチとパットの領域で許可されています。FORTRAN IVはまだクレイジーゴルフをしているでしょう。
ClickRick

4
@ClickRick:Fortran IVは私が学んだことのないものです。私がしたいのか分からない。強制的なインデントと大文字化に関する何かが私を邪魔します。
カイルカノス

7

C#-119

文字列を受け取り、配列を出力します。文字列にラマがない場合はnull。

int[]a(string s){var i=0;var o="llama".Select((x,y)=>i=s.IndexOf(x,y>0?i+1:0));return o.All(x=>x>=0)?o.ToArray():null;}

1
+1x=>x>=0
ClickRick

私は感銘を受けて。これに対する私のアイデアのどれよりもずっと小さい。私はあなたが初期化することによって、それを小さくすることができ見つけたiので、同じように-1と.Selectステートメントに.ToArrayを()入れてint[]a(string s){var i=-1;var o="llama".Select(x=>i=s.IndexOf(x,i+1)).ToArray();return o.All(x=>x>=0)?o:null;}
Grax32

7

ルビー、56 65 63

編集:大文字と小文字を区別しないように+9文字。

関数(技術的にはラムダ)を定義しますf

f=->s{i=0;'LLAMA'.chars.map{|c|i=s.upcase.index(c,i+1)||break}}

nilラマがない場合に返します。[](空の配列)にする必要がある場合は||[]、最後の前に追加}して合計4文字を追加します。

読み取り可能なバージョン:

innerLlama = -> str{
    index = 0;
    str.downcase!
    arr = 'llama'.each_char.map{|char|
        index = str.index(char, index + 1)
        break unless index
    }
    # uncomment this line for empty array on failure
    #arr || []
}

しばらくして質問を編集したことをおaびしますが、ラマがない場合は配列をnil、null、empty、またはundefinedにできることを追加しました。
シラン

21
それで、あなたはllambdaでそれをしましたか?
メイソンウィーラー

@Doorknobは、downcase noではなくupcaseを使用すると2バイト短くなりますか?
dstarh

@dstarhうん、ありがとう
ドアノブ

index(/#{c}/i代わりに行うことで、大文字小文字を区別せずに1バイト安くすることができると思いますupcase
histocrat

6

C-53

コンパイル:

gcc -D L=\"llama\" -D W=\"Lie\ is\ good.\ \ I\ just\ ate\ a\ bunch\ of\ pies\ early\ this\ morning.\ \ Actually,\ it\ was\ closer\ to\ the\ afternoon.\ \ Mornings\ are\ good.\"

このコンパイルコマンドをcygwinのgccでテストしました。他の環境では、スペースと他の特殊文字を異なる方法で処理できます。

0から始まる結果は配列に保存されrます。文字列にラマがない場合、その内容は未定義です。

  • 大文字と小文字を区別する(53)

    i,m,r[5];main(){for(;W[i];i++)W[i]==L[m]?r[m++]=i:i;}

  • 大文字と小文字を区別しない(58)

    i,m,r[5];main(){for(;W[i];i++)(W[i]|96)==L[m]?r[m++]=i:i;}


4

JavaScript(ECMAScript 6)-68文字

(/((((.*l).*l).*a).*m).*a/.exec(s)||[]).map(x=>x.length-1).reverse()

テストする文字列が変数にあると仮定しますs。関数に変換する場合は、先頭にf=s=>追加します(5文字追加)。

出力:

[]

大文字と小文字を区別しない-69文字

(/((((.*l).*l).*a).*m).*a/i.exec(s)||[]).map(x=>x.length-1).reverse()

出力:

[68, 80, 93, 105, 114]

大文字と小文字を区別しない&最初の一致-74文字

(/((((.*?l).*?l).*?a).*?m).*?a/i.exec(s)||[]).map(x=>x.length-1).reverse()

出力:

[44, 67, 76, 105, 114]

4

Python、100

私は史上最悪のゴルファーです。:P

6バイトを削る@xnorに感謝します。

g,n,o='llama',0,[]
for i in s:
 if g:exec("o+=[n];g=g[1:];"*(i.lower()==g[0])+"n+=1")
o*=len(o)>4

o 後に配列が含まれます。

編集:修正。

EDIT 2len(g)go==5o>4@ XNORの提案どおり。

編集3:@WolframHはそれを修正しました。


2
o*=(len(o)==5)ある優秀。それは恐ろしいですが、私はそれが大好きです!
ケビンサ

その行の外側の括弧は必要ないと思います。それらを削除することにより、2つの文字を保存できます。
user2357112は、Monicaを

@ user2357112その2番目の最後の行に?私はそれらを削除します。
cjfaure

s入力文字列だと思いますよね?その後、すべきではないs.lowerことi.lower?ただし、そのこと
モニカを

@WolframHああ、はい、明日修正します。
cjfaure

3

Python 71

の入力を想定していますs。で出力しoます。

F=s.lower().find
o=F('l'),
for c in'lama':o+=F(c,o[-1]+1),
o*=min(o)>=0

編集:リストからタプルに変更して、2バイトを節約しました。


1
リストにブール値を掛けるのは楽しいですね。; D
cjfaure

私はあなたoが取るために空でない状態から始める必要の問題をかわすのが好きですo[-1]。たぶんそれだけで起動するものの短くだoとして[-1]、後に行いますかo=o[1:]?面倒なことに、最初にが含まれ-1ているかどうかをチェックしoます-1
XNOR

@xnor:-1-Ideaを機能させることができるとは思わない。少なくとも、私は成功しませんでした:-(ただし、リストをタプルに変更して2バイトを節約しました。:
Monica

2

Python 100

import re
x=input()
print[re.search(r"l.*?(l).*?(a).*?(m).*?(a)",x,re.I).start(i) for i in range(5)]

サンプル:

in  = Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.
out = [44, 67, 76, 105, 114]
in[out] = ['l', 'l', 'a', 'M', 'a']

2

ハスケル、111

import Data.Char
l i(a:as)t@(b:bs)|a==b=i:l(i+1)as bs|True=l(i+1)as t
l _ _ _=[]
r s=l 0(map toUpper s)"LLAMA"

ゴルフをしていない:

import Data.Char

llama :: Int -> String -> String -> [Int]
llama i (a:as) t@(b:bs)
  | a==b      = i : llama (i+1) as bs
  | otherwise = llama (i+1) as t
llama _ _ _ = []

runme :: String -> [Int]
runme s = llama 0 (map toUpper s) "LLAMA"

例:

*Main> r "Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good."
[44,67,76,105,114]

2

Matlab、61 96

文字列を検索し、次の文字を検索する前に、一致するものまですべてを意味不明に置き換えます。s単語が発生しない場合は未定義のままになります。

t='llama';for q=1:5;s(q)=min(regexpi(z,t(q))),z(1:s(q))=0;end

大文字と小文字の区別が許可されている場合は、文字数を減らすことができます。

以前のバージョン

 try;t='llama';for q=1:length(t);s(q)=find(lower(z)==t(q),1);z(1:s(q))=ones(1,s(q));end;catch;end

文字列を検索し、次の文字を検索する前に、一致するものまですべてを意味不明に置き換えます。エラー処理(try-catch-end)をドロップすると、llamaが見つからない場合にプログラムがクラッシュします(ただし、sは必要に応じて未定義になります)。

実装:

>> z='Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.';
>> try;t='llama';for q=1:length(t);s(q)=find(lower(z)==t(q),1);z(1:s(q))=ones(1,s(q));end;catch;end
>> s
s =

    45    68    77   106   115

エラー処理なし:

t='llama';for q=1:length(t);s(q)=find(lower(z)==t(q),1);z(1:s(q))=ones(1,s(q));end

アイデアのように、文字数を少し減らしました。
デニスジャエルディン

2

言語Java

 final int[] wordIndexInSentence(String sentence, String word)
  {
    final int[] returnArr = new int[word.length()];
    int fromIndex = 0;
    word = word.toUpperCase();
    sentence = sentence.toUpperCase();
    for (int i = 0; i < word.length(); i++)
    {
      final char c = word.charAt(i);
      returnArr[i] = sentence.indexOf(c, fromIndex);
      fromIndex = returnArr[i] > 0 ? returnArr[i] + 1 : fromIndex;
    }
    return returnArr;
  }

2

パイソン(70)

r=[];c=-1
for x in'llama':c=s.lower().find(x,c+1);r+=[c]
r*=1-(-1in r)

'llama'前に見つかったキャラクターの場所から順に、各キャラクターを順番に検索します。文字が見つからない場合c、デフォルト値のになります。-1この場合、最後の行rは空のリストになります。

編集:str.find(s,...)として起動できることが判明しs.find(...)、4文字を節約しました。


2

OpenEuphoria、147 128

私は2つの例を持っています。まず、最短:

object t=and_bits(gets(0),#DF),L="LLAMA",i=0,X={}for j=1 to 5 do 
i=find(L[j],t,i+1)X&=i 
end for 
if find(0,X) then X={} end if?X

上記のCバージョンのように「and」の代わりに「or」を使用すると、126文字まで減らすことができます。しかし、これはまた、文字列にマッチする''!-!ようllama。一般的ではありませんが、依然としてエラーの可能性があります。

object t=or_bits(gets(0),96),L="llama",i=0,X={}for j=1 to 5 do 
i=find(L[j],t,i+1)X&=i 
end for 
if find(0,X) then X={} end if?X

そして、正規表現を使用したバージョン:

include std/regex.e
include std/sequence.e
include std/utils.e
object X=regex:find(new("(?i)(l).*?(l).*?(a).*?(m).*?(a)"),gets(0))
? iff(atom(X),{},vslice(X[2..6],2))

どちらもSTDINから入力を受け取り、STDOUTにポストします。

編集:短い正規表現の例:

include std/regex.e
include std/sequence.e
object X=regex:find(new("(?i)(l).*?(l).*?(a).*?(m).*?(a)"),gets(0))
if atom(X)then?{}else?vslice(X[2..6],2)end if

split/ joinまたはexplode/ implodeを使用して正規表現を構築することでいくつかを節約することは可能ですか、またはOpenEuphoriaにはそれらの短いバージョンがありませんか?
ピーターテイラー

OpenEuphoriaは文字列で分割/結合を行うことができますが、もっと短い方法でそれを行う方法がわかりません。私は正規表現があまり得意ではありません。ここで使用されている正規表現は、このページの他の例の1つから「触発された」(恥知らずに盗まれた)ものです。
TinSoldier

2

パワーシェル - 121 85

私はまだPowershellで練習していますが、これが改善されることを期待しています

$ sには文字列が含まれ、結果は配列$ aにあります

元のバージョン

$a=@();$w="llama";$n=$c=0;foreach ($i in $s.tochararray()) {if ($i -eq $w[$n]) {$a+=$c;$n+=1} $c+=1};$a*=$a.length -gt 4

非ゴルフ

$a=@()
$w="llama"
$n=$c=0
foreach ($i in $s.tochararray()) {
 if ($i -eq $w[$n]) {
  $a+=$c
  $n+=1
 } $c+=1
}
$a*=$a.length -gt 4

@goricのおかげで新しいバージョン

$a=@();$n=$c=0;[char[]]$s|%{if($_-eq"llama"[$n]){$a+=$c;$n++}$c++};$a*=$a.length-gt4

112に物事をそこまで短縮するにはあなたは、スペースの多くを削除することができます$a=@();$w="llama";$n=$c=0;foreach($i in $s.tochararray()){if($i-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
goric

また、あなたは置き換えることができforeach($i in $s.tochararray())[char[]]$s|%いる限り、あなたが、その後の変更として、$iにを$_。それは93にそれを$a=@();$w="llama";$n=$c=0;[char[]]$s|%{if($_-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
削る

$w変数は一度しか使用されないため、変数を完全に削除して、さらに5文字を節約します。:だけの場合にそれをインライン化if($i-eq"llama"[$n])
goric

..そして、もちろん、+=1sを++sに置き換えます
ゴリック

1

PHP

PHPの答えはまだありませんか?非常に文字列指向の言語は、少なくとも数学ベースの言語に勝ると思います

function x($s){$i=$j=0;$r=str_split('llama');$s=strtolower($s);while($i<strlen($s)){if($s[$i]==$r[$j]){$r[$j]=$i;$j++;if($j>4)return$r;}$i++;}return[];}

FORTRAN 154に対する152、仕事完了:P

食べない

function x($s){
    $i=$j=0;$r=str_split('llama');
    $s=strtolower($s);
    while($i<strlen($s)){
        if ($s[$i]==$r[$j]){
            $r[$j]=$i;
            $j++;
            if($j>4)
                return $r;
        }
        $i++;
    }
    return[];
}

呼び出し元が常に小文字の文字列を渡す場合、137になります


<?コードを有効にするには、コードの先頭に追加する必要があります。申し訳ありません...
avall

1

JavaScript、122 115

function(s,b){z=[];for(i=0;i<5;i++){z.push(b=s.toLowerCase().indexOf("llama"[i],++b))};return z.indexOf(-1)<0?z:[]}

文字列を唯一の引数として使用する関数を定義し(2番目の引数は安いvar)、空の配列または5要素の配列を返します。

単一のchar変数(s)で入力を取得し、別の変数()に出力を残すと、108に低下しますb

var b=((z="llama".split('').map(function(a){return (b=s.toLowerCase().indexOf(a,++b))})).indexOf(-1)<0?z:[])

編集:forループのマップを交換しました。


ECMAScript 6バージョン(81文字)b=(z=[].map.call("llama",a=>b=s.toLowerCase().indexOf(a,++b))).indexOf(-1)<0?z:[]
MT0

1

Rebol、97

f: func[s][a: copy[]foreach n"llama"[if none? s: find s n[return[]]append a index? s s: next s]a]

Rebolコンソールでの使用例:

>> f "Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good." 
== [45 68 77 106 115]

>> f "nearly llami"       
== []

>> f "Llama"
== [1 2 3 4 5]

>> f reverse "llama"
== []

Rebolは1ベースのインデックスを使用します。[]ラマシーケンスが見つからない場合は、空のリストを返します(大文字と小文字は区別されません)。

ゴルフをしていない:

f: func [s] [
    a: copy []
    foreach n "llama" [
        if none? s: find s n [return []]
        append a index? s
        s: next s
    ]
    a
]

1

APL、47

+\↑⊃{a s←⍵⋄~⍺∊s:⍬⍬⋄a,←n←s⍳⍺⋄a(n↓s)}/'amall',⊂⍬⍞

最短のコードではありませんが、APLの方法でかなり歪んでいます。

説明

'amall',⊂⍬⍞ 6つの要素の配列を作成します。文字「amall」と2つの要素のサブ配列、それ自体がサブ配列です。空の配列と入力から読み取った文字の行です。

{...}/... 指定された関数を使用して、6要素配列を縮小(右折り)します。

a s←⍵ 正しい引数をインデックスの配列と残りの部分文字列(最初は空の配列と文字列全体)に分解します。

~⍺∊s:⍬⍬ 部分文字列に次の文字が含まれていない場合、計算を停止して空の配列を返します。

a,←n←s⍳⍺ それ以外の場合は、その位置を見つけてnを呼び出し、インデックスの配列に追加します。

a(n↓s) 2つの要素の配列を作成して返します:インデックスの拡張配列と残りの部分文字列。

+\↑⊃... フォールディングの出力をアンパックし、最初の要素(インデックスの配列)を取得し、追加でスキャンして、相対オフセットを絶対オフセットに変換します。

      +\↑⊃{a s←⍵⋄~⍺∊s:⍬⍬⋄a,←n←s⍳⍺⋄a(n↓s)}/'amall',⊂⍬⍞
All cats meow aloud.
2 3 6 10 15

 

      +\↑⊃{a s←⍵⋄~⍺∊s:⍬⍬⋄a,←n←s⍳⍺⋄a(n↓s)}/'amall',⊂⍬⍞
Some cats purr instead.
 

1

ジュリア、76

Julia言語を使用した別の正規表現の例。

f(s)=(m=match(r"(?i)(l).*?(l).*?(a).*?(m).*?(a)",s);m==nothing?m:m.offsets)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.