Hitung Karakter Berturut-turut

24

Diberikan string yang hanya berisi huruf, menghasilkan panjang jangka terpanjang dari huruf alfabet berturut-turut berisi kata, di mana urutan tidak masalah. Contoh algoritma dapat mengurutkan kata, menghapus duplikat, dan kemudian menampilkan jangka waktu terpanjang.

Uji Kasus

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

Misalnya, antidisestablishmentarianismberisi surat-surat abdehilmnstr. Berjalan terpanjang adalah lmndan rst, keduanya panjang 3.

Catatan

Anda dapat mengambil semua huruf kecil, semua huruf besar, atau huruf besar sebagai input, tetapi kasing tidak dapat menyandikan informasi tentang kata tersebut (yaitu, Anda tidak dapat membuat nhuruf pertama menjadi kapital di mana npanjangnya jangka waktu terpanjang).

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Stephen
sumber
@ H.PWiz, saya kira itu salah ketik dan seharusnya rst- unikkan, urutkan dan dapatkan jangka panjang berurutan. Bisakah kita mengambil input sebagai array karakter?
Shaggy
@ Shaggy ya, tentu saja, saya tidak memasukkannya karena saya pikir itu default
Stephen
Apakah 'a' bersebelahan dengan 'z' - haruskah 'zebra' mendapat skor 2 atau 3?
Jonathan Allan
(... dinilai dari contoh algoritma Anda, saya kira "tidak" dan "2")
Jonathan Allan
@ Jonathan. Allan Anda benar
Stephen

Jawaban:

10

Jelly ,  10 9 8 7  6 byte

OṬṣ0ZL

Cobalah online!

9 menggunakan metode Sok :ṢQẆẇƇØaṪL

Bagaimana?

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
Jonathan Allan
sumber
8

R , 44 43 byte

Bekerja pada array karakter huruf kecil. Sunting: mengubahnya dari pengujian nilai True ke mengalikan dengan T / F untuk satu byte.

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

Cobalah online!

Melakukan pengkodean panjang run pada huruf-huruf yang ada dalam karakter yang disediakan kemudian mengembalikan nilai maksimal untuk true.

MickyT
sumber
Sedang mengerjakan solusi rle serupa menggunakan utf8ToInt tetapi mengambil array string jauh lebih pintar. +1
JayCe
@JayCe Memulai dengan cara yang sama, tetapi kemudian menyadari bahwa huruf% dalam% cek menangani hal semacam itu, unik dan berbeda dalam satu gerakan
MickyT
7

APL (Dyalog Classic) , 10 9 byte

-1 byte terima kasih kepada H.PWiz

≢⍉↑⊆⍨⎕a∊⍞

Cobalah online!

masukan sebuah string

⎕a adalah alfabet bahasa Inggris huruf besar

⎕a∊⍞ vektor boolean length-26 - huruf apa yang muncul dalam string?

⊆⍨ membentuk vektor berturut-turut 1s

≢⍉↑ campur menjadi matriks, transpos, dan kembalikan tingginya - secara efektif, temukan panjang vektor terpanjang 1s

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

Perl 6 , 41 byte

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

Menguji

Diperluas:

{  # 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
}

Diberikan 'stars', .ords.sort.squish Z-0..*akan kembali(97,113,113,113)

Brad Gilbert b2gills
sumber
6

JavaScript (Node.js) , 51 byte

Kasus string input tidak masalah.

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

Cobalah online!

Bagaimana?

Kami pertama-tama mengonversi string masukan menjadi bitmask surat yang ditemui dengan:

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

Pergeseran bitwise diproses dengan modulo implisit 32.

Contoh:

"feedback" --> 100001111110
               kjihgfedcba-

Kami kemudian 'mengurangi' berturut-turut 1 dalam bitmask dengan berulang-kali DAN dengan itu bergiliran kiri sendiri sampai semua bit dihapus:

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

Jumlah huruf berurutan dalam urutan abjad adalah jumlah iterasi dari proses di atas. Maka fungsi rekursif:

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

Pyth , 9 byte

le}#G.:S{

Input dianggap string huruf kecil. Cobalah online di sini , atau verifikasi semua uji sekaligus di sini .

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
Sok
sumber
Metode hebat menggunakan fakta bahwa substring dipesan panjangnya!
Jonathan Allan
Ini akan jauh kurang efisien, tetapi Anda dapat menggunakan ydi tempat .:.
FryAmTheEggman
5

MATL , 10 byte

2Y2imY'*X>

Input dalam huruf kecil.

Cobalah online! Atau verifikasi semua kasus uji .

Ini menggunakan campuran pendekatan @ Sundar (lama) dan @ ngn .

Penjelasan

Pertimbangkan input 'tutorial'sebagai contoh.

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
Luis Mendo
sumber
5

05AB1E , 6 byte

Œ...éæ

êæAÃθg

Cobalah online!

Juga 6 byte

Disimpan 2 byte, sekali lagi terima kasih kepada Adnan : gunakan ASåsebagai gantinya êÇ¥Θ, sehingga juga menghilangkan kebutuhan untuk meningkatkan maksimum di akhir. Lihat riwayat revisi untuk membandingkan perilaku dua metode.

ASåγOà

Cobalah online!

Bagaimana cara kerjanya?

Saya suka tantangan seperti ini yang mengarah ke berbagai pendekatan yang berbeda.

êæ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.
Tuan Xcoder
sumber
Program pertama dapat di-golf ke êæAÃ`gdan program kedua dapat di-golf ke ASåγOZ.
Adnan
@ Adnan Terima kasih, diperbarui! Saya suka ASåtriknya.
Tn. Xcoder
4

TSQL (Microsoft SQL Server), 206 byte

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

Untuk input, gunakan DECLAREpernyataan berikut sebelum kode:

DECLARE @ varchar(200) = 'propinquities';

Diharapkan bahwa input adalah semua kasus yang sama (atas atau bawah tidak masalah, tetapi case campuran tidak akan bekerja).

Tidak Disatukan:

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

Penjelasan:

Pisahkan string menjadi baris aa untuk setiap karakter (diadaptasi dari /programming//a/27623321/1474939 ) di CTEcte.

Kemudian, temukan run huruf berturut-turut dengan mengonversi kode ASCII di Runscte.

Terakhir, ia mengambil proses terbesar dan melaporkan kembali dalam pernyataan pilih.

Brian J
sumber
Jawaban bagus, penggunaan CTE yang sangat bagus. Tidak yakin apakah ini akan membantu atau mengurangi jumlah byte Anda, tetapi metode "yang disetujui" untuk mendapatkan input dalam T-SQL adalah melalui tabel yang telah dibuat sebelumnya .
BradC
@BradC Jika saya bisa mengambil tabel dengan setiap baris sebagai satu karakter (semacam array char bukan string), maka itu akan membantu menghapus satu CTE. Jika masih harus satu baris, ini mungkin hampir sama dengan menganggapnya sebagai variabel input. Terima kasih untuk idenya!
Brian J
4

C (gcc) , 58 56 byte

Disimpan 2 byte berkat @gastropner

Menggunakan pendekatan yang sama dengan jawaban Node.js saya . Kasus string input tidak masalah.

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

Cobalah online!

Berkomentar

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
Arnauld
sumber
Apakah implementasi spesifik yang 1<<*smembungkus atau apakah itu perilaku standar?
Jonathan Frech
@ JonathanFrech Saya pikir itu perilaku yang secara resmi tidak terdefinisi. Jadi itu harus spesifik implementasi.
Arnauld
Karena cukup menarik itu hanya muncul untuk membungkus ketika dihitung pada saat runtime. Pada waktu kompilasi 1<<32menghasilkan 0dan mengeluarkan peringatan ukuran tipe data.
Jonathan Frech
Sebenarnya, saya ragu bahwa kompiler akan secara eksplisit menerapkan topeng 5-bit. Kemungkinannya adalah ini dilakukan pada level CPU.
Arnauld
2
@Arnauld itu (lihat catatan: "[...] Operan hitung dapat berupa nilai langsung atau register CL. Hitungan disamarkan menjadi 5 bit, yang membatasi rentang hitungan ke 0 hingga 31.")
ErikF
3

C (gcc) , 100 byte

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

Cobalah online!

Penjelasan

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

Cobalah online!

Jonathan Frech
sumber
+1 untuk "c, o, u; n (t, e, r)" :)
3

MATL , 12 10 byte

91:wX-dX>q

Cobalah online!

Penjelasan:

91:- Buat daftar angka dari 1 hingga 91. 91 adalah karakter '[', yang muncul setelah 'Z'. Jadi ini secara efektif membuat daftar semua karakter dari '\ x1' hingga '['. (Kami terutama menginginkan mereka yang berada dalam kisaran ['A'-1:' Z '+ 1], tetapi memiliki sisanya tidak sakit, dan membutuhkan lebih sedikit bytecount.)

w - Input implisit, bawa input ke atas tumpukan (asumsikan 'TUTORIALS')

X- - Atur perbedaan. Ini hanya menyisakan karakter yang tidak ditemukan dalam string input, dalam urutan aslinya ('stabil'). Tumpukan:' !"#$%&'()*+,-./0123456789:;<=>?@BCDEFGHJKMNPQVWXYZ['

d - Perbedaan antara elemen yang berurutan dalam daftar itu. Tumpukan:[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> - Dapatkan maksimum dari perbedaan-perbedaan itu yaitu jumlah maksimum huruf berturut-turut hilang dari perbedaan yang ditetapkan.

q - Pengurangan untuk mendapatkan jumlah karakter yang sebenarnya


Lebih tua:

12 byte

Sud1=Y'*X>sQ

Cobalah online!

sundar - Pasang kembali Monica
sumber
Begitu banyak pendekatan :-)
Luis Mendo
3

K (ngn / k) , 17 15 byte

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

Cobalah online!

- apakah hanya ada untuk mengubah karakter menjadi angka (tidak masalah jika karakternya negatif)

{ }\ menerapkan fungsi sampai konvergensi, menjaga hasil antara

x+1 tambahkan 1 ke setiap nomor dalam x

^ "tanpa" - daftar di sebelah kiri tanpa elemen yang muncul dalam daftar di sebelah kanan

x^x^x+1berarti xberpotongan denganx+1

1_ drop elemen pertama

# menghitung

ngn
sumber
#1_{x^x^x+1}\-?
Adám
@ Adam ya, suatu hari aku harus membuat kereta bekerja ...
ngn
mengkonseptualisasikan ini sebagai persimpangan dengan kenaikan hingga konvergensi cukup baik
Jonah
train work
ngn
2

Retina 0.8.2 , 54 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

O`.

Urutkan surat ke dalam urutan.

D`.

Gandakan surat-surat itu.

.
$&$&¶

Gandakan setiap huruf pada baris terpisah.

T`l`_l`¶.

Kurangi yang pertama dari setiap pasangan.

(.)¶\1
$1

Jika ini cocok dengan karakter sebelumnya, gabungkan kembali.

.(.+)
$.1

Hitung panjang semua lintasan.

O#^`

Sortir dalam urutan angka terbalik.

1G`

Ambil yang pertama (terbesar).

Neil
sumber
2

J, 16 byte

-7 byte berkat FrownyFrog

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

Cobalah online!

penjelasan

[: >./ 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 
Jonah
sumber
Saya pikir Anda dapat menggunakannya ]sebagai pengganti ~.@/:~. Alfabet sudah diurutkan, jadi Anda tidak perlu mengurutkan input dan hanya menyimpan item unik. TIO - 18 byte
Galen Ivanov
1
16
FrownyFrog
@FrownyFrog dan Galen, Terima kasih keduanya! Kalau dipikir-pikir itu seharusnya sudah jelas aku tidak perlu yang uniq / urutkan terlebih dahulu.
Jonah
2

C (gcc) , 98 92 byte

Terima kasih kepada Jonathan Frech untuk sarannya.

Hanya huruf besar.

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

Cobalah online!

ErikF
sumber
Anda tidak benar-benar membutuhkannya k;di akhir. Pengembalian gcc implisit adalah efek samping dari penugasan variabel yang tampaknya dijalankan sebagai langkah terakhir dalam for loop Anda.
Jonathan Frech
Kemungkinan 95 byte .
Jonathan Frech
@ JonathanFrech Saya tidak percaya pengembalian implisit gcc. Mereka tidak selalu terjadi seperti yang saya harapkan, dan mereka sering tidak bekerja sama sekali untuk pointer dan floating-point. Untungnya, di luar kode golf saya tidak pernah menggunakannya! :-)
ErikF
2

Japt -h , 9 byte

Case insenstive, mengambil input sebagai string atau array karakter.

;CôkU mÊn

Cobalah atau jalankan beberapa tes (baris kedua berfungsi sebagai pengganti -hflag sehingga flag dapat digunakan untuk memproses beberapa input sebagai gantinya)


Penjelasan

              :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
Shaggy
sumber
@Downvoter, bisakah Anda memberikan alasan untuk Anda -1?
Shaggy
2

Perl 5, 68 byte

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

Cobalah online .

Tidak Disatukan:

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);
Denis Ibaev
sumber
2

C (gcc) , 66 65 63 byte

Asumsikan input hanya berisi huruf kecil. Pertama, loop atas string dan menetapkan bit dalam bilangan bulat sesuai dengan huruf yang terlihat. Selanjutnya, ia menghitung garis terpanjang 1 bit dalam integer.

Sunting: abersifat global, jadi akan diinisialisasi ke 0 pada panggilan pertama. Loop kedua memastikan itu diatur ulang ke 0 sebelum kembali. Karena itu, kita dapat menghindari pengaturan ulang secara manual.

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

Cobalah online!

gastropner
sumber
2

Perl 5, 62 + 2 ( -nFbendera) = 64 byte

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

Cobalah online .

Perl 5, 68 byte

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

Cobalah online .

Denis Ibaev
sumber
1
Pendekatan yang bagus! Saya tidak mempertimbangkan metode itu sama sekali ... Anda dapat menyimpan beberapa byte menggunakan -pFdan -MList::Util+(max)untuk mencapai 56: Cobalah online!
Dom Hastings
@DomHastings -MList::Util=maxmenambahkan 16 byte ke skor hasil.
Denis Ibaev
Jika saya memahami skor baru dengan benar, flag baris perintah tidak dihitung sebagai byte, tetapi sebagai bahasa yang dinilai secara terpisah, jadi bukan hanya Perl, itu akan Perl -MList::Util+(max) -pF, atau serupa. 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);

Tidak Disatukan:

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 );
martin
sumber
2

Brachylog , 14 13 12 byte

{⊇pS∧ẠsSl}ᶠ⌉

Cobalah 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

Cukup lambat sehingga tidak selesai untuk input "antidisestablishmentarianism" pada TIO. Satu relatif lebih cepat untuk +1 byte:

13 byte

{dosS∧ẠsSl}ᶠ⌉

Cobalah online!

Gunakan dosbukannya ⊇p: S adalah deduplicated s orted substring dari input, bukan hanya beberapa permutasi dari beberapa subset.

sundar - Pasang kembali Monica
sumber
1

Haskell , 87 byte

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

Cobalah online!

Diharapkan karakter huruf kecil

Penjelasan:

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 -}
Mego
sumber
1

Python 2 , 95 byte

lambda s:max(reduce(lambda(p,v),c:(c,v+[v[-1]*(c==p+1)+1]),map(ord,sorted(set(s))),(0,[0]))[1])

Cobalah online!

Chas Brown
sumber
1

Pyth - 11 byte

le@.:G).:S{

Masukan harus dibungkus dengan tanda kutip. Jika tidak diizinkan:

Pyth - 12 byte

le@.:G).:S{z

Penjelasan:

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

Kotlin , 97 byte

{w:String->{var s=0
var m=0
for(c in 'a'..'z')if(c in w)s++
else{if(s>m)m=s
s=0}
if(s>m)m=s
m}()}

Cobalah online!

JohnWells
sumber
1

Java 8, 77 byte

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

Pelabuhan Arnauld 's C jawabannya . Cobalah online di sini .

Tidak Disatukan:

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
}
Ketidakseimbangan
sumber
1

> <> , 63 byte

Membaca karakter huruf kecil dari stdin, menampilkan angka ke stdout.

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

Cobalah 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
Sasha
sumber