Twoim celem jest, aby wziąć wkład jak
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
i utwórz tablicę indeksów łańcucha, w której pojawiają się litery, które składają się na słowo „Lama” (po jednym w kolejności). Na przykład pozwól mi pokazać litery wskazane za pomocą kursorów, aby pokazać indeksy:
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
^ ^ ^ ^ ^
Tak więc tablica wyglądałaby następująco:
[44, 67, 76, 105, 114]
(Jeśli Twoja aplikacja korzysta z indeksowania, które nie jest oparte na 0, liczby będą wyglądać inaczej. W porządku.)
Jeśli tekst nie zawiera lamy, tablica powinna być pusta, zerowa, zerowa lub niezdefiniowana.
Dowolny język kodu jest akceptowany. To jest konkurs golfowy , więc najmniej znaków wygrywa!
Odpowiedzi:
CJam - 33
Pobiera indeksy oparte na 1 (2 dodatkowe bajty dla 0)
Wyjaśnienie:
l
odczytuje wiersz z wejścia (zamień naq
na całe wejście)el
konwertuje na małe litery"llama"{...}/
wykonuje blok dla każdej litery „lamy”1$
kopiuje bieżący ciąg#
znajduje indeks)_
przyrostów liter i duplikujeT+:T
dodaje T (początkowo 0), aktualizuje T i opuszcza go na stosie\@
zamienia elementy wokół, teraz mamy bieżący-T, indeks, ciąg>
wycina ciąg rozpoczynający się od;
wyskakującego indeksu pozostały ciąg]
zbiera indeksy w tablicyW tym momencie mamy wszystkie indeksy oparte na 1; Jeśli żadna litera nie została znaleziona, tablica będzie miała duplikaty.
___
wykonuje 3 kolejne kopie tablicy|
(z 2 kopiami tablicy) usuwa duplikaty=
porównuje, czego wynikiem jest 0, jeśli były duplikaty, lub 1, jeśli nie, odpowiednio*
mnożą tablicę 0 lub 1 razyźródło
Perl, 52 bajty
Rozwiązanie jest dostarczane jako funkcja, która przyjmuje ciąg znaków jako argument i zwraca listę pozycji.
Pozycje w oparciu o jedną pozycję, wyszukiwanie z rozróżnianiem wielkości liter, bez znaków nowej linii: 52 bajty
Wyszukiwanie z rozróżnianiem wielkości liter zwraca pustą tablicę w przykładzie pytania, ponieważ po dopasowaniu pierwszych trzech liter
m
w tekście wejściowym brakuje małej litery .Obsługa znaków nowej linii: + 1 bajt = 53 bajty
Tekst może teraz obejmować kilka wierszy.
Wyszukiwanie bez rozróżniania wielkości liter: + 1 bajt = 54 bajty
Teraz przykład w pytaniu podaje listę pozycji indeksu, są to liczby oparte na jednym:
Pozycje zerowe: + 9 bajtów = 63 bajty
Wynik dla przykładu w pytaniu:
Nie golfowany:
Ten ostatni wariant obejmuje mniej więcej inne warianty.
źródło
[]
a trzecie[ ]
dla mnie (te dłuższe działają poprawnie). Korzystam z programu „perl, wersja 5.0.8 dla msys-64int”. Czy masz błąd, czy działa na innej wersji Perla?[]
jest poprawny dla pierwszego rozwiązania,M
nie jest dopasowywany przy wyszukiwaniu z rozróżnianiem wielkości liter. Pytanie jest dość niejasne w odniesieniu do rozróżniania wielkości liter.[]
jest do przyjęcia przez pierwsze dwa. Ale pierwsze trzy rozwiązania nadal nie działają dla mnie dobrze: jeśli podasz dane wejściowe, które powinny zwrócić indeksy, to zwróci[ ]
sed, 299 + 1
Tak, sed może znaleźć lamę. Nie, sed nie potrafi matematyki. To najdłuższa jak dotąd odpowiedź, przy 299 + 1 znakach, ponieważ musiałem nauczyć sed liczyć.
Ta odpowiedź wymaga sed z rozszerzonymi wyrażeniami regularnymi (
sed -E
lubsed -r
). Użyłem OpenBSD sed (1) . Dane wejściowe to jeden ciąg w wierszu. (Dlatego ciąg nie może zawierać nowej linii.) Dane wyjściowe to linia liczb lub nic.Zastosowanie (+1 znak za
-r
):Kod źródłowy (299 znaków):
Program najpierw zamienia lamę na pięć
%
. (Wszystkie%
w tym programie są dosłowne.) Pierwsze polecenies/%/z/g
zmienia dowolne%
naz
w wierszu wprowadzania. Następne pięć poleceń znajduje lamę, więc wszystkie ramiona na wszystkich ramionach mogą boleć. staje się A %% broni na% ll ramiona% ay% che. Ponieważ każdy.*
jest chciwy, zawsze znajduję lamę po prawej stronie: lama lama staje się lamą %%%%% . Jeśli nie mogę dostać pięciu%
,/(.*%){5}/!d
usuwa wiersz wprowadzania i pomija następne polecenia.s/[^%]/z/g
zmienia każdy znak, ale%
doz
. Potem wchodzę w pętlę.s/(z*)%/\10 z\1/
zmienia pierwszą%
na0
, kopiuje zero lub więcejz
z lewej do prawej i dodaje jeszcze jednąz
z prawej. Jest to więc liczbaz
równa indeksowi. Na przykładzz%zzz%...
staje się,zz0 zzzzzzzz%...
ponieważ pierwszy%
był pod indeksem 2, a następny%
pod indeksem 8.s/z*$//
usuwa dodatkowez
z końca łańcucha.Następne jedenaście poleceń liczy
z
się, usuwając każde z nichz
i odliczając w górę0
. Liczy jakzzz0
,zz1
,z2
,3
. Również1zzzz9
staje sięz1zzz0
(później23
) lubzzzz9
staje się1zzz0
(później13
). Ta pętla trwa, dopóki nie będzie więcej%
lubz
.źródło
Fortran -
154148Fortran jest do bani w golfa, ale po to, aby udowodnić, że parsowanie łańcuchów można wykonać w języku opartym na matematyce, zrobiłem to:
Zapisałem kilka znaków, eliminując niepotrzebne
f
na końcuendfunction
i używaneif(any(r==0))
zamiastif(.not.all(r>0))
.To wymaga:
s
być ciągiem z tekstema
być testem na małe litery (tj.llama
)b
być testem na wielkie litery (tj.LLAMA
)Pełny program bez gry w golfa to
źródło
C # - 119
Pobiera ciąg znaków, tablicę wyników. Brak, jeśli nie ma lamy w łańcuchu.
źródło
x=>x>=0
i
na -1 i umieszczając .ToArray () w instrukcjiint[]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;}
Ruby,
566563Edycja : +9 znaków, dzięki czemu wielkość liter nie jest uwzględniana.
Definiuje funkcję (technicznie lambda)
f
.Zwraca,
nil
jeśli nie ma Lamy. Jeśli ma to być[]
(pusta tablica), to po prostu dodaj||[]
przed ostatnim}
w sumie 4 dodatkowe znaki.Wersja do odczytu:
źródło
index(/#{c}/i
zamiast tegoupcase
.C - 53
Połącz z:
Przetestowałem to polecenie kompilacji z gcc cygwina. Inne środowiska mogą inaczej obsługiwać spacje i inne znaki specjalne.
Wynik oparty na 0 jest przechowywany w tablicy
r
. Jego zawartość jest niezdefiniowana, jeśli w sznurku nie ma lamy.Z uwzględnieniem wielkości liter (53)
i,m,r[5];main(){for(;W[i];i++)W[i]==L[m]?r[m++]=i:i;}
Bez rozróżniania wielkości liter (58)
i,m,r[5];main(){for(;W[i];i++)(W[i]|96)==L[m]?r[m++]=i:i;}
źródło
JavaScript (ECMAScript 6) - 68 znaków
Zakłada, że ciąg do przetestowania znajduje się w zmiennej
s
. Jeśli chcesz przekształcić go w funkcję, dodajf=s=>
(dla dodatkowych 5 znaków).Wyjścia:
Rozróżnianie wielkości liter - 69 znaków
Wyjścia:
Rozróżnianie wielkości liter i pierwszy mecz - 74 znaków
Wyjścia:
źródło
Python, 100
Jestem najgorszym golfistą w historii. : P
Dzięki @xnor za zgolenie 6 bajtów.
o
zawiera tablicę po.EDYCJA : Naprawiono.
EDIT 2 :
len(g)
abyg
,o==5
abyo>4
zgodnie z sugestiami użytkownika @ XNOR.EDYCJA 3 : @WolframH naprawił to.
źródło
o*=(len(o)==5)
jest doskonała . To okropne, ale uwielbiam to!s
że ciąg wejściowy, prawda? Nie powinnos.lower
byći.lower
? Jednak ta królicaPython 71
Zakłada wejście w
s
. Wyjście wo
.Edycja: Zmieniono z list na krotki, aby zapisać 2 bajty.
źródło
o
na tym, że musisz zacząć niepusteo[-1]
. Może jednak krótsze jest rozpoczęcieo
tak, jak[-1]
i późniejo=o[1:]
? Irytujące, początkowe-1
potknięcia sprawdzają, czyo
zawiera-1
.-1
aby można było sprawić, że -Idea będzie działać. Przynajmniej mi się nie udało :-( Jednak zmieniłem listy na krotki, aby zapisać 2 bajty. :-)Python 100
Próba:
źródło
Haskell, 111
Nie golfowany:
Przykład:
źródło
Matlab, 61
96Przeszukuje ciąg znaków i zamienia wszystko do każdego dopasowania bełkotem przed szukaniem następnego znaku. Pozostawi
s
niezdefiniowane, jeśli słowo nie pojawi się.Pamiętaj, że liczba znaków może zostać zmniejszona, jeśli rozróżniana jest wielkość liter.
Poprzednie wersje
Przeszukuje ciąg znaków i zamienia wszystko do każdego dopasowania bełkotem przed szukaniem następnego znaku. Obsługa błędów (try-catch-end) może zostać porzucona, a następnie program zawiesi się (ale nie będzie zdefiniowany zgodnie z wymaganiami), jeśli lama nie zostanie znaleziona.
Realizacja:
Bez obsługi błędów:
źródło
Język Java
źródło
Python (70)
Po kolei szukamy każdej postaci
'llama'
, zaczynając od lokalizacji poprzednio znalezionej postaci. Jeśli nie zostanie znaleziony żaden znak,c
staje się wartością domyślną-1
, w którym to przypadku ostatni wiersz zamieniar
się w pustą listę.Edycja: okazało się, że
str.find(s,...)
można wywołać jakos.find(...)
, zapisując 4 znaki.źródło
OpenEuphoria,
147128Mam dwa przykłady. Po pierwsze, najkrótszy:
Mogę sprowadzić go do 126 znaków, jeśli użyję „lub” zamiast „i”, tak jak w wersji C wyżej. Jednak to również pasuje do ciągu
''!-!
jakollama
. Niezbyt często, ale wciąż możliwy błąd.A następnie wersja wykorzystująca wyrażenia regularne:
Oba pobierają dane ze STDIN i wysyłają do STDOUT.
EDYCJA: Krótszy przykład wyrażenia regularnego:
źródło
split
/join
lubexplode
/implode
, czy też OpenEuphoria nie ma krótkich wersji?PowerShell -
12185Nadal ćwiczę z Powershellem, spodziewaj się, że można to poprawić
$ s zawiera ciąg, wynik jest w tablicy $ a
Orginalna wersja
Bez golfa
Nowa wersja z ogromnym podziękowaniem za @goric
źródło
$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
foreach($i in $s.tochararray())
z[char[]]$s|%
tak długo, jak zmienić późniejsze$i
Do$_
. To goli go do 93:$a=@();$w="llama";$n=$c=0;[char[]]$s|%{if($_-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
$w
zmienną, ponieważ jest ona używana tylko raz. Wystarczy wstawić to do if:if($i-eq"llama"[$n])
+=1
S z++
SPHP
brak odpowiedzi PHP? Myślę, że język silnie zorientowany na sznurki może pokonać przynajmniej matematykę
152 przeciwko fortranowi 154, praca wykonana: P
bez golfa
jeśli dzwoniący zawsze przekazuje ciąg małych liter, obniża się do 137
źródło
<?
na początku kodu, aby był poprawny. Przepraszam ...JavaScript,
122115Definiuje funkcję, która przyjmuje ciąg jako jedyny argument (drugi argument jest tani
var
) i zwraca pustą tablicę lub tablicę 5-elementową.Zmniejsza się do 108, jeśli wezmę dane wejściowe na jedną zmienną char (
s
) i zostawię wynik w innej (b
):Edycja: Zamieniono mapę dla pętli.
źródło
b=(z=[].map.call("llama",a=>b=s.toLowerCase().indexOf(a,++b))).indexOf(-1)<0?z:[]
Rebol, 97
Przykład użycia w konsoli Rebol:
Rebol używa indeksowania 1. Zwraca pustą listę,
[]
jeśli nie znaleziono sekwencji lamy (wielkość liter nie ma znaczenia).Nie golfowany:
źródło
APL, 47
Nie najkrótszy kod, ale dość zniekształcony w sposób APL.
Wyjaśnienie
'amall',⊂⍬⍞
Zrób tablicę 6 elementów: litery „amall” i podtablicę z 2 elementów, same podtablice: pusta tablica i wiersz znaków odczytywanych z wejścia.{...}/...
Zmniejsz (składając prawy) 6-elementową tablicę za pomocą dostarczonej funkcji.a s←⍵
Rozpakuj odpowiedni argument do tablicy indeksów i pozostałych podciągów (początkowo pusta tablica i pełny ciąg).~⍺∊s:⍬⍬
Jeśli podciąg nie zawiera następnej litery⍺
przerwij obliczenia i zwróć pustą tablicę.a,←n←s⍳⍺
W przeciwnym razie znajdź jego pozycję, nazwij ją n i dołącz do tablicy wskaźników.a(n↓s)
Utwórz i zwróć tablicę 2 elementów: rozszerzoną tablicę indeksów i pozostałe podłańcuchy.+\↑⊃...
Rozpakuj wynik składania, weź pierwszy element (tablicę indeksów) i zeskanuj go z dodatkiem, aby przekształcić przesunięcia względne w absolutne.Przykłady
źródło
Julia, 76
Kolejny przykład wyrażenia regularnego z użyciem języka Julia.
źródło