Bir cümlenin iç sınırını ortaya çıkarmak


33

Amacınız gibi girdi almaktır

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

ve "Llama" kelimesini oluşturan harflerin göründüğü dizgenin indekslerinin bir dizisini oluşturun (her birinden sırasıyla). Örneğin, dizinleri göstermek için şapkalarla birlikte gösterilen harfleri göstereyim:

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

Böylece dizi şöyle görünürdü:

[44, 67, 76, 105, 114]

(Uygulamanız 0 tabanlı olmayan bir dizin kullanıyorsa, sayılar farklı görünecektir. Sorun değil.)

Metinde lama yoksa, dizinin boş, sıfır, boş veya tanımsız olması gerekir.

Herhangi bir kod dili kabul edilir. Bu bir yarışması, yani en az karakter kazanıyor!


7
@TheWobbuffet Kullanıcı adınızı ve resminizi değiştirmeye devam edin. "Doorknob" ve onun resmini çekerken bir zamanlar vardı. Şimdi, fotoğrafın bir koyun. Bir lama olarak değiştirmelisin.
Justin,

1
Peki ya 0 tabanlı vs 1 tabanlı indeksleme? Dilimiz tarafından kullanılan endekslemeyi kullanabilir miyiz, yoksa tüm bildirimler bir sözleşmeye uymak zorunda mı?
Martin Ender,

1
@ Quincunx Koyun "42" diyor!
Cilan

2
@Wobbuffet yolu çok fazla matematik odaklı olanları: - / (Matlab, Mathematica, Julia, R hakkında bilmiyorum) ... ayrıca Lua ve Smalltalk. Kod golf ile ilgili olanlardan sadece biri Mathematica olacaktır, ancak muhtemelen string manipülasyon işleri için değildir.
Martin Ender

3
Sadece bunu yapan fonksiyonu mı yoksa bütün programı mı istiyorsun? Giriş / çıkış kodunu da istiyor musunuz?
jzm

Yanıtlar:


11

CJam - 33

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

1 tabanlı dizinleri alır (0 tabanlı için 2 bayt daha)

Açıklama:

lGirişten bir satır okur ( qtüm girdiyle değiştirir )
elküçük harfe dönüştürür
"llama"{...}/her "llama" harfinin bloğunu çalıştırır
1$, geçerli dizeyi kopyalar
#, harf
)_artışlarının indeksini bulur ve kopyalar
T+:TT (başlangıçta 0) ekler, T'yi günceller ve bırakır yığında
\@öğeleri değiştirir, şimdi current-T, index var, string dizgede
>dizgiyi başlatır
;, kalan dizgiyi
]çıkarır dizgileri dizgede toplar.
Bu noktada tüm 1 tabanlı dizinlere sahibiz; Herhangi bir harf bulunamazsa, dizinin kopyaları olacaktır.
___dizi 3 daha fazla kopyasını yapan
|(2 dizi kopya) çiftleri kaldırır
=karşılaştırır, yinelenen varsa
*0 olur veya diziyi 0 veya 1 defa çarpmazsa 1 olur.


sourceforge.net/p/cjam/wiki/ Dil hakkında daha fazla bilgi için tıklayın. Benim için yeni.
TankorSmash

12

Perl, 52 bayt

Çözüm, dizeyi argüman olarak alan ve bir konum listesi döndüren işlev olarak sunulur.

  • Tek satırlı konumlar, büyük / küçük harfe duyarlı arama, yeni satırlar olmadan: 52 bayt

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

    Büyük / küçük harfe duyarlı arama, soru örneğinde boş bir dizi döndürür, çünkü ilk üç harfi eşleştirdikten sonra küçük harf mgiriş metninde yoktur.

  • Newlines desteği: + 1 bayt = 53 bayt

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

    Metin şimdi birkaç satıra yayılabilir.

  • Büyük küçük harf duyarlı arama: + 1 bayt = 54 bayt

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

    Şimdi sorudaki örnekte dizin konumlarının bir listesi rapor ediliyor, bunlar tek tabanlı sayılar:

    [45 68 77 106 115]
    
  • Sıfır tabanlı konumlar: + 9 bayt = 63 bayt

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

    Sorudaki örneğin sonucu:

    [44 67 76 105 114]
    

Ungolfed:

İkinci değişken, diğer değişkenleri az ya da çok içerir.

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
Bu aynı zamanda girişin ASCII veya en azından tam Unicode olmadığını varsaymaktadır. Perl'in
regex'leri bugünlerde grafiğin

@Trejkaz: Unicode burada önemli değil: (a) "lama" ASCII'dir ve harfleri ASCII olmayan Unicode karakteriyle veya UTF-8'deki bayt temsiliyle çarpışmaz. (b) Çok baytlı kodlamalar akılda tutulduğunda, sorudaki "indeks" terimi belirtilecektir. Dizin, karakter pozisyonu veya bayt (saklama) pozisyonu ile ilgili olabilir. (c) Herhangi bir kodlamanın karakter pozisyonları ile desteklenmesi, kodlamanın bilinmesi ve ek bir argüman olarak sunulması gerektiği anlamına gelir.
Heiko Oberdiek

İlk iki çözümünüz yazdırıyor []ve üçüncüsü [ ]benim için yazdırıyor (daha uzun olanlar doğru çalışıyor). Ben "msn-64int için inşa perl, v5.8.8" çalıştırıyorum. Bir hatan var mı, yoksa farklı bir perl sürümü üzerinde mi çalışıyor?
Tim S.

@TimS .: []ilk çözüm için doğru, Mbüyük / küçük harfe duyarlı bir aramada eşleşmiyor. Büyük / küçük harfe duyarlılık konusunda soru net değil.
Heiko Oberdiek

Tamam, []ilk iki için kabul edilebilir. Ancak ilk üç çözüm benim için hala doğru çalışmıyor: endeksleri döndürmesi gereken girdiyi verirseniz, geri döner[ ]
Tim S.

10

sed, 299 + 1

Evet, sed bir lama bulabilir. Hayır, sed matematik yapamaz. Bu, şu ana kadarki en uzun cevap, 299 + 1 karakter, çünkü saymayı öğretmek zorunda kaldım.

Bu cevap, genişletilmiş düzenli ifadelerle ( sed -Eveya sed -r) bir sed gerektirir . OpenBSD sed (1) kullandım . Giriş satır başına bir dizedir. (Bu nedenle, dize yeni satır içermeyebilir.) Çıktı bir sayı satırı veya hiçbir şeydir.

Kullanım (+1 karakter -r):

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

Kaynak kodu (299 karakter):

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

Program ilk önce lama ile beşi değiştirir %. (Tüm %bu programa hazır bulunmaktadır.) İlk komut s/%/z/gbir değişikliği %için zgiriş hattı. Sonraki beş komut lama'yı bulur, böylece tüm omuzlardaki bütün kollar ağrıyabilir. % ll omuzlarında%% silah olur % ay% che che. Her .*biri açgözlü olduğu için her zaman sağdaki lama'yı bulurum : lama lama , %%%%% lama olur . Beş tane alamıyorsanız %, o zaman /(.*%){5}/!dgiriş hattını siler ve bir sonraki komutları atlar.

s/[^%]/z/gher karakteri ancak %değiştirir z. Sonra bir döngüye giriyorum. s/(z*)%/\10 z\1/ilkini %değiştirir 0, sıfırdan veya daha fazlasını zsoldan sağa kopyalar ve bir tane daha zsağa ekler . Bu sayede zindeks eşit olacaktır. Örneğin, zz%zzz%...olur zz0 zzzzzzzz%...birinci çünkü %dizin 2'ye oldu ve sonraki %8. dizinde olduğunu s/z*$//kaldırır ekstra zdizenin sonundaki.

Bir sonraki on bir komut zher birini kaldırarak zve onlardan sayarak sayıyor 0. Bu gibi sayar zzz0, zz1, z2, 3. Ayrıca 1zzzz9olur z1zzz0(daha sonra 23) ya da zzzz9olur 1zzz0(daha sonra 13). Artık kalmayıncaya kadar bu döngü devam eder %ya z.


1
Sed saymak öğretmek için +1. Bir lama öğretmek, sed'den saymak için daha kolaydır.
Andreï Kostyrka,

9

Fortran - 154 148

Fortran golf oynamaktan berbat, ancak sadece ayrıştırma dizelerinin matematik temelli bir dilde yapılabileceğini kanıtlamak için yaptım:

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

Ben-gerekmemektedir ortadan kaldırarak birkaç karakter kurtardı fsonunda endfunctionve ikinci el if(any(r==0))yerine if(.not.all(r>0)).

Bu gerektirir:

  1. s metin içeren dize olmak
  2. aKüçük harf testi olmak (yani, llama)
  3. bbüyük harfli sınav olmak (yani LLAMA)

Dolu, golfsüz program

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

Modern Fortran en azından sahaya ve alanlara girebilir. FORTRAN IV hala çılgın golf oynuyor olacaktı.
ClickRick

4
@ClickRick: Fortran IV, öğrenemediğim bir şey. İstediğimden emin değilim. Zorla girme ve büyük harf kullanımı ile ilgili bir şey beni rahatsız ediyor.
Kyle Kanos,

7

C # - 119

Dize alır, diziyi çıktılar. Dize llama yoksa boş.

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 içinx=>x>=0
TıklamaRick

Etkilendim. Bunun için olan fikirlerimden çok daha küçük. i-1'i başlatarak ve .Select deyimine .ToArray () 'yi koyarak daha küçük yapabileceğinizi öğrendimint[]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;}
bunun

7

Ruby, 56 65 63

Düzenleme : +9 karakter, büyük / küçük harfe duyarlı değildir.

Bir fonksiyon tanımlar (teknik olarak lambda) f.

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

nilLama yoksa döndürür . Eğer [](boş dizi) olması gerekiyorsa, toplam 4 ekstra karakter için ||[]en sondan önce ekleyin .}

Okunabilir sürüm:

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

Bir süre sonra sorumu düzenlediğim için özür dilerim, ancak sadece lama olmasa da dizinin sıfır, boş, boş veya tanımsız olabileceğini ekledim.
Cilan

21
Yani bir Llambda ile yaptın?
Mason Wheeler

@Doorknob, küçük harf yerine küçük harf kullanarak iki bayt daha kısa olur mu?
dstarh

@dstarh Yep, teşekkürler
Doorknob

Büyük küçük harfe duyarsızlığı index(/#{c}/iyerine bir bayt ucuza alabilirsiniz düşünüyorum upcase.
histocrat

6

C - 53

İle derleyin:

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

Bu derleme komutunu cygwin'in gcc'si ile test ettim. Diğer ortamlar boşlukları ve diğer özel karakterleri farklı şekilde işleyebilir.

0 tabanlı sonuç dizide saklanır r. İpte lama olmadığında içeriği tanımlanmaz.

  • Büyük küçük harf duyarlı (53)

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

  • Büyük / küçük harf duyarlı (58)

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


4

JavaScript (ECMAScript 6) - 68 Karakterler

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

Test edilecek dizenin değişkende olduğunu varsayar s. Bir işleve dönüştürmek istiyorsanız, f=s=>hazırlayın (ek 5 karakter için).

Çıktılar:

[]

Büyük / Küçük Harf Duyarlı - 69 Karakter

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

Çıktılar:

[68, 80, 93, 105, 114]

Büyük / Küçük Harf Duyarsız ve İlk Eşleşme - 74 Karakter

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

Çıktılar:

[44, 67, 76, 105, 114]

4

Python, 100

Ben şimdiye kadarki en kötü golfçüyüm. : P

6 byte'lık tıraş için @xnor'a teşekkürler.

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 sonra diziyi içerir.

EDIT : Sabit.

DÜZENLEME 2 : len(g)için g, o==5karşı o>4@ XNOR önerilerini göre.

3 EDIT : @WolframH düzeltti.


2
o*=(len(o)==5)olduğu mükemmel . Korkunç, ama bayıldım!
kevinsa5

Bu satırdaki dış parantezlerin gerekli olduğunu sanmıyorum. İki karakteri kaldırarak kaydedebilirsiniz.
user2357112

@ user2357112 Bu ikinci son satırda mı? Onları kaldıracağım.
cjfaure

Sanırım sgiriş dizesi doğru mu? Sonra gerekmiyor s.lowerolmak i.lower? Ancak, bu doe
Monica

@WolframH ah, evet, yarın düzeltecek.
cjfaure

3

Python 71

Girdiyi varsayar s. Çıktı o.

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

Düzenleme: 2 bayt kaydetmek için listelerden tuples'e değiştirildi.


1
Booleans ile listeleri çarpma eğlenceli, değil mi? ; D
cjfaure

Almak oiçin boşuna başlamaya ihtiyaç duyma probleminden nasıl kurtulduğunuzu seviyorum o[-1]. Sadece başlamak için olsa Belki daha kısa oolarak [-1]ve daha sonra bunu o=o[1:]? Can sıkıcı bir şekilde, ilk içeriyorsa -1kontrol edin . o-1
xnor

@xnor: -1-Dea'nın çalışmak için yapılabileceğini sanmıyorum . En azından başaramadım :-( Ancak, 2 byte tasarruf etmek için listeleri tote olarak değiştirdim. :-)
Reinstate 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)]

Numune:

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"

Ungolfed:

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"

Örnek:

*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

Dizeyi arar ve bir sonraki karakteri aramadan önce her eşleşmeye kadar her şeyi anlamsızca değiştirir. sBir kelime oluşmazsa tanımsız bırakacaktır .

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

Büyük / küçük harf duyarlılığına izin verilirse charcount’un düşebileceğini unutmayın.

Önceki sürümler

 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

Dizeyi arar ve bir sonraki karakteri aramadan önce her eşleşmeye kadar her şeyi anlamsızca değiştirir. Hata işleme (try-catch-end) belki bırakılabilir, ardından llama bulunmazsa program kilitlenir (ancak gerektiğinde tanımlanamaz).

Uygulama:

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

Hata işleme olmadan:

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

Fikir gibi, charcount'ları da biraz düşürdüm.
Dennis Jaheruddin

2

Dil 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

Python (70)

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

'llama'Önceden bulunan karakterin bulunduğu yerden başlayarak sırayla her bir karakteri ararız. Hiçbir karakter bulunamazsa, cvarsayılan değer olur, -1bu durumda son satır rboş listeye döner .

Düzenleme: 4 karakter kaydederek str.find(s,...)çağrılabildiği bulundu s.find(...).


2

OpenEuphoria, 147 128

Benim iki örneğim var. İlk olarak, en kısa:

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

Yukarıdaki C versiyonundaki gibi "veya" yerine "ve" kullanırsam 126 karaktere kadar indirebilirim. Ancak, bu da dizeyle eşleşir ''!-!olarak llama. Seyrek, ancak yine de olası bir hata.

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

Ve sonra düzenli ifadeleri kullanarak sürüm:

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

Her ikisi de STDIN'den giriş alır ve STDOUT'ya gönderir.

EDIT: Daha kısa regex örneği:

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

Regex'i split/ joinveya explode/ ile oluşturarak bir kaçını kurtarmak mümkün mü implodeyoksa OpenEuphoria'da bu sürümlerin kısa versiyonları yok mu?
Peter Taylor

OpenEuphoria karakter dizeleri ile ayrılabilir / birleştirilebilir, ancak bunu daha kısa sürede yapmanın bir yolunu göremiyorum. Düzenli ifadelerle çok iyi değilim; Burada kullanılan regex, bu sayfadaki diğer örneklerden birinden "esinlenerek çalındı" dan esinlenildi.
TinSoldier,

2

Güç kalkanı - 121 85

Hala Powershell ile pratik yapıyorum, bunun daha iyi olmasını bekliyorum

$ s dizeyi içerir, sonuç $ a dizisindedir

Orijinal versiyon

$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

Ungolfed

$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 sayesinde devasa yeni sürüm

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

112’ye kadar olan şeyleri kısaltmak için oradaki çok fazla alanı kaldırabilirsiniz:$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

Ayrıca, sonradan a değiştirdiğiniz sürece foreach($i in $s.tochararray())ile [char[]]$s|%değiştirebilirsiniz . Bu 93 aşağı tıraş:$i$_$a=@();$w="llama";$n=$c=0;[char[]]$s|%{if($_-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
goric

$wDeğişkeni tamamen kaldırarak 5 karakter daha kazanın , çünkü yalnızca bir kez kullanıldı. Sadece eğer içine eğer in:if($i-eq"llama"[$n])
goric

..ve tabii ki, senin yerine +=1birlikte s ++s
goric

1

PHP

PHP cevabı yok mu? Ağır dize yönelimli bir dilin en azından matematik temelli bir dili geçebileceğini düşünüyorum

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 numaralı 154’e karşı 152 iş yapıldı: P

ungolfed

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

arayan her zaman küçük bir dize geçirirse, 137


<?Geçerli hale getirmek için kodunuzun başına eklemeniz gerekir . Üzgünüz ...
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:[]}

Bir dizgeyi tek argümanı olarak alan bir işlevi tanımlar (ikinci argüman ucuzdur var ) olarak alan ve boş bir dizi ya da 5 elemanlı bir dizi döndüren .

Girdiyi tek bir char değişkenine ( s) alıp çıktıyı başka bir ( b) bırakırsam 108 değerine düşer :

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

Düzenleme: Döngü için harita değiştirildi.


ECMAScript 6 versiyonu (81 karakter) -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 konsolunda kullanım örneği:

>> 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 tabanlı endeksleme kullanır. []Llama dizisi bulunmazsa boş listeye döner (büyük / küçük harf duyarlı).

Ungolfed:

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

En kısa kod değil, ancak bir APL biçiminde oldukça çarpık.

açıklama

'amall',⊂⍬⍞ 6 element dizisi yapın: 'amall' harfleri ve 2 elementin alt dizisi, kendileri alt diziler: boş dizi ve girdiden okunan bir karakter dizisi.

{...}/... Sağlanan işlevi kullanarak 6 öğeli diziyi azaltın (sağa katlayın).

a s←⍵ Doğru argümanı indeks dizisine ve kalan alt dizgeye (başlangıçta boş diziye ve tam dizgeye) ayırın.

~⍺∊s:⍬⍬ Alt dize bir sonraki harfi içermiyorsa , hesaplamayı durdurun ve boş diziyi döndürün.

a,←n←s⍳⍺ Aksi halde, konumunu bulun, n olarak adlandırın ve dizinler dizisine ekleyin.

a(n↓s) 2 öğeli bir dizi yapın ve döndürün: genişletilmiş dizinler dizisi ve kalan alt dize.

+\↑⊃... Katlamanın çıktısını paketinden çıkarın, ilk öğeyi (indeks dizisini) alın ve göreceli ofsetleri mutlak olanlara dönüştürmek için ekleme ile tarayın.

Örnekler

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

Julia dilini kullanan başka bir regex örneği.

f(s)=(m=match(r"(?i)(l).*?(l).*?(a).*?(m).*?(a)",s);m==nothing?m:m.offsets)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.