Policz kolejne znaki


24

Biorąc pod uwagę ciąg znaków zawierający tylko litery, wypisz długość najdłuższego ciągu kolejnych liter alfabetu, które zawiera słowo, w przypadku gdy kolejność nie ma znaczenia. Przykładowy algorytm może sortować słowo, usuwać duplikaty, a następnie wyświetlać długość najdłuższego przebiegu.

Przypadki testowe

watch -> 1
stars -> 3
antidisestablishmentarianism -> 3
backdoor -> 4
a -> 1
tutorials -> 4

Na przykład antidisestablishmentarianismzawiera literyabdehilmnstr . Najdłuższe przebiegi to lmni rstoba o długości 3.

Notatki

Jako dane wejściowe możesz wziąć wszystkie małe, wszystkie wielkie lub małe litery, ale wielkość liter nie może zakodować informacji o tym słowie (tzn. Nie możesz wpisać nwielkich liter, gdyn jest długość najdłuższego ciągu).

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.


@ H.PWiz, myślę, że to literówka i tak powinno być rst- ujednolicaj, sortuj i uzyskaj najdłuższy z rzędu ciąg. Czy możemy przyjmować dane wejściowe jako tablicę znaków?
Kudłaty

@ Shaggy tak, zdecydowanie nie uwzględniłem go, ponieważ myślałem, że to domyślny
Stephen

Czy „a” sąsiaduje z „z” - czy „zebra” powinna otrzymać 2 lub 3?
Jonathan Allan,

(... sądząc po twoim przykładowym algorytmie, wydaje mi się, że „nie” i „2”)
Jonathan Allan

@JonathanAllan masz rację
Stephen

Odpowiedzi:


10

Galaretka ,  10 9 8 7  6 bajtów

OṬṣ0ZL

Wypróbuj online!

9 używał metody Sok :ṢQẆẇƇØaṪL

W jaki sposób?

OṬṣ0ZL - Link: list of (single-case) characters  e.g.  codegolf
O      - ordinal (vectorises)           [99,111,100,101,103,111,108,102]
 Ṭ     - untruth (1s at those indices)  [0,0,0,...,1,1,1,1,1,0,0,0,0,1,0,0,1]
       -                                 ^         ^       ^         ^     ^
       -                   i.e. indices: 1        99     103       108   111
   0   - literal zero
  ṣ    - split at                       [[],[],[],...,[1,1,1,1,1],[],[],[],[1],[],[1]]
    Z  - transpose                      [[1,1,1],[1],[1],[1],[1]]
     L - length                         5

8

R , 44 43 bajtów

Działa na szeregu małych liter. Edycja: zmieniono z testowania wartości True na pomnożenie przez T / F bajtu.

function(x,r=rle(letters%in%x))max(r$l*r$v)

Wypróbuj online!

Wykonuje kodowanie długości przebiegu dla liter, które są w dostarczonych znakach, a następnie zwraca maksymalną wartość dla prawd.


Pracowałem nad podobnym rozwiązaniem rle przy użyciu utf8ToInt, ale pobranie tablicy ciągów jest znacznie mądrzejsze. +1
JayCe

@JayCe Zacząłem w ten sam sposób, ale potem zdałem sobie sprawę, że litery% w% check zajęły się sortowaniem, unikalnymi i różnicowymi krokami za jednym zamachem
MickyT

7

APL (Dyalog Classic) , 10 9 bajtów

-1 bajt dzięki H.PWiz

≢⍉↑⊆⍨⎕a∊⍞

Wypróbuj online!

wprowadza ciąg

⎕a jest wielką literą alfabetu angielskiego

⎕a∊⍞ wektor boolowski o długości 26 - które litery występują w ciągu?

⊆⍨ tworzą wektory kolejnych 1s

≢⍉↑ wmieszaj w macierz, transponuj i zwróć jej wysokość - skutecznie znajdź długość najdłuższego wektora 1s


1
⌈/≢¨->≢⍉↑
H.PWiz

6

Perl 6 , 41 bajtów

{max values bag .ords.sort.squish Z-0..*}

Sprawdź to

Rozszerzony:

{  # bare block lambda with implicit param $_

  max       # find the max
    values  # get the values from the following Bag (repeat counts)
      bag   # find the repeats

          .ords.sort.squish # get the unique ordinals (method call on $_)
        Z-                  # zip subtract with
          0 .. *            # Range starting with 0
}

Biorąc pod uwagę 'stars', .ords.sort.squish Z-0..*wróci(97,113,113,113)



6

JavaScript (Node.js) , 51 bajtów

Wielkość ciągu wejściowego nie ma znaczenia.

s=>(g=_=>s&&1+g(s&=s*2))(Buffer(s).map(c=>s|=1<<c))

Wypróbuj online!

W jaki sposób?

Najpierw konwertujemy ciąg wejściowy na maskę bitów napotkanych liter za pomocą:

Buffer(s).map(c => s |= 1 << c)

Przesunięcie bitowe jest przetwarzane za pomocą niejawnego modułu 32.

Przykład:

"feedback" --> 100001111110
               kjihgfedcba-

Następnie „zmniejszamy” przebiegi kolejnych 1 w masce bitowej, wielokrotnie ORAZ ustawiając ją za pomocą przesuniętej w lewo kopii samej siebie, aż wszystkie bity zostaną usunięte:

0100001111110 AND 1000011111100 --> 0000001111100
0000001111100 AND 0000011111000 --> 0000001111000
0000001111000 AND 0000011110000 --> 0000001110000
0000001110000 AND 0000011100000 --> 0000001100000
0000001100000 AND 0000011000000 --> 0000001000000
0000001000000 AND 0000010000000 --> 0000000000000

Liczba kolejnych liter w kolejności alfabetycznej jest liczbą iteracji powyższego procesu. Stąd funkcja rekurencyjna:

g = _ => s && 1 + g(s &= s * 2)

5

Pyth , 9 bajtów

le}#G.:S{

Przyjmuje się, że wejście jest ciągiem małych liter. Wypróbuj on-line tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

le}#G.:S{Q   Q=eval(input()), G=lowercase alphabet. Trailing Q inferred.

        {Q   Deduplicate input string
       S     Sort it
     .:      Take all substrings (these are generated in length order)
  }#G        Filter out those that aren't found in the alphabet
le           Find the length of the last remaining element

Świetna metoda wykorzystująca fakt, że podciągi są uporządkowane według długości!
Jonathan Allan,

Będzie znacznie mniej wydajny, ale możesz go użyć yzamiast .:.
FryAmTheEggman

5

MATL , 10 bajtów

2Y2imY'*X>

Dane wejściowe są pisane małymi literami.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wykorzystuje to połączenie podejść @ Sundar (stary) i @ ngn .

Wyjaśnienie

Rozważ dane wejściowe 'tutorial'jako przykład.

2Y2   % Push predefind literal 'abcdefghijklmnopqrstuvwxyz'
      % STACK: 'abcdefghijklmnopqrstuvwxyz'
i     % Push input
      % STACK: 'abcdefghijklmnopqrstuvwxyz', 'tutorials'
m     % Ismember: true for letters present in the input
      % STACK: [1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0]
Y'    % Run-length encoding
      % STACK: [1 0 1 0 1 0 1 0 1 0], [1 7 1 2 1 2 1 2 4 5]
*     % Multiply, element-wise
      % STACK: [1 0 1 0 1 0 1 0 4 0]
X>    % Maximum. Implicitly display
      % STACK: 4


5

05AB1E , 6 bajtów

Œ...éæ

êæAÃθg

Wypróbuj online!

Również 6 bajtów

Zaoszczędzono 2 bajty, ponownie dzięki Adnanowi : użycie ASåzamiast tego êÇ¥Θ, eliminując w ten sposób potrzebę zwiększania maksimum na końcu. Zobacz historię zmian, aby porównać zachowanie obu metod.

ASåγOà

Wypróbuj online!

Jak to działa

Lubię takie wyzwania, które prowadzą do różnych podejść.

êæAÃθg | Full program.
ê      | Push a sorted and without duplicates version of the input.
 æ     | Powerser.
  AÃ   | Keep those that also occur in the lowercase alphabet.
    θg | Take the length of the last one. θ and ` can be used interchangeably.
-------+-------------------------------------------------------------------------------
ASåγOà | Full program.
A      | Push the lowercase alphabet.
 S     | Listify it (i.e. convert it to a sequence of characters).
  å    | Replace each char in the alphabet by 1 if its in the input, else by 0.
   γ   | Split into chunks of equal adjacent elements.
    O  | Sum each part.
     à | Extract the maximum of this list. Again, à and Z can be used interchangeably.

W pierwszym programie można grać w golfa, êæAÃ`gaw drugim - w golfa ASåγOZ.
Adnan,

@Adnan Dzięki, zaktualizowano! Lubię ASåpodstęp.
Pan Xcoder,

4

TSQL (Microsoft SQL Server), 206 bajtów

WITH C AS (SELECT 1p,SUBSTRING(@,1,1)c UNION ALL SELECT p+1,SUBSTRING(@,p+1,1)FROM C WHERE p<LEN(@)),R AS(SELECT c d,1r FROM C UNION ALL SELECT c,r+1FROM R JOIN c ON ASCII(d)+1=ASCII(c))SELECT MAX(r)FROM R

Do wprowadzenia użyj następującej DECLAREinstrukcji przed kodem:

DECLARE @ varchar(200) = 'propinquities';

Oczekuje się, że dane wejściowe są identyczne (górna lub dolna nie ma znaczenia, ale mieszane wielkości nie będą działać).

Nie golfowany:

DECLARE @data varchar(200) = 'propinquities'

;WITH CTE AS (
    SELECT
        1 as CharacterPosition,
        SUBSTRING(@data,1,1) as Character
    UNION ALL
    SELECT
        CharacterPosition + 1,
        SUBSTRING(@data,CharacterPosition + 1,1)
    FROM
        CTE
    WHERE CharacterPosition < LEN(@data)
), Runs AS
(
    SELECT Character, 1 rc
    FROM CTE
    UNION ALL
    SELECT b.Character, rc + 1
    FROM Runs r
    JOIN CTE b ON ASCII(r.Character) + 1 = ASCII(b.Character)
)
SELECT max(rc)
from runs

Wyjaśnienie:

Dzieli ciąg na wiersz dla każdego znaku (dostosowany z /programming//a/27623321/1474939 ) wCTE cte.

Następnie znajduje ciągi kolejnych liter, konwertując na kod ASCII w Runscte.

Na koniec wybiera największy przebieg i raportuje z powrotem w instrukcji select.


Dobra odpowiedź, bardzo miłe użycie CTE. Nie jestem pewien, czy to pomogłoby lub zraniło liczbę bajtów, ale „zatwierdzona” metoda uzyskiwania danych wejściowych w języku T-SQL odbywa się za pomocą wstępnie utworzonej tabeli .
BradC

@BradC Jeśli mogę wziąć tabelę z każdym wierszem jako jeden znak (coś w rodzaju tablicy char zamiast łańcucha), pomogłoby to usunąć jedno CTE. Jeśli nadal musi to być jeden wiersz, prawdopodobnie jest tak samo, jak przyjmowanie go jako zmiennej wejściowej. Dzięki za pomysł!
Brian J

4

C (gcc) , 58 56 bajtów

Zaoszczędź 2 bajty dzięki @gastropner

Wykorzystuje takie samo podejście jak mój node.js odpowiedź . Wielkość liter wejściowych nie ma znaczenia.

m,i;f(char*s){for(i=0;*s?m|=1<<*s++:(i++,m&=m*2););s=i;}

Wypróbuj online!

Skomentował

m,                   // m = bitmask of encountered letters
i;                   // i = counter of max. consecutive letters
f(char *s) {         // f = function taking the input string s
  for(               // main loop:
    i = 0;           //   start with i = 0 and assume m = 0 on first call
                     //   (it is forced back to 0 when the program terminates)
    *s ?             //   if we haven't reached the end of the string:
      m |= 1 << *s++ //     update m by setting the appropriate bit for this character
                     //     (with implicit modulo 32) and advance the string pointer
    : (              //   else:
        i++,         //     increment i
        m &= m * 2   //     'reduce' runs of consecutive 1's in m by AND'ing it with a
      );             //     left-shifted copy of itself (e.g. 11101 & 111010 -> 11000;
                     //     11000 & 110000 -> 10000); we stop when m = 0
  );                 // end of for()
  s = i; }           // return i

Czy jest to konkretna implementacja, która się 1<<*sotacza, czy jest to standardowe zachowanie?
Jonathan Frech,

@JathanathanFrech Myślę, że to oficjalnie niezdefiniowane zachowanie. Musi więc być specyficzny dla implementacji.
Arnauld,

Co ciekawe, wydaje się, że zawija się tylko wtedy, gdy jest obliczane w czasie wykonywania. W czasie kompilacji 1<<32powoduje 0wyświetlenie ostrzeżenia o rozmiarze typu danych.
Jonathan Frech,

W rzeczywistości wątpię, aby kompilator wyraźnie zastosował maskę 5-bitową. Możliwe, że odbywa się to na poziomie procesora.
Arnauld,

2
@ Arnauld jest (patrz uwaga: „[...] Argument licznika może być wartością natychmiastową lub rejestrem CL. Liczba jest maskowana do 5 bitów, co ogranicza zakres zliczania do 0 do 31.”)
ErikF

3

C (gcc) , 100 bajtów

c,o,u;n(t,e,r)char*r,*e,*t;{for(u=0,e=t;c=*t++;u=u<o?o:u)for(o=0,r=e;*r;*r++-c||(c++,r=e,++o));o=u;}

Wypróbuj online!

Wyjaśnienie

c,o,u;n(t,e,r)    // setup, function declaration
char*r,*e,*t;{    // K&R style
 for(u=0,e=t;     // initialize global maximum u to 0, write string start to e
 c=*t++;          // look at every character in the string
 u=u  <o?o:  u)   // funny face
  for(o=0,r=e;*r; // initialize local maximum o to 0, look at entire string again
  *r++-c||(c++,   // equal character found, search for next one
   r=e,++o));     // reset local pointer, increment local maximum
o=u;}             // return maximum character streak

Wypróbuj online!


+1 dla „c, o, u; n (t, e, r)” :)

3

MATL , 12 10 bajtów

91:wX-dX>q

Wypróbuj online!

Wyjaśnienie:

91:- Utwórz listę cyfr od 1 do 91. 91 to znak „[”, który występuje po „Z”. Skutecznie tworzy to listę wszystkich znaków od „\ x1” do „[”. (Chcemy głównie tych z zakresu [„A'-1:„ Z ”+ 1]), ale reszta nie boli i wymaga mniejszej liczby bajtów.)

w - Implikowane dane wejściowe, wprowadź dane wejściowe na szczyt stosu (załóż „ĆWICZENIA”)

X- - Ustaw różnicę. Pozostawia to tylko znaki, których nie znaleziono w ciągu wejściowym, w ich oryginalnej kolejności („stabilna”). Stos:' !"#$%&'()*+,-./0123456789:;<=>?@BCDEFGHJKMNPQVWXYZ['

d - Różnica między kolejnymi elementami na tej liście. Stos:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 2 1 2 1 5 1 1 1 1 1]

X> - Uzyskaj maksimum tych różnic, tj. Maksymalną liczbę kolejnych alfabetów brakujących w ustawionej różnicy.

q - Zmniejszenie, aby uzyskać rzeczywistą liczbę znaków


Starsze:

12 bajtów

Sud1=Y'*X>sQ

Wypróbuj online!


Tak wiele podejść :-)
Luis Mendo,

3

K (ngn / k) , 17 15 bajtów

#1_{x^x^x+1}\-:

Wypróbuj online!

- czy istnieje tylko konwersja znaków na liczby (nie ma znaczenia, czy są one ujemne)

{ }\ stosuje funkcję aż do konwergencji, zachowując wyniki pośrednie

x+1 dodaj 1 do każdego numeru w x

^ „bez” - lista po lewej bez elementów, które występują na liście po prawej stronie

x^x^x+1oznacza xprzecięty zx+1

1_ upuść pierwszy element

# liczyć


#1_{x^x^x+1}\-?
Adám

@ Adám tak, pewnego dnia powinienem sprawić, by pociągi działały ...
ngn

wyobrażając to sobie jako przecięcie ze wzrostem, dopóki konwergencja nie będzie całkiem przyjemna
Jonah

pociągi pracować
NGN

2

Retina 0.8.2 , 54 bajty

O`.
D`.
.
$&$&¶
T`l`_l`¶.
(.)¶\1
$1
.(.+)
$.1
O#^`
1G`

Wypróbuj online!Link zawiera przypadki testowe. Wyjaśnienie:

O`.

Sortuj litery w kolejności.

D`.

Deduplikuj litery.

.
$&$&¶

Duplikuj każdą literę w osobnych wierszach.

T`l`_l`¶.

Zmniejsz pierwszą z każdej pary.

(.)¶\1
$1

Jeśli teraz pasuje do poprzedniej postaci, połącz je ponownie.

.(.+)
$.1

Policz długości wszystkich przebiegów.

O#^`

Posortuj je w odwrotnej kolejności numerycznej.

1G`

Weź pierwszą (największą).


2

J, 16 bajtów

-7 bajtów dzięki FrownyFrog

[:>./a.#;._1@e.]

Wypróbuj online!

wyjaśnienie

[: >./ a. #;._1@e. ]    
       a. (    )e. ]    is the ascii alphabet an element of the input:
                        this will transform the alphabet into a 1-0 array,
                        the ones representing the letters in the input
          #;._1@        split that 1-0 list up into pieces, using 0
                        as the delimiter, and transforming each chunk
                        into its length. now we have a list of ints
[: >./                  take the max 

Myślę, że możesz użyć ]zamiast ~.@/:~Alfabet jest już posortowany, więc nie musisz sortować danych wejściowych i przechowywać tylko unikatowe elementy. TIO - 18 bajtów
Galen Iwanow


@FrownyFrog i Galen, dziękuję wam obu! Z perspektywy czasu powinno być oczywiste, że najpierw nie potrzebowałem tego typu uniq / sort.
Jonasz

2

C (gcc) , 98 92 bajtów

Podziękowania dla Jonathana Frecha za sugestie.

Tylko wielkie litery.

f(char*s){int a[99]={0},i,j,k=j=i=0;for(;*s;a[*s++]++);for(;i<99;j=!!a[i++]*++j,k=j>k?j:k);}

Wypróbuj online!


Tak naprawdę nie potrzebujesz k;na końcu. Niejawne zwracanie gcc jest efektem ubocznym przypisywania zmiennych, który najwyraźniej jest wykonywany jako ostatni krok w twojej pętli for.
Jonathan Frech,


@JathanathanFrech Nie ufam niejawnym zwrotom gcc. Nie zawsze zdarzają się tak, jak się tego spodziewam, i często nie działają wcale dla wskaźników i liczb zmiennoprzecinkowych. Na szczęście poza kodem golfowym nigdy ich nie używam! :-)
ErikF,

2

Japt -h , 9 bajtów

Case insenstive, przyjmuje dane wejściowe jako ciąg znaków lub tablicę znaków.

;CôkU mÊn

Wypróbuj lub uruchom wiele testów (drugi wiersz służy jako zamiennik -hflagi, aby zamiast tego można było użyć flagi do przetwarzania wielu danych wejściowych)


Wyjaśnienie

              :Implicit input of string/array U
;C            :The lowercase alphabet
  ô           :Partition at characters returning truthy
   kU         :  Remove all characters in U from the current letter
              :  This will return a non-empty string (truthy) if the current letter ISN'T in U
     m        :Map
      Ê       :  Length
       n      :Sort
              :Implicitly output the last element in the array

@Downvoter, czy możesz podać powód swojej decyzji -1?
Kudłaty

2

Perl 5, 68 bajtów

$"=<>;map{$"=~/$_/i&&++$$_||last for$_..z;$.=$$_ if$$_>$.}a..z;say$.

Wypróbuj online .

Nie golfowany:

use feature 'say';

my $s = <>;
my $r;
for ('a' .. 'z') {
    my $c = 0;
    for ($_ .. 'z') {
        last if $s !~ /$_/i;
        $c++;
    }
    $r = $c if $c > $r;
}
say($r);

2

C (gcc) , 66 65 63 bajtów

Zakłada, że ​​dane wejściowe zawierają tylko małe litery. Najpierw zapętla się nad łańcuchem i ustawia bity w liczbie całkowitej, zgodnie z którymi widoczne są litery. Następnie zlicza najdłuższą serię 1 bitów w liczbie całkowitej.

Edycja: ajest globalna, więc przy pierwszym wywołaniu zostanie zainicjowana na 0. Druga pętla upewnia się, że jest resetowana do 0 przed powrotem. Dlatego możemy uniknąć resetowania go ręcznie.

a,l;f(char*s){for(l=0;*s;)a|=1<<*s++-97;for(;a;l++)a&=a*2;s=l;}

Wypróbuj online!


2

Perl 5, 62 + 2 ( -nFflaga) = 64 bajty

$c[ord lc$_]=1for@F;$y[y///c]++for"@c "=~/((1 )+)/g}{say@y/2|0

Wypróbuj online .

Perl 5, 68 bajtów

<>=~s/./$c[ord lc$&]=1/gre;$y[y///c]++for"@c "=~/((1 )+)/g;say@y/2|0

Wypróbuj online .


1
Niezłe podejście! W ogóle nie rozważyłem tej metody ... Możesz zaoszczędzić kilka bajtów, używając -pFi -MList::Util+(max)dostać się do 56: Wypróbuj online!
Dom Hastings

@DomHastings -MList::Util=maxdodaje 16 bajtów do wyniku.
Denis Ibaev

Jeśli dobrze rozumiem nową punktację, flagi wiersza poleceń nie są liczone jako bajty, ale jako osobno oceniany język, więc zamiast Perla, będzie to Perl z -MList::Util+(max) -pFlub podobny. codegolf.meta.stackexchange.com/a/14339/9365
Dom Hastings

2

SQLite 265

WITH w AS(SELECT'a'w),n AS(SELECT 1 n UNION ALL SELECT n+1 FROM n LIMIT(SELECT length(w)FROM w)),l AS(SELECT substr(w,n,1)l FROM n,w)SELECT max(v)FROM(SELECT min(n)v FROM(SELECT*FROM l,n EXCEPT SELECT l.l,unicode(l.l)-unicode(b.l)d FROM l,l b WHERE d>0)GROUP BY l);

Nie golfowany:

WITH w AS (SELECT 'antidisestablishmentarianism' w)
   , n AS (SELECT 1 n
           UNION ALL
           SELECT n+1 FROM n
           LIMIT (SELECT length(w) FROM w) )
   , l AS (SELECT DISTINCT substr(w,n,1) l FROM n,w ORDER BY l)
   , d AS (
           SELECT l,n FROM l,n
           EXCEPT
           SELECT a.l l, unicode(a.l) - unicode(b.l) d 
           FROM l a, l b 
           WHERE d > 0 
           )

SELECT max(v) FROM ( SELECT min(d.n) v FROM d GROUP BY d.l );

2

Brachylog , 14 13 12 bajtów

{⊇pS∧ẠsSl}ᶠ⌉

Wypróbuj online!

{        }ᶠ    % Find all values that satisfy this predicate
           ⌉   % And get their maximum
               % The predicate being:
 ⊇pS           % There exists a permutation of a subset of the input
               %  Call it S
    ∧          % And, 
      sS       % S is a substring of
     Ạ         %  the set of alphabets, Ạ, 
        l      % Then, the length of that substring is the return value of the 
               %  predicate

Na tyle powolny, że nie kończy się na wprowadzeniu „antydestablishmentarianism” na TIO. Relatywnie dużo szybszy dla 1 bajtu:

13 bajtów

{dosS∧ẠsSl}ᶠ⌉

Wypróbuj online!

Używać doszamiast ⊇pS jest deduplicated s orted substring wprowadzania, a nie tylko niektóre permutacji pewnego podzbioru.


1

Haskell , 87 bajtów

import Data.List
maximum.map length.filter(`isInfixOf`['a'..'z']).subsequences.nub.sort

Wypróbuj online!

Oczekuje małych liter

Wyjaśnienie:

maximum.map length.filter(`isInfixOf`['a'..'z']).subsequences.nub.sort
                                                                  sort {- sort the characters -}
                                                              nub      {- remove duplicates -}
                                                 subsequences          {- all subsequences -}
                   filter(`isInfixOf`['a'..'z'])                       {- all characters are adjacent -}
        map length                                                     {- length of filtered subsequences -}
maximum                                                                {- maxmimum length -}


1

Pyth - 11 bajtów

le@.:G).:S{

Dane wejściowe muszą być ujęte w cudzysłów. Jeśli nie wolno:

Pyth - 12 bajtów

le@.:G).:S{z

Wyjaśnienie:

l(
  e(
    @(
      .:(G),
      .:(
         S(
           {(Q)
         )
      )
    )
  )
)
length(
    last element(
        intersection(
            all positive length substrings(the alphabet as string),
            all positive length substrings(
                sorted(
                    uniquified(input)
                )
            )
        )
    )
)


1

Java 8, 77 bajtów

int i,j,m;
c->{for(i=j=0;(m=j<c.length?m|1<<c[j++]:m&m*2+0*++i)>0;);return i;}

Odpowiedź C z Port of Arnauld . Wypróbuj online tutaj .

Nie golfowany:

int i, j, m; // instance variables of the surrounding class - initialised to 0
c -> { // lambda - c is of type char[]; return type is int
    for(i = j = 0; // i is the length of the longest run, j is used to step through c - both start at 0
        (m = j < c.length // work with the bitmask of all the letters present in c: if we have not reached the end of c ...
             ? m | 1 << c[j++] // ... set the bit corresponding to the current character, advance one character ...
             : m & m * 2 + 0 * ++i) > 0 ;) ; // ... else reduce runs of consecutively set bits in m by AND-combining it with a left-shifted copy of itself until m hits 0
    return i; // return the result - by now m is back to 0
}

1

> <> , 63 bajty

Odczytuje małe litery ze standardowego wejścia, wypisuje liczbę na standardowe wyjście.

0l55*)?\
8/?(0:i<]r1~r[-*c
~/00
}</?)@:{:*+1/?(3l
  \~:03. ;n~/

Wypróbuj online!

0l55*)?\             Push 26 zeroes onto the stack

Record which characters are used
      i              Read a character from the input
 /?(0:               Check if it is -1, marking the end of the input
8             -*c    Subtract 96 from the character code, 
                         giving 1 for 'a', 2 for 'b' etc.
            r[       Pop that many values on to a new stack and reverse 
                         it, putting that character's value at the top of 
                         the stack
          1~         Write 1 to that value
        ]r           Return the stack back to it's normal state

Count the longest run of ones in the stack
  00                 Push values for currentRun = 0, and bestRun = 0
}                    Move bestRun to the bottom of the stack
            /?(3l    Check if there are only 2 values left on the stack
          +1         Increment currentRun
         *           Multiply currentRun by the next value in the stack, 
                         resetting it to 0 if the run is broken
  /?)@:{:            Check if currentRun > bestRun
  \~:                Overwrite bestRun if so
     03.             Jump back to the start of loop
         ;n~/        Once all values have been consumed, 
                         print bestRun and exit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.