Đưa ra llama bên trong của một câu


33

Mục tiêu của bạn là lấy đầu vào như

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

và tạo một mảng các chỉ mục của chuỗi trong đó các chữ cái tạo thành từ "Llama" xuất hiện (một trong mỗi thứ tự theo thứ tự). Ví dụ: hãy để tôi hiển thị các chữ cái được chỉ bằng dấu mũ để hiển thị các chỉ mục:

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

Vì vậy, mảng sẽ trông như sau:

[44, 67, 76, 105, 114]

(Nếu ứng dụng của bạn sử dụng lập chỉ mục không dựa trên 0, các con số sẽ khác nhau. Điều đó tốt.)

Nếu văn bản không có llama, thì mảng sẽ trống, nil, null hoặc không xác định.

Bất kỳ ngôn ngữ mã được chấp nhận. Đây là một cuộc thi , vì vậy ít nhân vật nhất sẽ giành chiến thắng!


7
@TheWobbuffet Bạn tiếp tục thay đổi tên người dùng và hình ảnh của bạn. Đã có lúc bạn là "Doorknob" và có bức ảnh của anh ấy. Bây giờ, pic của bạn là một con cừu. Bạn nên thay đổi nó thành một llama.
Justin

1
Điều gì về lập chỉ mục dựa trên 0 và 1 dựa trên? Chúng tôi có thể chỉ sử dụng lập chỉ mục được sử dụng bởi ngôn ngữ của chúng tôi hoặc tất cả các bài nộp phải tuân theo một quy ước (cái nào) không?
Martin Ender

1
@Quincunx Con cừu nói '42' trên đó!
Cilan

2
@TheWobbuffet cách quá nhiều người định hướng toán học: - / (Matlab, Mathicala, Julia, tôi không biết về R) ... cũng là Lua và Smalltalk. Mặc dù vậy, người duy nhất có liên quan đến chơi golf mã là Mathicala, nhưng có lẽ không dành cho các tác vụ thao tác chuỗi.
Martin Ender

3
Bạn chỉ muốn chức năng thực hiện nó hoặc toàn bộ chương trình? Bạn có muốn mã đầu vào / đầu ra là tốt?
jzm

Câu trả lời:


11

CJam - 33

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

Nó nhận được các chỉ mục dựa trên 1 (thêm 2 byte cho 0 dựa trên)

Giải trình:

lđọc một dòng từ đầu vào (thay thế qcho toàn bộ đầu vào)
elchuyển đổi thành chữ thường
"llama"{...}/thực thi khối cho mỗi chữ cái "llama"
1$sao chép chuỗi hiện tại
#tìm thấy chỉ số của các chữ cái
)_tăng và sao chép
T+:Tthêm T (ban đầu 0), cập nhật T và để lại nó trên ngăn xếp
\@hoán đổi các mục xung quanh, bây giờ chúng ta có current-T, index, chuỗi
>cắt chuỗi bắt đầu tại chỉ mục sẽ
;bật chuỗi còn lại
]tập hợp các chỉ mục trong một mảng
Tại thời điểm này, chúng ta có tất cả các chỉ mục dựa trên 1; Nếu không tìm thấy bất kỳ chữ cái nào, mảng sẽ có các bản sao.
___tạo thêm 3 bản sao của mảng
|(với 2 bản sao mảng) sẽ loại bỏ các bản sao
=so sánh, kết quả là 0 nếu có trùng lặp hoặc 1 nếu không
*nhân mảng 0 hoặc 1 lần tương ứng


sourceforge.net/p/cjam/wiki/Home để biết thêm thông tin về ngôn ngữ. Mới với tôi.
TankorSmash

12

Perl, 52 byte

Giải pháp được cung cấp dưới dạng hàm lấy chuỗi làm đối số và trả về danh sách các vị trí.

  • Vị trí một dựa trên, tìm kiếm phân biệt chữ hoa chữ thường, không có dòng mới: 52 byte

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

    Tìm kiếm phân biệt chữ hoa chữ thường trả về một mảng trống trong ví dụ của câu hỏi, vì sau khi khớp ba chữ cái đầu tiên, chữ cái viết thường mbị thiếu trong văn bản đầu vào.

  • Hỗ trợ các dòng mới: + 1 byte = 53 byte

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

    Các văn bản bây giờ có thể trải dài một số dòng.

  • Tìm kiếm không phân biệt chữ hoa chữ thường: + 1 byte = 54 byte

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

    Bây giờ ví dụ trong câu hỏi báo cáo một danh sách các vị trí chỉ mục, chúng là các số một dựa trên:

    [45 68 77 106 115]
    
  • Vị trí dựa trên số không: + 9 byte = 63 byte

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

    Kết quả cho ví dụ trong câu hỏi:

    [44 67 76 105 114]
    

Ung dung:

Các biến thể sau bao gồm ít nhiều các biến thể khác.

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
Điều này cũng giả sử rằng đầu vào là ASCII hoặc ít nhất là không đầy đủ Unicode. Trừ khi các biểu thức của Perl tôn trọng chính xác các ranh giới grapheme trong những ngày này (họ chắc chắn không quay lại khi tôi không may sử dụng nó.)
Trejkaz

@Trejkaz: Unicode hoàn toàn không thành vấn đề ở đây: (a) "llama" là ASCII và các chữ cái của nó không va chạm với bất kỳ ký tự Unicode không phải ASCII nào hoặc biểu diễn byte của nó trong UTF-8. (b) Với các mã hóa nhiều byte trong tâm trí, thuật ngữ "chỉ mục" trong câu hỏi sẽ không được xác định rõ. Chỉ mục có thể liên quan đến vị trí ký tự hoặc vị trí byte (lưu trữ). (c) Hỗ trợ bất kỳ mã hóa nào với các vị trí ký tự sẽ có nghĩa là mã hóa phải được biết và cần được cung cấp dưới dạng đối số bổ sung.
Heiko Oberdiek

Hai giải pháp đầu tiên của bạn in []và bản in thứ ba [ ]cho tôi (những giải pháp dài hơn hoạt động chính xác). Tôi đang chạy "perl, v5.8.8 được xây dựng cho msys-64int". Bạn có một lỗi, hoặc nó hoạt động trên một phiên bản khác của perl?
Tim S.

@TimS.: []Là chính xác cho giải pháp đầu tiên, Mkhông phù hợp trong tìm kiếm phân biệt chữ hoa chữ thường. Câu hỏi khá không rõ ràng về trường hợp nhạy cảm.
Heiko Oberdiek

Ok, như vậy []là chấp nhận được cho hai người đầu tiên. Nhưng ba giải pháp đầu tiên vẫn không hoạt động đúng với tôi: nếu bạn cung cấp cho nó đầu vào sẽ trả về chỉ mục, nó sẽ trả về[ ]
Tim S.

10

sed, 299 + 1

Vâng, sed có thể tìm thấy một llama. Không, sed không thể làm toán. Đây là câu trả lời dài nhất cho đến nay, ở mức 299 + 1 ký tự, vì tôi phải dạy sed để đếm.

Câu trả lời này đòi hỏi một sed với các biểu thức chính quy mở rộng ( sed -Ehoặc sed -r). Tôi đã sử dụng OpenBSD sed (1) . Đầu vào là một chuỗi trên mỗi dòng. (Do đó, chuỗi có thể không chứa dòng mới.) Đầu ra là một dòng số hoặc không có gì.

Cách sử dụng (+1 ký tự cho -r):

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

Mã nguồn (299 ký tự):

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

Chương trình đầu tiên thay thế llama bằng năm %. (Tất cả %trong chương trình này là bằng chữ.) Lệnh đầu tiên s/%/z/gthay đổi bất kỳ %thành ztrong dòng đầu vào. Năm lệnh tiếp theo tìm thấy llama, vì vậy Tất cả các cánh tay trên tất cả các vai có thể bị đau. trở thành A %% cánh tay trên% ll vai% ay% che. Bởi vì mỗi người đều .*tham lam, tôi luôn tìm thấy llama ở bên phải: llama llama sẽ trở thành llama %%%% . Nếu tôi không thể nhận được năm %, sau đó /(.*%){5}/!dxóa dòng đầu vào và bỏ qua các lệnh tiếp theo.

s/[^%]/z/gthay đổi mọi nhân vật nhưng %để z. Sau đó, tôi nhập một vòng lặp. s/(z*)%/\10 z\1/thay đổi đầu tiên %thành 0, sao chép từ 0 trở lên ztừ trái sang phải và thêm một lần nữa zsang phải. Đây là số lượng zý chí bằng chỉ số. Ví dụ, zz%zzz%...trở thành zz0 zzzzzzzz%...bởi vì đầu tiên %là ở chỉ số 2 và tiếp theo %là ở chỉ số 8.s/z*$// loại bỏ thêm ztừ cuối chuỗi.

Mười một lệnh tiếp theo được tính zbằng cách loại bỏ từng lệnh zvà đếm từ 0. Nó đếm như zzz0, zz1, z2, 3. Ngoài ra, 1zzzz9trở thành z1zzz0(sau này 23), hoặc zzzz9trở thành 1zzz0(sau này 13). Vòng lặp này tiếp tục cho đến khi không còn %hoặc z.


1
+1 để dạy sed tính. Dạy llama dễ tính hơn sed.
Andreï Kostyrka

9

Pháo đài - 154 148

Fortran rất thích chơi golf, nhưng chỉ để chứng minh rằng các chuỗi phân tích cú pháp có thể được thực hiện bằng ngôn ngữ dựa trên toán học, tôi đã làm điều đó:

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

Tôi đã lưu một vài ký tự bằng cách loại bỏ những thứ không cần thiết fở cuối endfunctionvà được sử dụng if(any(r==0))thay vì if(.not.all(r>0)).

Điều này đòi hỏi:

  1. s là chuỗi có văn bản
  2. alà bài kiểm tra viết thường (nghĩa là llama)
  3. bđể được kiểm tra chữ hoa (nghĩa là LLAMA)

Chương trình đầy đủ, không chơi gôn là

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 hiện đại ít nhất được cho phép trên các khu vực sân & putt. FORTRAN IV vẫn sẽ chơi golf điên cuồng.
ClickRick

4
@ClickRick: Fortran IV là thứ tôi chưa học được. Không chắc chắn rằng tôi muốn. Một cái gì đó về thụt lề bắt buộc và viết hoa làm phiền tôi.
Kyle Kanos

7

C # - 119

Lấy chuỗi, đầu ra mảng. Null nếu không có llama trong chuỗi.

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
+1 chox=>x>=0
ClickRick

Tôi rất ấn tượng. Cách nhỏ hơn bất kỳ ý tưởng của tôi cho cái này. Tôi đã tìm thấy bạn có thể làm cho nó nhỏ hơn bằng cách khởi tạo i-1 và đặt .ToArray () vào câu lệnh .Select, như vậyint[]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

Hồng ngọc, 56 65 63

Chỉnh sửa : +9 ký tự sao cho không phân biệt chữ hoa chữ thường.

Xác định một hàm (lambda, về mặt kỹ thuật) f.

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

Trả về nilnếu không có llama. Nếu nó phải là [](mảng trống), thì chỉ cần thêm ||[]trước cuối cùng }cho tổng số 4 ký tự phụ .

Phiên bản dễ đọc:

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 || []
}

Tôi xin lỗi vì đã chỉnh sửa câu hỏi của mình sau một thời gian, nhưng tôi chỉ nói thêm rằng mảng, nếu không có llama, có thể là không, null, trống hoặc không xác định.
Cilan

21
Vì vậy, bạn đã làm điều đó với một llambda?
Mason Wheeler

@Doorknob sẽ ngắn hơn hai byte bằng cách sử dụng chữ hoa thay vì chữ hoa không?
dstarh

@dstarh Yep, cảm ơn
Doorknob

Hãy nghĩ rằng bạn có thể nhận được trường hợp không nhạy cảm một byte rẻ hơn bằng cách làm index(/#{c}/ithay vì upcase.
lịch sử

6

C - 53

Biên dịch với:

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.\"

Tôi đã thử lệnh biên dịch này với gcc của cygwin. Các môi trường khác có thể xử lý các khoảng trắng và các ký tự đặc biệt khác theo cách khác.

Kết quả dựa trên 0 được lưu trữ vào mảng r. Nội dung của nó không được xác định nếu không có llama trong chuỗi.

  • Phân biệt chữ hoa chữ thường (53)

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

  • Không phân biệt chữ hoa chữ thường (58)

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


4

JavaScript (ECMAScript 6) - 68 ký tự

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

Giả sử rằng chuỗi để kiểm tra là trong biến s. Nếu bạn muốn biến nó thành một chức năng thì hãy thêm vào f=s=>(thêm 5 ký tự).

Đầu ra:

[]

Trường hợp không nhạy cảm - 69 ký tự

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

Đầu ra:

[68, 80, 93, 105, 114]

Case Insensitive & First Match - 74 Nhân vật

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

Đầu ra:

[44, 67, 76, 105, 114]

4

Con trăn, 100

Tôi là tay golf tồi tệ nhất. : P

Cảm ơn @xnor đã cạo sạch 6 byte.

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 chứa mảng sau.

EDIT : Đã sửa .

EDIT 2 : len(g)để g, o==5để o>4theo gợi ý @ XNOR của.

EDIT 3 : @WolframH đã sửa nó.


2
o*=(len(o)==5)tuyệt vời . Thật kinh khủng, nhưng tôi yêu nó!
kevinsa5

Tôi không nghĩ các dấu ngoặc đơn bên ngoài trên dòng đó là cần thiết. Bạn có thể lưu hai ký tự bằng cách loại bỏ chúng.
user2357112 hỗ trợ Monica

@ user2357112 Trên dòng cuối cùng thứ hai đó? Tôi sẽ xóa chúng.
cjfaure

Tôi giả sử slà chuỗi đầu vào, phải không? Không nên sau đó s.lowerđược i.lower? Tuy nhiên, con nai đó
Tái lập lại

@WolframH ah, vâng, sẽ sửa vào ngày mai.
cjfaure

3

Con trăn 71

Giả sử đầu vào trong s. Đầu ra trongo .

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

Chỉnh sửa: Thay đổi từ danh sách sang bộ dữ liệu để lưu 2 byte.


1
Nhân danh sách bằng booleans thật thú vị phải không? ; D
cjfaure

Tôi thích cách bạn né tránh vấn đề ocần phải bắt đầu không cần thiết o[-1]. Có lẽ nó ngắn hơn dù chỉ bắt đầu okhi [-1]và sau đó làm o=o[1:]? Khó chịu, các -1chuyến đi ban đầu lên kiểm tra nếu o-1.
xnor

@xnor: Tôi không nghĩ -1-Idea có thể được tạo ra để hoạt động. Ít nhất, tôi đã không thành công :-( Tuy nhiên, tôi đã thay đổi danh sách thành bộ dữ liệu để tiết kiệm 2 byte. :-)
Phục hồi lại

2

Con trăn 100

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

Mẫu vật:

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

Haskell, 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"

Ung dung:

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"

Thí dụ:

*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

Tìm kiếm chuỗi và thay thế mọi thứ cho đến từng trận đấu bằng tiếng vô nghĩa trước khi tìm kiếm ký tự tiếp theo. Sẽ skhông xác định nếu một từ không xảy ra.

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

Lưu ý rằng số lượng có thể giảm nếu độ nhạy trường hợp được cho phép.

Những phiên bản trước

 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

Tìm kiếm chuỗi và thay thế mọi thứ cho đến từng trận đấu bằng tiếng vô nghĩa trước khi tìm kiếm ký tự tiếp theo. Có thể bỏ xử lý lỗi (try-Catch-end), sau đó chương trình sẽ bị sập (nhưng s sẽ không được xác định theo yêu cầu) nếu không tìm thấy llama.

Thực hiện:

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

Không xử lý lỗi:

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

Giống như ý tưởng, đã giảm charcount một chút.
Dennis Jaheruddin

2

Ngôn ngữ 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

Con trăn (70)

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

Chúng tôi 'llama'lần lượt tìm kiếm từng nhân vật , bắt đầu sau vị trí của nhân vật được tìm thấy trước đó. Nếu không tìm thấy ký tự nào, ctrở thành giá trị mặc định của -1, trong trường hợp đó, dòng cuối cùng biếnr thành danh sách trống.

Chỉnh sửa: Phát hiện ra str.find(s,...)có thể được gọi là s.find(...), lưu 4 ký tự.


2

OpenEuphoria, 147 128

Tôi có hai ví dụ. Đầu tiên, ngắn nhất:

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

Tôi có thể giảm xuống còn 126 ký tự nếu tôi sử dụng "hoặc" thay vì "và" như phiên bản C ở trên. Tuy nhiên, điều này cũng phù hợp với chuỗi ''!-!như llama. Không phổ biến, nhưng vẫn có thể có một lỗi.

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

Và sau đó phiên bản sử dụng các biểu thức thông thường:

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

Cả hai đều nhận đầu vào từ STDIN và đăng lên STDOUT.

EDIT: ví dụ regex ngắn hơn:

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

Có thể lưu một vài cái bằng cách xây dựng regex bằng split/ joinhoặc explode/ implode, hoặc OpenEuphoria không có các phiên bản ngắn của chúng không?
Peter Taylor

OpenEuphoria có thể phân chia / nối với các chuỗi ký tự, nhưng tôi không thấy cách nào để làm điều đó một cách ngắn gọn hơn. Tôi không giỏi lắm với những biểu hiện thông thường; regex được sử dụng ở đây là "lấy cảm hứng" (bị đánh cắp một cách đáng xấu hổ) từ một trong những ví dụ khác trên trang này.
TinSoldier

2

Quyền hạn - 121 85

Tôi vẫn đang luyện tập với Powershell, hy vọng điều này có thể được cải thiện

$ s chứa chuỗi, kết quả là trong mảng $ a

Phiên bản gốc

$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

Bị đánh cắp

$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

Phiên bản mới, với số lượng lớn nhờ @goric

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

Bạn có thể xóa rất nhiều khoảng trống trong đó để rút ngắn mọi thứ lên tới 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

Ngoài ra, bạn có thể thay thế foreach($i in $s.tochararray())bằng [char[]]$s|%, miễn là bạn thay đổi tiếp theo $ithành a $_. Điều đó làm giảm nó xuống còn 93:$a=@();$w="llama";$n=$c=0;[char[]]$s|%{if($_-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
goric

Lưu thêm 5 ký tự bằng cách loại bỏ $wbiến hoàn toàn, vì nó chỉ được sử dụng một lần. Chỉ cần đặt nội tuyến vào if:if($i-eq"llama"[$n])
goric

.. và, tất nhiên, thay thế +=1s của bạn bằng ++s
goric

1

PHP

Chưa có câu trả lời PHP? Tôi nghĩ rằng một ngôn ngữ theo định hướng chuỗi nặng có thể đánh bại ít nhất một ngôn ngữ dựa trên toán học

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[];}

152 so với fortran 154, công việc đã hoàn thành: P

vô dụng

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[];
}

nếu người gọi luôn vượt qua một chuỗi chữ thường, nó sẽ hạ xuống mức 137


Bạn cần thêm <?vào đầu mã của bạn để làm cho nó hợp lệ. Xin lỗi ...
trước

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:[]}

Xác định hàm lấy một chuỗi làm đối số duy nhất của nó (đối số thứ hai là giá rẻ var) và trả về một mảng trống hoặc mảng 5 phần tử.

Giảm xuống 108 nếu tôi lấy đầu vào trên một biến char ( s) và để đầu ra ở một ( b) khác:

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

Chỉnh sửa: Hoán đổi bản đồ cho vòng lặp.


Phiên bản ECMAScript 6 (81 ký tự) -b=(z=[].map.call("llama",a=>b=s.toLowerCase().indexOf(a,++b))).indexOf(-1)<0?z:[]
MT0

1

Nổi loạn, 97

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

Ví dụ sử dụng trong bảng điều khiển 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 sử dụng lập chỉ mục dựa trên 1. Trả về danh sách trống []nếu không tìm thấy chuỗi llama (không phân biệt chữ hoa chữ thường).

Ung dung:

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',⊂⍬⍞

Không phải là mã ngắn nhất, nhưng khá vênh, theo cách APL.

Giải trình

'amall',⊂⍬⍞ Tạo một mảng gồm 6 phần tử: các chữ cái 'amall' và một phân đoạn gồm 2 phần tử, chính chúng là các mảng con: mảng trống và một dòng ký tự được đọc từ đầu vào.

{...}/... Giảm (gấp phải) mảng 6 phần tử bằng cách sử dụng hàm được cung cấp.

a s←⍵ Phân tách đối số đúng vào mảng chỉ mục và chuỗi con còn lại (ban đầu là mảng trống và chuỗi đầy đủ.)

~⍺∊s:⍬⍬ Nếu chuỗi con không chứa chữ cái tiếp theo, hãy dừng tính toán và trả về mảng trống.

a,←n←s⍳⍺ Mặt khác, tìm vị trí của nó, gọi nó là n và nối nó vào mảng các chỉ số.

a(n↓s) Tạo và trả về một mảng gồm 2 phần tử: mảng chỉ mục mở rộng và chuỗi con còn lại.

+\↑⊃... Giải nén đầu ra của nếp gấp, lấy phần tử đầu tiên (mảng chỉ số) và quét nó cùng với, để biến các độ lệch tương đối thành các phần tử tuyệt đối.

Ví dụ

      +\↑⊃{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

Julia, 76

Một ví dụ regex khác sử dụng ngôn ngữ Julia.

f(s)=(m=match(r"(?i)(l).*?(l).*?(a).*?(m).*?(a)",s);m==nothing?m:m.offsets)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.