นำออกมาด้านในของประโยค


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" ปรากฏขึ้น (ตามลำดับอย่างใดอย่างหนึ่ง) ตัวอย่างเช่นให้ฉันแสดงตัวอักษรที่ชี้ไปที่มีเครื่องหมายรูปหมวกเพื่อแสดงดัชนี:

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 ตัวเลขจะดูแตกต่างกัน

หากข้อความนั้นไม่มีลามาดังนั้นอาร์เรย์ควรจะว่างเปล่าไม่มีค่าเป็นโมฆะหรือไม่ได้กำหนด

ยอมรับรหัสภาษาใดก็ได้ นี่คือการแข่งขันดังนั้นตัวละครน้อยชนะ!


7
@TheWobbuffet คุณเปลี่ยนชื่อผู้ใช้และรูปภาพของคุณ มีเวลาเมื่อคุณเป็น "Doorknob" และมีรูปของเขา ตอนนี้รูปของคุณเป็นแกะ คุณควรเปลี่ยนเป็นลามะ
Justin

1
สิ่งที่เกี่ยวกับการทำดัชนีตาม 0 เทียบกับ 1? เราสามารถใช้การจัดทำดัชนีที่ใช้โดยภาษาของเราหรือการส่งทั้งหมดต้องสอดคล้องกับอนุสัญญาหนึ่งข้อ (อันไหน)
Martin Ender

1
@Quincunx แกะบอกว่า '42' บนนั้น!
Cilan

2
@TheWobbuffet มีวิธีการเชิงคณิตศาสตร์มากเกินไป: - / (Matlab, Mathematica, Julia, ฉันไม่รู้เกี่ยวกับ R) ... เช่นกัน Lua และ Smalltalk เพียงคนเดียวที่เกี่ยวข้องกับการตีกอล์ฟจะเป็น Mathematica แต่อาจไม่เหมาะสำหรับงานการจัดการสตริง
Martin Ender

3
คุณเพียงแค่ต้องการฟังก์ชั่นที่ใช้งานหรือโปรแกรมทั้งหมดหรือไม่? คุณต้องการรหัสอินพุต / เอาต์พุตเช่นกันหรือไม่?
jzm

คำตอบ:


11

CJam - 33

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

ได้รับดัชนี 1 รายการ (เพิ่ม 2 ไบต์สำหรับฐาน 0)

คำอธิบาย:

lอ่านบรรทัดจากอินพุต (แทนที่ด้วยqสำหรับอินพุตทั้งหมด)
elแปลงเป็นตัวพิมพ์เล็ก
"llama"{...}/ดำเนินการบล็อกสำหรับแต่ละตัวอักษร "ลามะ"
1$คัดลอกสตริงปัจจุบัน
#ค้นหาดัชนีของการ
)_เพิ่มตัวอักษรและซ้ำกัน
T+:Tเพิ่ม T (เริ่ม 0) อัปเดต T และปล่อยมัน ใน stack
\@swaps items รอบ ๆ ตอนนี้เรามี current-T, index, string
>ส่วนที่สตริงเริ่มต้นที่ดัชนี
;จะปรากฏขึ้นสตริงที่เหลือจะ
]รวบรวมดัชนีในอาร์เรย์
ณ จุดนี้เรามี 1 ดัชนีตามทั้งหมด ถ้าไม่พบจดหมายใด ๆ อาร์เรย์จะมีการทำซ้ำ
___ทำให้สำเนาเพิ่มเติมอีก 3 ชุด
|(พร้อมสำเนา 2 ชุด) ลบรายการที่ซ้ำกันออก
=เปรียบเทียบส่งผลให้ 0 ถ้ามีซ้ำกันหรือ 1 ถ้าไม่
*คูณอาร์เรย์ 0 หรือ 1 ครั้งตาม


sourceforge.net/p/cjam/wiki/Homeสำหรับข้อมูลเพิ่มเติมเกี่ยวกับภาษา ใหม่สำหรับฉัน
TankorSmash

12

Perl, 52 ไบต์

วิธีการแก้ปัญหามีให้เป็นฟังก์ชั่นที่ใช้สตริงเป็นอาร์กิวเมนต์และส่งกลับรายการของตำแหน่ง

  • การค้นหาแบบคำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์ใหญ่โดยไม่ขึ้นบรรทัดใหม่: 52 ไบต์

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

    การค้นหาแบบตรงตามตัวพิมพ์ใหญ่ - เล็กส่งคืนอาร์เรย์ว่างในตัวอย่างของคำถามเนื่องจากหลังจากจับคู่ตัวอักษรสามตัวแรกตัวอักษรตัวพิมพ์เล็กmจะหายไปในข้อความอินพุต

  • การสนับสนุนของบรรทัดใหม่: + 1 ไบต์ = 53 ไบต์

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

    ข้อความสามารถขยายได้หลายบรรทัด

  • การค้นหาแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่: + 1 ไบต์ = 54 ไบต์

    sub l{pop=~/(l).*?(l).*?(a).*?(m).*?(a)/si;@+[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]
    

Ungolfed:

ตัวแปรหลังรวมตัวแปรอื่น ๆ ไม่มากก็น้อย

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 เว้นแต่ regexes ของ Perl อย่างถูกต้องเคารพขอบเขตอักษรวันนี้ (แน่นอนพวกเขาไม่ได้กลับมาเมื่อผมมีความโชคร้ายของการใช้มัน.)
Trejkaz

@Trejkaz: Unicode ไม่สำคัญเลย: (a) "llama" คือ ASCII และตัวอักษรไม่ได้ชนกับอักขระ Unicode ที่ไม่ใช่ ASCII หรือการแทนไบต์ใน UTF-8 (b) ด้วยการเข้ารหัสแบบหลายไบต์ในใจคำว่า "ดัชนี" ในคำถามจะไม่ได้รับการระบุให้ลึก ดัชนีสามารถเกี่ยวข้องกับตำแหน่งอักขระหรือตำแหน่งไบต์ (ที่เก็บข้อมูล) (c) การสนับสนุนการเข้ารหัสใด ๆ ที่มีตำแหน่งอักขระจะหมายถึงว่าการเข้ารหัสควรเป็นที่รู้จักและจำเป็นต้องมีการระบุเป็นอาร์กิวเมนต์เพิ่มเติม
Heiko Oberdiek

โซลูชันสองรายการแรกของคุณพิมพ์[]และงานพิมพ์ที่สาม[ ]สำหรับฉัน ( โซลูชันที่ยาวกว่าทำงานได้อย่างถูกต้อง) ฉันใช้ "perl, v5.8.8 ที่สร้างขึ้นสำหรับ msys-64int" คุณมีข้อบกพร่องหรือมันทำงานในรุ่นที่แตกต่างกันของ Perl?
Tim S.

@TimS .: []ถูกต้องสำหรับวิธีแก้ปัญหาแรกMไม่ตรงกับการค้นหาแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก คำถามค่อนข้างชัดเจนเกี่ยวกับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
Heiko Oberdiek

ตกลงดังนั้น[]เป็นที่ยอมรับสำหรับสองคนแรก แต่วิธีแก้ปัญหาสามข้อแรกนั้นยังทำงานไม่ถูกต้องสำหรับฉัน: ถ้าคุณให้อินพุตที่ควรส่งคืนดัชนีก็จะส่งคืน[ ]
Tim S.

10

sed, 299 + 1

ใช่ sed สามารถหาลามะ ไม่สิไม่สามารถทำคณิตศาสตร์ได้ นี่คือคำตอบที่ยาวที่สุดที่ 299 + 1 ตัวอักษรเพราะฉันต้องสอนให้นับ

คำตอบนี้ต้องการข้อความที่มีการแสดงออกปกติเพิ่มเติม ( sed -Eหรือsed -r) ผมใช้ OpenBSD sed (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

%โปรแกรมแรกแทนที่ลากับห้า (ทุก%ในโปรแกรมนี้มีตัวอักษร.) คำสั่งแรกs/%/z/gการเปลี่ยนแปลงใด ๆ%ที่จะzอยู่ในสายการป้อนข้อมูล คำสั่งห้าข้อต่อไปจะค้นหาตัวลามะดังนั้นแขนทั้งหมดบนบ่าทั้งหมดอาจปวด กลายเป็นแขน% A บน% ll ไหล่% ay% che เพราะแต่ละ.*คือโลภฉันมักจะพบว่าสัตว์สี่เท้าชนิดด้านขวา: ลาลาจะกลายเป็นสัตว์สี่เท้าชนิด %%%%% หากฉันไม่สามารถรับห้าได้%ให้/(.*%){5}/!dลบบรรทัดอินพุตและข้ามคำสั่งถัดไป

s/[^%]/z/gการเปลี่ยนแปลงตัวละครทุกตัว แต่จะ% zจากนั้นฉันก็เข้าสู่วง s/(z*)%/\10 z\1/เปลี่ยนรายการแรก%เป็น0คัดลอกศูนย์หรือมากกว่าzจากซ้ายไปขวาและเพิ่มอีกหนึ่งรายการzเป็นขวา นี่คือจำนวนของzจะเท่ากับดัชนี ตัวอย่างเช่นzz%zzz%...กลายเป็นzz0 zzzzzzzz%...เพราะสิ่งแรก%คือที่ดัชนี 2 และถัดไป%ที่ดัชนี 8 s/z*$//ลบพิเศษzจากจุดสิ้นสุดของสตริง

สิบเอ็ดคำสั่งต่อไปนับzโดยการเอาแต่ละและนับเพิ่มขึ้นจากz 0มันนับเช่นzzz0, zz1, ,z2 3นอกจากนี้1zzzz9จะกลายเป็นz1zzz0(ในภายหลัง23) หรือzzzz9กลายเป็น1zzz0(ในภายหลัง13) วงนี้ต่อไปจนกว่าจะไม่มีมากขึ้นหรือ%z


1
+1 สำหรับการสอนเพื่อนับ มันง่ายกว่าที่จะสอนลามะให้นับนับว่าดีกว่า
Andreï 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

Modern Fortran ได้รับอนุญาตอย่างน้อยในสนามและพื้นที่พัต FORTRAN IV ยังคงเล่นกอล์ฟอย่างบ้าคลั่ง
ClickRick

4
@ClickRick: Fortran IV เป็นสิ่งที่ฉันไม่ได้เรียนรู้ ไม่แน่ใจว่าฉันต้องการ สิ่งที่เกี่ยวกับการเยื้องที่ถูกบังคับและการใช้ตัวพิมพ์ใหญ่เป็นการรบกวนฉัน
Kyle Kanos

7

C # - 119

ใช้สตริงเอาต์พุตอาร์เรย์ เป็นศูนย์ถ้าไม่มีลามะอยู่ในสตริง

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 สำหรับx=>x>=0
ClickRick

ผมประทับใจ. เล็กกว่าความคิดของฉันสำหรับสิ่งนี้ ฉันพบว่าคุณสามารถทำให้มันเล็กลงโดยการเริ่มต้นiที่ -1 และวาง. 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;}
Select

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

ฉันขอโทษสำหรับการแก้ไขคำถามของฉันหลังจากเวลาผ่านไป แต่ฉันเพิ่งเพิ่มว่าอาร์เรย์ถ้าไม่มีลามะสามารถเป็นศูนย์ว่างเปล่าว่างเปล่าหรือไม่ได้กำหนด
Cilan

21
ดังนั้นคุณจึงทำกับ llambda?
Mason Wheeler

@Doorknob จะสั้นลงสองไบต์โดยใช้ upcase แทน downcase ไม่ใช่หรือ?
dstarh

@dstarh อ๋อขอบคุณ
Doorknob

คิดว่าคุณจะได้รับกรณีไม่รู้สึกไบต์ราคาถูกโดยทำแทนindex(/#{c}/i upcase
ฮิสโทแกต

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

ฉันทดสอบคำสั่งคอมไพล์นี้ด้วย gcc ของ cygwin สภาพแวดล้อมอื่นอาจจัดการช่องว่างและอักขระพิเศษอื่น ๆ แตกต่างกัน

0 ผลตามจะถูกเก็บไว้เป็น rarray เนื้อหาไม่มีการกำหนดหากไม่มีลามะอยู่ในสายอักขระ

  • เล็ก ๆ น้อย ๆ (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 ตัวอักษร)

ขาออก:

[]

Case Insensitive - 69 ตัวอักษร

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

ขาออก:

[68, 80, 93, 105, 114]

Case Insensitive & First Match - 74 ตัวละคร

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

ขาออก:

[44, 67, 76, 105, 114]

4

Python 100

ฉันเป็นนักกอล์ฟที่แย่ที่สุดที่เคยมีมา : P

ขอบคุณ @xnor สำหรับการโกนขนาด 6 ไบต์

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 มีอาร์เรย์หลังจาก

แก้ไข : แก้ไข

แก้ไข 2 : len(g)การg, o==5เพื่อo>4ให้เป็นไปตาม @ XNOR ของข้อเสนอแนะ

แก้ไข 3 : @ WolframH แก้ไข


2
o*=(len(o)==5)เป็นที่ยอดเยี่ยม มันน่ากลัว แต่ฉันรักมัน!
kevinsa5

ฉันไม่คิดว่าจำเป็นต้องใส่วงเล็บด้านนอกในบรรทัดนั้น คุณสามารถบันทึกอักขระสองตัวโดยการลบออก
user2357112 รองรับ Monica

@ user2357112 ในบรรทัดสุดท้ายที่สอง? ฉันจะลบพวกมัน
cjfaure

ฉันถือว่าsเป็นสตริงอินพุตใช่ไหม ไม่ควรs.lowerเป็นเช่นนั้นi.lower? อย่างไรก็ตาม Doe นั้น
Reinstate Monica

@ Wolfram เอ่อใช่จะแก้ไขในวันพรุ่งนี้
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

แก้ไข:เปลี่ยนจากรายการเป็น tuples เพื่อบันทึก 2 ไบต์


1
รายการทวีคูณโดย booleans สนุกใช่มั้ย ; D
cjfaure

ฉันชอบวิธีที่คุณหลีกเลี่ยงปัญหาที่oจะต้องเริ่มต้นโดยไม่ต้องทำo[-1]อะไร บางทีมันอาจจะสั้นกว่าแม้ว่าจะเพียงแค่เริ่มต้นoเป็น[-1]และต่อมาทำo=o[1:]? รำคาญที่เริ่มต้น-1การเดินทางขึ้นตรวจสอบถ้ามีo -1
xnor

@ xnor: ฉันไม่คิดว่า-1-Idea สามารถทำงานได้ อย่างน้อยฉันก็ไม่ประสบความสำเร็จ :-( อย่างไรก็ตามฉันเปลี่ยนรายการเป็น tuples เพื่อบันทึก 2 ไบต์ :-)
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)]

ตัวอย่าง:

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"

ตัวอย่าง:

*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

โปรดทราบว่า charcount อาจลดลงหากได้รับอนุญาตความไวตัวพิมพ์เล็กและใหญ่

รุ่นก่อนหน้า

 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 จะไม่ได้กำหนดตามที่จำเป็น) หากไม่พบลามะ

การดำเนินงาน:

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

เช่นเดียวกับความคิดที่ได้ลด charcount เล็กน้อย
Dennis Jaheruddin

2

ภาษาจาวา

 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'ลำดับโดยเริ่มจากตำแหน่งของอักขระที่พบก่อนหน้านี้ หากไม่พบอักขระจะcกลายเป็นค่าเริ่มต้น-1ซึ่งในกรณีนี้บรรทัดสุดท้ายจะเปลี่ยนrเป็นรายการว่าง

แก้ไข: พบว่าstr.find(s,...)สามารถเรียกใช้เป็นs.find(...)บันทึก 4 ตัว


2

OpenEuphoria, 147 128

ฉันมีสองตัวอย่าง ก่อนที่สั้นที่สุด:

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

ฉันสามารถลดความยาวได้ถึง 126 ตัวอักษรถ้าฉันใช้ "หรือ" แทนที่จะเป็น "และ" เหมือนรุ่น C ที่ทำขึ้นด้านบน แต่นี้ยังตรงกับสตริงเป็น''!-! 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

แก้ไข: ตัวอย่าง regex ที่สั้นกว่า:

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 ด้วยsplit/ joinหรือexplode/ implodeหรือ OpenEuphoria ไม่มีเวอร์ชั่นสั้น ๆ
Peter Taylor

OpenEuphoria สามารถแยก / เข้าร่วมกับสตริงอักขระได้ แต่ฉันไม่เห็นวิธีที่จะทำได้ในลักษณะที่สั้นกว่า ฉันไม่ค่อยดีกับการแสดงออกปกติ regex ที่ใช้ที่นี่คือ "แรงบันดาลใจ" (ขโมยลงคอ) จากตัวอย่างหนึ่งในหน้านี้
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

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

$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
กอริลลา

บันทึก 5 ตัวอักษรเพิ่มเติมโดยลบ$wตัวแปรทั้งหมดเนื่องจากใช้เพียงครั้งเดียว เพียงอินไลน์เข้าใน if:if($i-eq"llama"[$n])
goric

.. และแน่นอนแทนที่+=1s ของคุณด้วย++s
goric

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

152 เทียบกับ fortran 154 งานที่เสร็จ: หน้า

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

ถ้าผู้เรียกส่งสตริงตัวพิมพ์เล็กเสมอมันจะลดลงถึง 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:[]}

กำหนดฟังก์ชั่นที่รับสตริงเป็นอาร์กิวเมนต์เพียงตัวเดียว (อาร์กิวเมนต์ที่สองคือราคาถูกvar) และส่งคืนอาร์เรย์ว่างหรืออาร์เรย์ 5 องค์ประกอบ

ลดลงถึง 108 ถ้าฉันใช้อินพุทกับตัวแปรถ่านตัวเดียว ( s) และปล่อยเอาท์พุทเป็นอีกตัวหนึ่ง ( b):

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

แก้ไข: เปลี่ยนแผนที่สำหรับวง


รุ่น 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 ฐาน ส่งคืนรายการว่างเปล่า[]หากไม่พบลำดับลามา (ตัวพิมพ์เล็กและใหญ่)

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

ไม่ใช่รหัสที่สั้นที่สุด แต่ค่อนข้างบิดเบี้ยวในทาง APL

คำอธิบาย

'amall',⊂⍬⍞ สร้างอาร์เรย์ขององค์ประกอบ 6 ตัว: ตัวอักษร 'amall' และ subarray ของ 2 องค์ประกอบตัวเอง subarrays: อาร์เรย์ที่ว่างเปล่าและบรรทัดของอักขระที่อ่านจากอินพุต

{...}/... ย่อ (ขวาสุด) อาร์เรย์ 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.
 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.