Załóżmy, że mamy ciąg znaków i chcemy znaleźć maksymalną powtarzalną sekwencję każdej litery.
Na przykład biorąc pod uwagę przykładowe dane wejściowe:
"acbaabbbaaaaacc"
Dane wyjściowe dla próbki wejściowej mogą być:
a=5
c=2
b=3
Zasady:
- Twój kod może być funkcją lub programem - do wyboru
- Dane wejściowe mogą być wprowadzane przez stdin, plik lub parametr funkcji
- Dane wyjściowe powinny zawierać tylko znaki pojawiające się na wejściu
- Maksymalna długość wejściowa to 1024
- Kolejność wyjściowa nie ma znaczenia, ale musi być wydrukowana w postaci [char] = [maksymalna powtarzana sekwencja] [separator]
- Ciąg może zawierać dowolny znak
Zawody kończą się w czwartek 3 o 23:59 UTC.
l:S_&{'=L{2$+_S\#)}g,(N}/
w systemach produkcyjnych! I przeklnę twoje imię.Odpowiedzi:
Kod maszynowy 8086,
8280Zawartość
x.com
pliku:Obsługuje tylko powtórzenia do 99 znaków.
Kod źródłowy (służył jako dane wejściowe dla
debug.com
asemblera), z komentarzami!Oto kilka technik golfowych, które według mnie były zabawne:
3d00
, gdzie3d
jest kod ascii=
. W ten sposób adres wpisu tablicy dla znakux
to3d78
. Zinterpretowany jako ciąg 2 znaków, jestx=
.104
; zastępuje niepotrzebny już kod inicjujący. Sekwencja końca linii0D 0A 24
jest wykonywana jako nieszkodliwy kod.aam
instrukcja nie zapewnia gry w golfa, ale mogłaby ...11b
, który naC3
szczęście zawiera potrzebny kod maszynowy .źródło
CJam,
272625 bajtówWypróbuj online.
Przykład
Jak to działa
źródło
J - 52 bajty
Cóż, znowu proste podejście.
Wyjaśnienie:
Przykład:
Jeśli dane wyjściowe w dowolnej formie są dozwolone (jak w wielu innych odpowiedziach), mam również wersję 45-bajtową . Te pola reprezentują listę pól (tak, są wydrukowane w ten sposób, chociaż wysokość linii SE je łamie).
źródło
Ruby, 72
To pobiera dane wejściowe z argumentów wiersza poleceń i danych wyjściowych na standardowe wyjście.
źródło
chars
jest nieco krótszy niżsplit("")
.chars
podaje moduł wyliczający zamiast tablicy. Mam wersję 1.9.3, więc czy jest to coś 2.0?chars
zwraca tablicę.p
zamiast tego użyćputs
?GolfScript, 26 bajtów
Wypróbuj online.
Wyjaśnienie:
:s
zapisuje ciąg wejściowy w zmiennejs
do późniejszego użycia..&
wyodrębnia unikalne znaki z wejścia, które{ }%
następnie iteruje reszta kodu w pętli.61
wypycha liczbę 61 (kod ASCII dla znaku równości) na wierzchu bieżącego znaku na stosie, aby działał jako separator wyjściowy.{2$=}s%
bierze ciągs
i zamienia jego znaki na 1, jeśli są równe iteracji bieżącego znaku, lub 0, jeśli nie. (Pozostawia również bieżący znak na stosie do wydrukowania).1,/
bierze ten ciąg zer i jedynek i dzieli go na zera.$
sortuje powstałe podciągi,-1=
wyodrębnia ostatni podłańcuch (który, ponieważ wszystkie składają się z powtórzeń tego samego znaku, jest najdłuższy), i,
zwraca długość tego podłańcucha.n+
określa długość i dodaje do niej nowy wiersz.Ps. Jeśli znaki równości w danych wyjściowych są opcjonalne,
61
można je pominąć (i2$
zastąpić przez1$
), dla całkowitej długości 24 bajtów :źródło
61
pierwszy::s.&{61{2$=}s%1,/$-1=,n+}%
.CoffeeScript, 109 bajtów
Lubię wyrażenia regularne.
Oto skompilowany JavaScript, który możesz wypróbować w konsoli przeglądarki
Następnie możesz zadzwonić
dostać
źródło
aaaabaa
.Pyth , 24
2526(lub 29)Test można wykonać tutaj: link
Dane wyjściowe w formacie:
Wyjaśnienie:
Pyton:
Aby uzyskać prawidłowe wyjście (a = 5), użyj:
29 znaków
źródło
k=''
są zdefiniowane gdzie indziej.C,
126125119 bajtówBieganie:
źródło
getchar()>0
przez~getchar()
jak w tej odpowiedziless than zero
jest całkowicie OK, ale== EOF
bardziej przejrzysty.EOF
jest gwarantowane jako ujemne, a -1 jest używane, nawet jeślichar
jest podpisane; patrz tutajMathematica ,
747269Niezbyt dobre, ale łańcuchy nie są najlepszym obszarem Mathematiki . Jednak coraz lepiej. :-)
źródło
First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] &
Przynajmniej jest dość proste i czytelne.GroupBy
iGatherBy
?GroupBy
zwraca anAssociation
. Nie zbadałem jeszcze szczegółowo innych różnic. reference.wolfram.com/language/ref/GroupBy.html Możesz wypróbować to w chmurze z bezpłatnym kontem (tak właśnie gram z nimi).C # (LinQPad)
146
To jest odpowiedź tsavino, ale krótsza. Tutaj użyłem
Distinct()
zamiastGroupBy(c=>c)
. Pominięto także nawiasy klamrowe zforeach-loop
:136
Próbowałem użyć
lambda expression
zamiast normalnej składni zapytania, ale ponieważ potrzebowałemCast<Match>
pierwszej, kod stał się o 1 znak dłuższy ... W każdym razie, ponieważ można go wykonać w LinQPad, możesz użyćDump()
zamiastConsole.WriteLine()
:Dalsze badania kodu skłoniły mnie do myślenia o
Max()
. Ta funkcja akceptuje równieżFunc
. W ten sposób mogłem pominąćSelect
część podczas korzystania z epxresji lambda:Tak więc wynik końcowy:
128
Aktualizacja:
Dzięki wskazówce Dana Puzeya udało mi się uratować kolejne 6 znaków:
Długość:
122
źródło
Dump()
metodę, za każdym razem oszczędzam ci 10+ znaków :) Kręcone szelki były łatwe, a reszta to trochę łamanie mózgów: DIEnumerable
stylu wyświetlania LinqPada, możesz zapisać kolejne 8 znaków, z tym swoim ciałem:i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
Python 3 (70)
Nawet golfowy Python może być bardzo czytelny. Myślę, że ten kod jest w pełni idiomatyczny, z wyjątkiem zmiennych jednoliterowych i jednowierszowej pętli while.
Przykładowe przebiegi:
źródło
Ruby, 58
Pobiera dane wejściowe ze STDIN, wysyła je do STDOUT w formularzu
{"a"=>5, "c"=>2, "b"=>3}
źródło
C # w LINQPad - 159 bajtów
Cóż, przynajmniej pokonałem T-SQL; P Nie pobiję nikogo innego, ale pomyślałem, że i tak go podzielę.
Stosowanie:
Sugestie są zawsze mile widziane!
źródło
PowerShell
807772Musisz uruchomić go na konsoli ...
źródło
$x
jest zbyteczny. Nie używasz go o trzy bajty krócej. Równieżsort -u
wystarcza. Rzadko zachodzi potrzeba przeliterowania pełnych nazw parametrów. Nie powiedzie się to jednak w przypadku niektórych znaków z powodu nieokreślonego użycia wyrażenia regularnego. W zależności od tego, jak należy rozumieć „Ciąg znaków może zawierać dowolny znak”, może to stanowić problem.[char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}
, wygląda na to, że drugi $ args jest pusty ... - darkajax 17 minut temu$args
nie ma już jednego skryptu).Perl - 65
7176znakówMój pierwszy golf golfowy!
Dla każdej odpowiedzi skopiuj na golf.pl i uruchom jako:
Moje najkrótsze rozwiązanie drukuje każdą postać tyle razy, ile się pojawia, ponieważ nie jest to zabronione przez reguły.
Moje następne najkrótsze rozwiązanie (85
90znaków) drukuje każdy znak tylko raz:źródło
F # - 106
W FSI dzwonienie
daje
Aby jednak wydrukować go bez dodatkowych informacji, nazwij go tak:
co daje
źródło
JavaScript, 116 bajtów
Przykładowe dane wyjściowe:
źródło
T-SQL (2012)
189171Edycja: usunięto,
ORDER BY
ponieważ reguły dopuszczają dowolną kolejność wyjściową.Pobiera dane wejściowe ze zmiennej CHAR
@a
i używa rekurencyjnej CTE do utworzenia wiersza dla każdego znaku w ciągu i wykrywa kolejne wystąpienia.Potem jest to proste
SELECT
iGROUP BY
uwzględnia kolejność wydruków.Wypróbuj to na SQL Fiddle.
Przypisywanie zmiennej:
Przykładowe dane wyjściowe:
źródło
str
funkcję, zamiastltrim
. Możesz także nazwać swoją zmienną,@
aby zapisać znak. Pozwala to stracići
zmienną w rcte. Myślę, że możesz w ten sposób ogolić kilka znaków. Możliwe jest również przepisanie zapytania za pomocą funkcji okienkowania, takiej jak suma nad wierszami poprzedzającymi lub opóźnieniami. Nie do końca ukształtowałem, jak się wam teraz wydaje.str
zawsze wypisuje 10 znaków, ale to gra w golfa: PHaskell - 113
120bajtyTestowane z
źródło
.
(komponuj), aby uniknąć tworzenia lambda, w którym parametr pojawia się dopiero po zakończeniu łańcucha$
połączonych funkcji. Aby to zrobić, wystarczy zmienić wszystkie$
s do.
s (Przykład:(\i->reverse$sort$group i)
zamienia sięreverse.sort.group
.JavaScript [83 bajty]
Uruchom ten kod w konsoli przeglądarki.
W przypadku wprowadzania „
acbaabbbaaaaacc
” konsola powinna wyświetlać „Object {a: 5, b: 3, c: 2}
”.źródło
JavaScript - 91
EDYCJA: Moje pierwsze rozwiązanie jest zgodne z regułami, ale drukuje kilka razy pojedyncze wystąpienia znaku, takie jak
abab
=>,a=1,b=1,a=1,b=1
więc wyszedłem z tym ( 101 znaków), dla tych, którzy nie są zadowoleni z mojego pierwszego:źródło
Julia, 85
źródło
Python3 -
111,126,115114111 bajtówKod wykonywalny, który będzie czytał 1 linię (używaj tylko małych liter az)
Edycja: wykluczono niepotrzebne dane wyjściowe na żądanie @Therare
Wynik wygląda ładnie
źródło
for
lubif
.l=2
ao=1
dla „helloworld”JavaScript -
141137125Nie lubię wyrażeń regularnych :)
Biegać
wyjścia
źródło
JavaScript,
10910410098 bajtówPrzykładowe użycie:
wyjścia:
źródło
PHP,
10410296stosowanie
wydrukowano
źródło
Java 247
źródło
import java.util.*;
działa w Javie?acbaabbbaaaaacc
wyjściaa=8; b=4; c=3
zamiasta=5; b=3; c=2
.C 169
Iteruje każdy znak do wydruku w tabeli ASCII i zlicza maksimum z ciągu wejściowego.
źródło
JavaScript 116
źródło
Groovy - 80 znaków
Na podstawie tej inteligentnej odpowiedzi przez XNOR :
Wydajność:
Nie golfowany:
źródło