Zwarte słowa

22

Wprowadzenie

Według postu Rand Al'Thor w Puzzling SE, zwarte słowo to każde słowo, które zawiera trzy kolejne litery alfabetu (w dowolnej kolejności).

Słowa takie jak edukacja , mgła i kabaret są uważane za ściśle powiązane, podczas gdy słowa takie jak nauka , klaxon i występ nie są ściśle powiązane.

Wyzwanie

Wyzwanie polega na kodowaniu w golfa programu, który może przyjmować pojedyncze słowo jako dane wejściowe (zakładane małe litery, dla wszystkich celów i celów) i zwracać dane wyjściowe, które (jeśli są dostępne) zawierają listę wszystkich kolejnych zestawów liter (także małych), jeśli jest słowem zwartym i pustym, jeśli nie jest słowem ścisłym.

Przykłady

Input: education
Output: cde

Input: foghorn
Output: fgh

Input: cabaret
Output: abc

Input: hijacking
Output: ghi, hij, ijk

Input: pneumonia
Output: mno, nop

Input: klaxon
Output: <<no output>>

Input: perform
Output: <<no output>>

Input: learning
Output: <<no output>>

Zasady

  1. Podczas gdy dane wejściowe należy przyjmować jako pojedyncze małe litery, a dane wyjściowe muszą być pisane małymi literami, charakter danych wyjściowych będzie się różnić w zależności od wybranego języka kodowania. Wybierz formę wyjściową, która najlepiej pasuje do charakteru wyzwania, czy będzie to STDOUT, plik wyjściowy, tablica itp.
  2. Ponieważ jest to gra w golfa kodowego, będzie to przypadek najmniejszej liczby bajtów, która będzie wyraźnym zwycięzcą.
  3. Żadnych głupich luk .
  4. Nie przyjmuję odpowiedzi, które mają kolejne litery w kolejności niealfabetycznej ... Tak więc , na przykład, cabnie będę uważany za odpowiedni wynik cabaret.
  5. Uwaga specjalna, podczas gdy „trojaczki” niekoniecznie muszą być w kolejności alfabetycznej, ale znaki w trojaczkach muszą być… więc w przypadku słowa „wydajność”, na przykład, wynik mno,nopzostanie zaakceptowany, jak będzie nop,mno. W przypadku słowa „porwania”, istnieje sześć sposobów, że trypletach ghi, hiji ijkmoże być umieszczony na liście, a wszystkie sześć permutacje są dopuszczalne jako wyjście.

Poza tym, na swoje oceny, ustaw się, golf!

WallyWest
źródło
Czy wynik może być tablicą znaków 2D z każdym zestawem trzech kolejnych liter w kolumnie ?
Luis Mendo,
@LuisMendo Czy możesz podać przykład, żebym mógł go sobie wyobrazić?
WallyWest,
Wypróbuj mój kod bez finału !I innym słowem, ponieważ obecny daje ten sam wynik :-)
Luis Mendo
@LuisMendo to główna kolumna MATL czy coś takiego?
Maltysen
1
Czy wyjście w formacie tablicy krotek jest w porządku, tzn. Wyjście pneumoniamoże być [('m','n','o'),('n','o','p')])?
R. Kap

Odpowiedzi:

8

05AB1E , 7 6 5 bajtów

Kod:

3ãAŒÃ

Wyjaśnienie:

3ã      # Cartesian product × 3 with input
  AŒ    # All substrings of the alphabet
    Ã   # Setwise intersection

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Adnan
źródło
To po prostu genialny ... Będę musiał spróbować stworzyć wyzwanie, które popycha ten język do granic możliwości ...;)
WallyWest
10

Python 3.5, 68 bajtów

w=input()
a=0
while 1:s='%c'*3%(a,a+1,a+2);a+=1;{*s}-{*w}or print(s)

Wyświetla ciągi wyjściowe i kończy się błędem, gdy wartość znaku staje się zbyt duża.

Generuje wszystkie ciągi trzech kolejnych i drukuje te, które są podzbiorem słowa wejściowego.

xnor
źródło
8

Pyth - 11 10 8 7 bajtów

Metoda super brutalnej siły.

@^z3.:G

Pakiet testowy .

@            Setwise intersection, finds common strings between the two lists
 ^           Cartesian product
  z          Input
  3          Of length 3
 .:          Substrings. Without second input finds all substrings which is ok
  G          Lowercase aphabet
Maltysen
źródło
7

Galaretka , 7 bajtów

ØaẆfṗ3$

To jest link monadyczny. Wypróbuj online!

Jak to działa

ØaẆfṗ3$  Monadic link. Argument: s (string)

Øa       Yield the lowercase alphabet, i.e., a := "abcdefghijklmnopqrstuvwxyz".
  Ẇ      Window; yields all substrings of a.
      $  Combine the two links to the left into a monadic chain.
    ṗ3   Take the third Cartesian power of s, yielding all combinations of three
         characters that can be formed from the letters in s.
   f     Filter; keep only those substrings of a that appear in the Cart. power.
Dennis
źródło
7

JavaScript (ES6), 95 90 bajtów

f=
s=>[...s].map(c=>a[parseInt(c,36)]=c,a=[])&&a.map((c,i)=>c+a[i+1]+a[i+2]).filter(c=>!c[3])
;
<input oninput="o.textContent=f(this.value).join`, `"><div id=o>

Brakujące wartości łączą się jako undefined, więc wynikowy ciąg zawiera więcej niż 3 znaki. Pożyczyłem ten !c[3]trik z @ETHproductions zaoszczędzić 5 bajtów.

Neil
źródło
2
Przypadkowo dość undefined
zwięzłe
Dlaczego parseInt(c,36)zamiast c.charCodeAt()?
Titus
@Titus Myślę, że to nie robi różnicy, jestem przyzwyczajony do używania parseIntw golfie kodu.
Neil
4

Python 3.5, 78 bajtów

s={*input()}
for c in s:o=ord(c);a=chr(o-2);b=chr(o-1);s>{a,b}and print(a+b+c)
Dennis
źródło
4

PHP, 100 bajtów

for($a="abc",$i=98;$i<123;$a=substr($a,1).chr(++$i))if(strstr(count_chars($argv[1],3),$a))echo"$a,";

przyjmuje dane wejściowe jako argument wiersza poleceń; drukuje przecinek końcowy. biegać z -r.

Tytus
źródło
1
for($s=join(range(Z,z));$a=substr($s,++$i,3);)jest krótszym sposobem tworzenia $ a. Wprawdzie sprawdza kilka znaków interpunkcyjnych, a także niektóre serie 2 znaków, ale ponieważ wprowadzane są tylko małe litery i wymaga znalezienia 3 znaków, które są w porządku.
user59178
for($a="ab ", $ i = 98; $ i <123;)! strstr (count_chars ($ argv [1], 3), $ a = substr ($ a, 1) .chr (++ $ i)) ?: print "$ a"; `zapisuje 2 bajty. Bardzo fajny sposób, próbowałem innych sposobów w PHP, ale nie mogę dotrzeć do bajtów twojego kodu. Nie jestem pewien, czy potrzebujesz spacji po przecinku
Jörg Hülsermann
4

C, 175 174 bajtów

main(_,a,m,n)char**a;{char*s=a[1],*t=s;while(*++s)while(s>t&&(n=s[-1])>=*s){m=(*s^n)?*s:0;*s=n;*--s=m;!*t&&++t;}for(;t[1]&t[2];++t)*t==t[1]-1&&*t==t[2]-2&&printf("%.3s ",t);}

zębaty:

main(_,a,m,n)char**a;
{
  char*s=a[1],*t=s;
  while(*++s)
    while(s>t&&(n=s[-1])>=*s){
      m=(*s^n)?*s:0;
      *s=n;
      *--s=m;
      !*t&&++t;
    }
  for(;t[1]&t[2];++t)
    *t==t[1]-1&&*t==t[2]-2&&printf("%.3s ",t);
}

Podczas sortowania zastępuje zduplikowane wartości zerami, te zera są sortowane na początek słowa. Szukanie kolejnych wartości jest wtedy banalne.

Jste
źródło
1
Witamy na stronie!
DJMcMayhem
1
Tak, witamy w PPCG! Świetna robota na twoją odpowiedź, C nie jest jednym z najłatwiejszych do gry w golfa!
WallyWest,
3

MATL , 13 bajtów

2Y23YCtjmAZ)!

Wypróbuj online!

2Y2    % Push string of lowercase alphabet
3YC    % 2D char array with sliding blocks of size 3, each on a column
t      % Duplicate
j      % Take input
m      % Member function: true for elements of the 2D array that are in the input
A      % All: true for columns that consist of all true values
Z)     % Use as logical index into the columns of the 2D char array
!      % Transpose. Implicitly display
Luis Mendo
źródło
3

Haskell, 48 bajtów

f w=filter(all(`elem`w))[take 3[c..]|c<-['a'..]]

Generuje wszystkie trzykrotnie trzy kolejne znaki, pobiera te, które używają tylko liter na wejściu.


53 bajty:

f w=filter(all(`elem`w))[[pred$pred c..c]|c<-['c'..]]

Lista ['c'..]zawiera wszystkie znaki Unicode od początku 'c'. Zrozumienie listy [[pred$pred c..c]|c<-['c'..]]zamienia je odtąd we wszystkie ciągi 3 kolejnych znaków "abc". Cofamy się do tyłu [pred$pred c..c]zamiast do przodu z, [c..succ$succ c]aby uniknąć błędu przy przyjmowaniu następcy najwyższego znaku Unicode.

Te tróje są filtrowane dla tych, które używają tylko liter na wejściu.

xnor
źródło
3

Perl, 36 bajtów

Obejmuje +1 dla -n

Podaj dane na STDIN:

perl -nE 'join("",a..z)=~/[$_]{3}(?{say$&})^/' <<< "hijacking"

Tylko kod:

join("",a..z)=~/[$_]{3}(?{say$&})^/
Ton Hospel
źródło
3

T-SQL, 153 bajty

Musiałem zareagować na komentarz WallyWest, że minęło sporo czasu od ostatniej odpowiedzi TSQL. Odpowiedź była częściowo zainspirowana odpowiedzią Briana J.

Gra w golfa:

USE MASTER
DECLARE @ varchar(max)='hijacking'

;WITH C as(SELECT distinct ascii(substring(@,number,1))z FROM spt_values)SELECT CHAR(C.z)+CHAR(D.z)+CHAR(E.z)FROM C,C D,C E WHERE c.z+1=d.z and d.z=e.z-1

Skrzypce

Nie golfowany:

USE MASTER -- can be left out if the master database is already being used
DECLARE @ varchar(max)='hijacking'

;WITH C as
(
  SELECT distinct ascii(substring(@,number,1))z
  FROM spt_values
)
SELECT CHAR(C.z)+CHAR(D.z)+CHAR(E.z)
FROM C,C D,C E
WHERE c.z+1=d.z and d.z=e.z-1
t-clausen.dk
źródło
1
To sprytne! Nawet nie wiedziałem o tym stole. Dobrze, że nie ma słów dłuższych niż 2048 liter!
Brian J,
2

Haskell, 63 60 52 bajtów

f w=[x|x<-take 3<$>scanr(:)"_"['a'..],all(`elem`w)x]

Przykład użycia: f "hijacking"-> ["ghi","hij","ijk"].

scanr(:)"_"['a'..]buduje listę z ogonami listy wszystkich znaków Unicode zaczynających się od 'a'i pozwala kończyć na a '_', tj ["abcde...\1114111_", "bcde...\1114111_", "cde...\1114111_", ..., "\1114109\1114110\1114111_", "\1114110\1114111_", "\1114111_", "_"]. Następnie bierzemy do trzech znaków każdego łańcucha i wiążemy go x. Zachowaj wszystko xtam, gdzie każda jego litera znajduje się w parametrze wejściowym w.

Edycja: @xnor zapisał 3 7 bajtów. Dzięki!

nimi
źródło
Czy ktoś wie, czy mogę uchwycić pierwsze trzy elementy listy a:b:c:_za pomocą @ -pattern?
nimi
Nie wiem o @ -pattern, ale możesz usunąć 'z'górną granicę i pozwolić wypróbować wszystkie znaki.
xnor
Uchwycenie tych 3 pierwszych elementów jest naprawdę denerwujące. Najlepsze, co widzę, to po prostu użyć takei usunąć pusty ciąg:f w=[x|x<-init$take 3<$>scanr(:)""['a'..],all(`elem`w)x]
xnor
@xnor: nice. możemy zacząć od scanr„.” zamiast ""i pomiń init$.
nimi
2

T-SQL (SQL Server 2014), 217 bajtów

Grał w golfa

declare @ table(a char)declare @i int=1while @i<=len(@a)begin insert into @ values(SUBSTRING(@a,@i,1))set @i+=1 end select distinct t.a+u.a+v.a from @ t,@ u,@ v where ASCII(t.a)+1=ASCII(u.a)and ASCII(u.a)+1=ASCII(v.a)

Stosowanie

Najpierw zadeklaruj zmienną @a jako jakiś rodzaj znaku i tak przypisz dane wejściowe

declare @a varchar(max) = 'pneumoultramicroscopicsilicovolcanoconiosis'

Nie liczyłem deklaracji jako części mojego kodu, ale nie znalazłem standardu SQL dla danych wejściowych, więc jestem gotów zmienić moje liczenie

Wyjście będzie albo jeden wiersz na każdy potrójny, albo brak wierszy, jeśli słowo nie będzie ścisłe

Nie golfił

declare @temp table ( letter char(1) ) -- table to hold each letter of the word

declare @i int = 1

while @i <= len(@input) -- split each letter, and each row in @temp will have one letter
begin
    insert into @temp values (SUBSTRING(@input, @i, 1))
    set @i = @i + 1
end

-- join the letters table to itself to get three letter triples, where the three are in adjacent increasing order
-- use distinct because there might be duplicates in the word
select distinct t1.letter + t2.letter + t3.letter
from @temp t1
cross apply @temp t2
cross apply @temp t3
where ASCII(t1.letter) + 1 = ASCII(t2.letter)
and ASCII(t2.letter) + 1 = ASCII(t3.letter)
Brian J.
źródło
deklaracja nie będzie liczona, ponieważ mamy do czynienia z kodem, który byłby wymagany do wykonania wymaganej funkcjonalności po zadeklarowaniu w tym przypadku. Świetna robota, minęło trochę czasu, odkąd widziałem rozwiązanie SQL dla wyzwania. Świetna robota!
WallyWest,
Grałem w twój skrypt do 185 znaków, oto wersja bez golfa. Może chcesz sprawdzić moją odpowiedź , jak również
t-clausen.dk
2

R, 220 bajtów

Moje rozwiązanie jest dość proste. Pętla przechodzi przez trzy możliwe kombinacje liter, zapętla i sprawdza znaki wprowadzonego ciągu względem trzech kolejnych liter i dodaje je do ciągu. Łańcuch jest następnie drukowany tylko wtedy, gdy zostaną znalezione trzy litery (c == 4).

f<-function(w){if(nchar(w)>2){for(i in 1:24){
c<-1
t<-""
for(k in 1:3){for(j in 1:nchar(w)){if(substr(w,j,j)==intToUtf8(95+k+i)&c<4){
t<-paste(t,substr(w,j,j),sep="")
c<-c+1
break
}}}
if(c==4){print(paste(t))}}}}

wejście wyjście

> f("education")
> [1] "cde"
> > f("foghorn")
> [1] "fgh"
> > f("cabaret")
> [1] "abc"
> > f("hijacking")
> [1] "ghi"
> [1] "hij"
> [1] "ijk"
> > f("pneumonia")
> [1] "mno"
> [1] "nop"
> > f("klaxon")
> > f("perform")
> > f("learning")
> > 
Arwalk
źródło
2

Python 3.5, 114 111 88 80 79 bajtów:

lambda X,W=[*map(chr,range(65,91))]:[i*({*X}>={*i})for i in zip(W,W[1:],W[2:])]

Anonimowa funkcja lambda. Pobiera dane wejściowe jako ciąg wielkich liter i wypisuje tablicę krotek, przy czym te wypełnione są trzema wielkimi literami reprezentującymi wszystkie zestawy 3kolejnych liter pojawiających się na wejściu. Na przykład,

[(), (), (), (), (), (), ('G', 'H', 'I'), ('H', 'I', 'J'), ('I', 'J', 'K'), (), (), (), (), (), (), (), (), (), (), (), (), (), ()]

byłoby wyjściem dla danych wejściowych HIJACKING. Ten format wyjściowy został potwierdzony przez OP. Ma więc jedyny format wprowadzania wielkich liter. Jednakże, jeśli chcesz wprowadzić w tylko małymi literami, po prostu wymienić range(65,91)się range(97,123), dodając jeszcze jeden bajt.

Zamień na wszystkie przypadki testowe!

Wyjaśnienie:

Zasadniczo dzieje się tutaj:

  1. Za Wpomocą W=[*map(chr,range(65,91))], tworzona jest lista, która zawiera wszystkie wielkie litery alfabetu angielskiego. Z tego powodu zawsze wymagane jest wprowadzenie wielkich liter .

  2. Dla każdej krotki, ina liście, którą nazwiemy U, zawierającej wszystkie trzy kolejne krotki literowe, tj .:

    U=[('A','B','C'),('B','C','D'),('C','D','E'),...]
    

    stworzony przez zip(W,W[1:],W[2:])każdy ijest w pełni dodany do listy wyjściowej tak długo, jak wszystkie elementy w zestawie wersji i( {*i}) są w zbiorze wersją wejścia X( {*X}), czyli {*X}>={*i}, czyli Xjest rozszerzeniem o i. W przeciwnym razie pusta wersja i( ()) zostanie dodana do listy.

  3. Po przejściu wszystkich krotek z całkowicie dodanymi dopasowaniami lista jest zwracana jako wynik końcowy.

R. Kap
źródło
2

Scala, 59 bajtów

(s:Set[Char])=>'a'to'z'sliding 3 filter{_.toSet subsetOf s}

Nie golfowany:

(s:Set[Char]) => ('a' to 'z').sliding(3).filter{threeChars => threeChars.toSet.subsetOf(s)}

Wyjaśnienie:

(s:Set[Char])=>             //define a function with a Set of Chars called s as an argument
'a' to 'z'                  //create a Range of characters 'a' to 'z'
sliding 3                   //create an Iterator(Seq(a, b, c), Seq(b, c, d), Seq(c, d, e), ... , Seq(x, y, z))
filter{_.toSet subSetOf s}  //keep only the triplets which are a subset of s
corvus_192
źródło
2

Właściwie 13 bajtów

Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

S3@╧`εj`M3úV∩

Ungolfing

                Implicit input string s.
S               sorted(s).
 3@╧            Push all length-3 combinations of s.
    `εj`M       Join all of those combinations into single strings.
         3úV    Push all slices of the lowercase alphabet of length 1 <= n <= b
            ∩   Push the intersection of the combinations and slices.
                Implicit return.
Sherlock9
źródło
1

Java 7, 230 bajtów

String c(char[]q){java.util.Arrays.sort(q);char a[]=new String(q).replaceAll("(.)\\1","$1").toCharArray(),c=97,i=2;String r="",z="",s;for(;c<'z';z+=c++);while(i<a.length)if(z.contains(s=""+a[i-2]+a[i-1]+a[i++]))r+=s+" ";return r;}

Najprawdopodobniej można grać w golfa, ale wyzwanie było znacznie trudniejsze, niż początkowo myślałem w Javie ..

Przypadki bez golfa i testy:

Wypróbuj tutaj.

class M{
  static String c(char[] q){
    java.util.Arrays.sort(q);
    char a[] = new String(q).replaceAll("(.)\\1", "$1").toCharArray(),
         c = 97,
         i = 2;
    String r = "",
           z = "",
           s;
    for(; c < 'z'; z += c++);
    while(i < a.length){
      if(z.contains(s = "" + a[i-2] + a[i-1] + a[i++])){
        r += s+" ";
      }
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c("education".toCharArray()));
    System.out.println(c("foghorn".toCharArray()));
    System.out.println(c("cabaret".toCharArray()));
    System.out.println(c("hijacking".toCharArray()));
    System.out.println(c("pneumonia".toCharArray()));
    System.out.println(c("klaxon".toCharArray()));
    System.out.println(c("perform".toCharArray()));
    System.out.println(c("learning".toCharArray()));
    System.out.println(c("dblacghmeifjk".toCharArray()));
  }
}

Wydajność:

cde 
fgh 
abc 
ghi hij ijk 
mno nop 



abc bcd cde def efg fgh ghi hij ijk jkl klm 
Kevin Cruijssen
źródło
Wystarczy zapytać, dlaczego Java? To nie jest najbardziej golfowy z języków ...? +1 za wysiłek oczywiście ...
WallyWest
1
@WallyWest Cóż, jestem programistą Java w życiu codziennym. I wiem, że nigdy nie wygram żadnego wyzwania z tym, jak pełna jest Java, ale nadal fajnie jest kodegolf w Javie imho. :)
Kevin Cruijssen
1
Chyba nie muszę wymyślić kilku kreatywnych wyzwań związanych z kodem w najbliższej przyszłości, aby wziąć udział :) Niemniej jednak dobra robota!
WallyWest,
1

PowerShell v2 +, 93 bajty

param($n)97..120|%{-join[char[]]($_,++$_,++$_)}|?{(-join([char[]]$n|sort|select -u))-match$_}

Czuje się znacznie dłużej niż jest to wymagane, ale nie wydaje mi się, że mogę grać w golfa.

Pobiera dane wejściowe $n. Pętle od 97celu 120, budowy sąsiadujących strun trzyliterowe - czyli aż do |?, będziemy mieli abc, bcd, cde, itd. Na rurociągu. To jest przekazywane przez Where-Object(the |?), aby wyciągnąć tylko te elementy, w których klauzula jest prawdziwa. Tutaj klauzula to 1) ciąg wejściowy $n, rzutowany jako char-array, sorted i select -unique'd, a następnie -joined z powrotem na ciąg, 2) -matched przeciwko ciągom trzyliterowym (tj. Dopasowanie wyrażenia regularnego). Jeśli pasuje, to trzyliterowy ciąg znajduje się w słowie, więc filtruje przez |?. Wyniki są pozostawione w potoku, a wyniki są niejawne.

Przykłady

(Zauważ, że w tym przypadku dane wyjściowe są rozdzielone spacjami, ponieważ dzielimy dane wyjściowe na konkatenację).

PS C:\Tools\Scripts\golfing> 'education','foghorn','cabaret','hijacking','pneumonia','klaxon','perform','learning'|%{"$_ -> "+(.\close-knit-words.ps1 $_)}
education -> cde
foghorn -> fgh
cabaret -> abc
hijacking -> ghi hij ijk
pneumonia -> mno nop
klaxon -> 
perform -> 
learning -> 
AdmBorkBork
źródło
Świetne wyjaśnienie. Dałbym ci dwa głosy, jeśli to możliwe.
WallyWest
1

Siatkówka, 106 56 bajtów

D`.
O`.
^
abc¶
{`^(.*)¶.*\1.*
$0¶$1
}T`_l`l;`^.*
2`.*¶?

Deduplikuj, Sortuj. Dodaj abc. Sprawdź, czy podciąg został znaleziony i dołącz, jeśli tak. Przetłumacz na następny podciąg. Powtarzać. Następnie usuń pierwsze dwie linie.

Wypróbuj online


Naiwne rozwiązanie:

D`.
O`.
!&`abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz

Deduplikuj, posortuj, a następnie wyprowadź nakładające się dopasowania 3 kolejnych liter.

Wypróbuj online

mbomb007
źródło
Naiwne rozwiązanie wygląda dość prosto ... chociaż bardziej podoba mi się twoje rozwiązanie w golfa ... dobra robota!
WallyWest,
1

JavaScript (Firefox 48), 93 bajty

x=>[for(c of a=[...new Set(x,i=0)].sort())if(parseInt(d=c+a[++i]+a[i+1],36)%1333==38&!d[3])d]

Daje to 96-bajtową wersję ES6 :

x=>[...new Set(x)].sort().map((c,i,a)=>c+a[i+1]+a[i+2]).filter(x=>!x[3]&parseInt(x,36)%1333==38)

Jak to działa

Pierwszą dużą częścią tej funkcji jest:

[...new Set(x)].sort()

new Set(string)tworzy obiekt Set, który zawiera jeden z każdego unikalnego znaku w ciągu. Na przykład new Set("foghorn")wróci Set ["f", "o", "g", "h", "r", "n"]. Możemy przekonwertować to na tablicę za pomocą [... ], a następnie posortować za pomocą wbudowanego .sort(). To zamienia się "foghorn"w ["f", "g", "h", "n", "o", "r"].

Kolejny krok to:

.map((c,i,a)=>c+a[i+1]+a[i+2])

To mapuje każdy znak cw aszyku na postać połączoną z dwoma przedmiotami po nim. Na przykład ["f", "g", "h", "n", "o", "r"] => ["fgh", "ghn", "hno", "nor", "orundefined", "rundefinedundefined"]. ( undefinedWyskakujące okienko przy próbie uzyskania dostępu do nieistniejącego elementu tablicy.

Ostatnim krokiem jest filtrowanie:

.filter(x=>!c[3]&parseInt(x,36)%1333==38)

Po pierwsze, !c[3]&należy wykluczyć wszelkie ciągi zawierające undefined. Jest to konieczne, ponieważ błąd powoduje, że następujący algorytm liczy się np. gmundefinedJako kolejny triplet.

Wszystkie trzy kolejne ciągi znaków, interpretowane jako liczby podstawowe 36, mają wartość 38 modulo 1333. Zrozumiałem to na podstawie następującego obliczenia:

  • 012 (podstawa 36) = 38
  • 123 (podstawa 36) = 1371
  • 1371–38 = 1333
  • 1371 mod 1333 ≡ 38 mod 1333 ≡ 38

Dlatego jeśli ciąg znaków składający się z trzech znaków ma wartość 38 mod 1333 w bazie 36, trzy znaki są następujące po sobie w alfabecie.

Testowy fragment kodu

ETHprodukcje
źródło
Nie udaje się to dla słów takich jak gemi mage.
Neil
Mówisz więc, że wszystkie kolejne trójki liter po przekształceniu z heksatrigesymalnych (podstawa 36) mają 38, gdy modów przeciwko 1333 ... to jest cholernie niesamowite!
WallyWest,
@ Neil Naprawiono kosztem sześciu bajtów.
ETHprodukcje
I przywłaszczył swój !c[3]trik, który przyniósł mi po ES6 odpowiedź na długości poprzedniego ES6 odpowiedź, więc teraz ja nawet outgolfing swój Firefox 30+ odpowiedź. Przepraszam za to.
Neil
@Neil Nie mam nic przeciwko :)
ETHproductions
1

Rakieta 237 bajtów

(define(f s)(let((lr(λ(l i)(list-ref l i)))(l(sort(map char->integer(string->list s))<)))(for((i(-(length l)2)))
(when(=(-(lr l(+ i 2))(lr l(+ i 1)))1(-(lr l(+ i 1))(lr l i)))(for((j 3))(display(string(integer->char(lr l(+ i j))))))))))

Testowanie:

(f "education")

Wydajność:

cde

Wersja szczegółowa:

(define(f2 s)
  (let ((lr (λ(l i)(list-ref l i)))
        (l (sort (map char->integer (string->list s)) <)))
  (for ((i (-(length l)2)))
    (when (=  (- (lr l (+ i 2)) (lr l (+ i 1)))
              1
              (- (lr l (+ i 1)) (lr l i)))
      (for((j 3))
        (display (string(integer->char (lr l (+ i j))))))))))
rnso
źródło
1

Rubinowy , 50 bajtów

each_cons(3)pobiera z alfabetu wszystkie kolejne listy podrzędne o długości 3 ?a..?z, a następnie służy e&s.chars==edo wybierania tylko tych, które mają wszystkie znaki w ciągu docelowym, za pomocą przecięcia zgodnie z sekwencją. Zwraca listę list.

->s{(?a..?z).each_cons(3).select{|e|e&s.chars==e}}

Wypróbuj online!

Wartość tuszu
źródło
1

[R], 110 bajtów

 f=function(b){a=combn(sort(utf8ToInt(b)),3);apply(unique(t(a[,which(apply(diff(a),2,prod)==1)])),1,intToUtf8)}

Jestem pewien, że nadal można grać w golfa

Zahiro Mor
źródło