Những từ gần gũi


22

Giới thiệu

Theo bài đăng của Rand Al'Thor trong Puzzling SE, một từ gần gũi là bất kỳ từ nào có chứa ba chữ cái liên tiếp theo thứ tự bảng chữ cái (theo bất kỳ thứ tự nào).

Những từ như giáo dục , Foghorncabaret đều được coi là những từ gần gũi trong khi những từ như học tập , klaxonbiểu diễn không phải là những từ gần gũi.

Thử thách

Thách thức là mã hóa một chương trình có khả năng lấy một từ làm đầu vào (chữ thường giả định, cho tất cả ý định và mục đích) và trả về đầu ra (nếu có) liệt kê tất cả các bộ chữ cái liên tiếp (cả chữ thường) là một từ gần gũi và đầu ra trống nếu nó không phải là một từ gần gũi.

Ví dụ

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

Quy tắc

  1. Trong khi đầu vào được giả sử là một từ viết thường và đầu ra phải là chữ thường, bản chất của đầu ra sẽ thay đổi tùy theo lựa chọn ngôn ngữ mã hóa của bạn. Vui lòng chọn một hình thức đầu ra phù hợp nhất với bản chất của thử thách, cho dù đó là STDOUT, đầu ra tệp, mảng, v.v.
  2. Bởi vì đây là môn đánh gôn, nên sẽ có số byte thấp nhất là người chiến thắng rõ ràng.
  3. Không có sơ hở ngớ ngẩn .
  4. Tôi sẽ không chấp nhận các câu trả lời có các chữ cái liên tiếp theo thứ tự không theo thứ tự chữ cái ... Chẳng hạn, cabsẽ không được coi là một đầu ra phù hợp cabaret.
  5. Lưu ý đặc biệt, trong khi "bộ ba" không nhất thiết phải theo thứ tự bảng chữ cái, nhưng các ký tự trong bộ ba phải ... vì vậy, trong trường hợp từ "hiệu suất", ví dụ, đầu ra mno,nopsẽ được chấp nhận, như ý muốn nop,mno. Trong trường hợp của từ "tặc", có sáu cách mà các bộ ba ghi, hijijkcó thể được sắp xếp theo một danh sách, và tất cả sáu hoán vị được chấp nhận như đầu ra.

Ngoài ra, trên nhãn hiệu của bạn, có được thiết lập, golf!


Đầu ra có thể là một mảng char 2D với mỗi bộ ba chữ cái liên tiếp trong một cột không?
Luis Mendo

@LuisMendo Bạn có thể cho tôi một ví dụ chỉ để tôi có thể hình dung nó không?
WallyWest

Hãy thử mã của tôi mà không có trận chung kết !Và với một từ khác, vì mã hiện tại cho kết quả tương tự :-)
Luis Mendo

@LuisMendo là cột MATL chính hay gì?
Maltysen

1
Là một đầu ra ở định dạng của một bộ các bộ dữ liệu có ổn không, tức là đầu ra cho pneumoniacó thể [('m','n','o'),('n','o','p')])?
R. Kap

Câu trả lời:


8

05AB1E , 7 6 5 byte

Mã số:

3ãAŒÃ

Giải trình:

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


Đây chỉ là thiên tài tuyệt đối ... Tôi sẽ phải thử tạo một thử thách đẩy ngôn ngữ này đến giới hạn ...;)
WallyWest

10

Python 3.5, 68 byte

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

In các chuỗi đầu ra và chấm dứt lỗi khi giá trị ký tự quá lớn.

Tạo tất cả các chuỗi gồm ba chuỗi liên tiếp và in các chuỗi là một tập hợp con của từ đầu vào.


8

Pyth - 11 10 8 7 byte

Phương pháp siêu vũ phu.

@^z3.:G

Phòng thử nghiệm .

@            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

7

Thạch , 7 byte

ØaẆfṗ3$

Đây là một liên kết đơn nguyên. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ø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.

7

JavaScript (ES6), 95 90 byte

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>

Thiếu các giá trị nối với nhau undefined, do đó chuỗi kết quả chứa lớn hơn 3 ký tự. Tôi đã mượn !c[3]mẹo từ @ETHproductions để tiết kiệm 5 byte.


2
Thật trùng hợp undefinedlà một từ gần gũi;)
WallyWest

Tại sao parseInt(c,36)thay vì c.charCodeAt()?
Tít

@Titus Tôi đoán nó không có gì khác biệt, tôi chỉ quen với việc sử dụng parseInttrong môn đánh gôn.
Neil

4

Python 3.5, 78 byte

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)

4

PHP, 100 byte

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

lấy đầu vào làm đối số dòng lệnh; in dấu phẩy. chạy với -r.


1
for($s=join(range(Z,z));$a=substr($s,++$i,3);)là một cách ngắn hơn để tạo $ a. Nó thừa nhận kiểm tra một loạt dấu câu và một số ký tự 2 ký tự nhưng vì đầu vào chỉ là chữ cái viết thường và nó yêu cầu nó tìm thấy 3 ký tự đó là tốt.
dùng59178

for($a="ab ", $ i = 98; $ i <123;)! strstr (Count_chars ($ argv [1], 3), $ a = đế ($ a, 1) .chr (++ $ i))?: in "$ a,"; `tiết kiệm 2 Byte. Cách rất hay, tôi đã thử các cách khác trong PHP nhưng không thể đạt được byte của mã của bạn. Tôi không chắc bạn có cần một khoảng
trắng

4

C, 175 174 byte

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

thụt lề:

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

Trong khi thực hiện sắp xếp, nó thay thế các giá trị trùng lặp bằng 0, các 0 này được sắp xếp vào đầu từ. Tìm kiếm các giá trị liên tiếp là tầm thường.


1
Chào mừng đến với trang web!
DJMcMayhem

1
Vâng, chào mừng bạn đến với PPCG! Công việc tuyệt vời cho câu trả lời của bạn, C không phải là một trong những môn golf dễ nhất!
WallyWest

3

MATL , 13 byte

2Y23YCtjmAZ)!

Hãy thử trực tuyến!

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

3

Haskell, 48 byte

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

Tạo tất cả các bộ ba của ba ký tự liên tiếp, lấy những ký tự chỉ sử dụng các chữ cái trong đầu vào.


53 byte:

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

Danh sách ['c'..]chứa tất cả các ký tự unicode từ 'c'trở đi. Việc hiểu danh sách [[pred$pred c..c]|c<-['c'..]]biến chúng thành tất cả các chuỗi gồm 3 ký tự liên tiếp "abc"trở đi. Chúng tôi lùi về phía sau [pred$pred c..c]thay vì chuyển tiếp với [c..succ$succ c]để tránh lỗi khi lấy người kế thừa của ký tự unicode cao nhất.

Các bộ ba này được lọc cho những người chỉ sử dụng các chữ cái trong đầu vào.


3

Perl, 36 byte

Bao gồm +1 cho -n

Cung cấp đầu vào trên STDIN:

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

Chỉ cần mã:

join("",a..z)=~/[$_]{3}(?{say$&})^/

3

T-SQL, 153 byte

Phải phản ứng với nhận xét từ WallyWest, về việc đã lâu rồi kể từ câu trả lời TSQL cuối cùng. Câu trả lời được lấy cảm hứng một phần từ câu trả lời của Brian J

Chơi gôn

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

Vĩ cầm

Ung dung:

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

1
Thật khéo léo! Thậm chí không biết về cái bàn đó. Điều tốt là không có từ nào dài hơn 2048 chữ cái!
Brian J

2

Haskell, 63 60 52 byte

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

Ví dụ sử dụng: f "hijacking"-> ["ghi","hij","ijk"].

scanr(:)"_"['a'..]xây dựng một danh sách với các đuôi của danh sách tất cả các ký tự unicode bắt đầu bằng 'a'và cho phép nó kết thúc bằng một '_', tức là ["abcde...\1114111_", "bcde...\1114111_", "cde...\1114111_", ..., "\1114109\1114110\1114111_", "\1114110\1114111_", "\1114111_", "_"]. Sau đó, chúng tôi lấy tối đa ba ký tự của mỗi chuỗi và liên kết nó với x. Giữ tất cả xcác chữ cái của nó trong tham số đầu vào w.

Chỉnh sửa: @xnor lưu 3 7 byte. Cảm ơn!


Có ai biết nếu tôi có thể nắm bắt ba yếu tố đầu tiên của danh sách a:b:c:_với một @ -potype không?
nimi

Tôi không biết về @ -potype, nhưng bạn có thể xóa 'z'giới hạn trên và chỉ để nó thử tất cả các ký tự.
xnor

Nắm bắt 3 yếu tố đầu tiên thực sự gây phiền nhiễu. Điều tốt nhất tôi có thể thấy chỉ là sử dụng takevà xóa chuỗi trống:f w=[x|x<-init$take 3<$>scanr(:)""['a'..],all(`elem`w)x]
xnor

@xnor: tốt đẹp. chúng ta có thể bắt đầu scanrbằng "." thay vì ""và bỏ qua init$.
nimi

2

T-SQL (SQL Server 2014), 217 byte

Chơi gôn

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)

Sử dụng

Đầu tiên khai báo biến @a dưới dạng char của một số loại và gán đầu vào như vậy

declare @a varchar(max) = 'pneumoultramicroscopicsilicovolcanoconiosis'

Tôi đã không tính khai báo là một phần của mã của mình, nhưng tôi không tìm thấy tiêu chuẩn sql cho đầu vào, vì vậy tôi sẵn sàng thay đổi cách tính của mình

Đầu ra sẽ là một hàng cho mỗi bộ ba hoặc không có hàng nếu từ không được đan

Bị đánh cắp

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)

khai báo sẽ không được tính khi thấy chúng ta đang xử lý mã sẽ được yêu cầu để thực thi chức năng sau khai báo được yêu cầu trong trường hợp này. Công việc tuyệt vời, đã được một thời gian kể từ khi tôi thấy một giải pháp SQL cho một thách thức. Công việc tuyệt vời
WallyWest

Tôi đã đánh golf kịch bản của bạn xuống còn 185 ký tự, đây là phiên bản không được chỉnh sửa. Bạn có thể muốn kiểm tra câu trả lời của tôi cũng
t-clausen.dk

2

R, 220 byte

Giải pháp của tôi là khá đơn giản. Nó lặp qua ba tổ hợp chữ cái có thể, lặp qua và kiểm tra các ký tự của chuỗi đã nhập so với ba chữ cái liên tiếp và thêm chúng vào một chuỗi. Chuỗi sau đó chỉ được in khi tìm thấy ba chữ cái (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))}}}}

đầu ra đầu vào

> 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")
> > 

2

Python 3.5, 114 111 88 80 79 byte:

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

Một chức năng lambda ẩn danh. Lấy đầu vào dưới dạng một chuỗi chữ hoa và xuất ra một loạt các bộ dữ liệu, với các ký tự chứa ba tự viết hoa đại diện cho tất cả các bộ 3chữ cái liên tiếp xuất hiện trong đầu vào. Ví dụ,

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

sẽ là đầu ra cho đầu vào HIJACKING. Định dạng đầu ra này đã được OP xác nhận là ổn. Vì vậy, có định dạng đầu vào chữ hoa duy nhất. Tuy nhiên, nếu bạn muốn đầu vào trong chỉ chữ thường, bạn chỉ cần thay thế range(65,91)với range(97,123), thêm một byte hơn.

Altern.it với tất cả các trường hợp thử nghiệm!

Giải trình:

Về cơ bản những gì đang xảy ra ở đây là:

  1. Một danh sách, Wđược tạo bằng cách sử dụng W=[*map(chr,range(65,91))], chứa tất cả các chữ cái in hoa trong bảng chữ cái tiếng Anh. Bởi vì điều này, một đầu vào chữ hoa luôn luôn được yêu cầu.

  2. Đối với mỗi bộ, itrong một danh sách, chúng tôi sẽ gọi U, chứa tất cả ba bộ thư liên tiếp, nghĩa là:

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

    được tạo bởi zip(W,W[1:],W[2:]), mỗi cái iđược thêm đầy đủ vào danh sách đầu ra miễn là tất cả các phần tử trong phiên bản đã đặt của i( {*i}) nằm trong phiên bản đã đặt của đầu vào X( {*X}), tức là {*X}>={*i}, Xsiêu bộ của i. Mặt khác, phiên bản trống của i( ()) được thêm vào danh sách.

  3. Khi tất cả các bộ dữ liệu đã được trải qua với các trận đấu được thêm đầy đủ, danh sách được trả về làm đầu ra cuối cùng.


2

Scala, 59 byte

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

Ung dung:

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

Giải trình:

(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

2

Trên thực tế, 13 byte

Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

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.

1

Java 7, 230 byte

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

Điều này rất có thể được đánh gôn, nhưng thử thách khó khăn hơn nhiều so với tôi nghĩ ban đầu trong Java ..

Các trường hợp bất ngờ & thử nghiệm:

Hãy thử nó ở đây.

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

Đầu ra:

cde 
fgh 
abc 
ghi hij ijk 
mno nop 



abc bcd cde def efg fgh ghi hij ijk jkl klm 

Chỉ cần hỏi tại sao Java? Nó không phải là ngôn ngữ dễ chơi nhất ...? +1 cho nỗ lực tất nhiên ...
WallyWest

1
@WallyWest Vâng, tôi là một nhà phát triển Java trong cuộc sống hàng ngày. Và tôi biết rằng tôi sẽ không bao giờ chiến thắng bất kỳ thử thách nào với việc Java dài dòng như thế nào, nhưng vẫn rất vui với codegolf trong Java imho. :)
Kevin Cruijssen

1
đoán không phải đưa ra một vài thách thức mã sáng tạo trong tương lai gần để bạn tham gia :) tuy nhiên công việc tốt!
WallyWest

1

PowerShell v2 +, 93 byte

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

Cảm thấy lâu hơn nhiều so với yêu cầu, nhưng tôi dường như không thể đánh gôn thêm nữa.

Đưa đầu vào $n. Vòng từ 97đến 120, xây dựng chuỗi ba chữ liền kề - có nghĩa là, đến |?, chúng ta sẽ có abc, bcd, cde, vv trên các đường ống dẫn. Sau đó, nó được đưa qua một Where-Object(các |?) để chỉ rút ra những mục có mệnh đề là đúng. Ở đây, mệnh đề là 1) chuỗi đầu vào $n, được đúc dưới dạng char-array, sorted và select -unique'd, sau đó -joined trở lại thành chuỗi, 2) -matched so với chuỗi ba ký tự (nghĩa là khớp regex). Nếu đó là một kết hợp, thì chuỗi ba chữ cái có trong từ và do đó, nó lọc qua |?. Các kết quả còn lại trên đường ống và đầu ra là ẩn.

Ví dụ

(Lưu ý rằng ở đây đầu ra được phân tách bằng dấu cách, vì chúng ta đang xâu chuỗi đầu ra bằng cách ghép.)

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

Giải thích tuyệt vời. Tôi sẽ cho bạn hai phiếu bầu nếu có thể.
WallyWest

1

Võng mạc, 106 56 byte

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

Khử trùng, Sắp xếp. Thêm abc. Tìm nếu chuỗi con được tìm thấy và nối thêm nếu có. Dịch chuỗi con tiếp theo. Nói lại. Sau đó loại bỏ hai dòng đầu tiên.

Dùng thử trực tuyến


Giải pháp ngây thơ:

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

Khử trùng lặp, Sắp xếp, sau đó xuất kết quả trùng khớp của 3 chữ cái liên tiếp.

Dùng thử trực tuyến


Giải pháp ngây thơ trông khá đơn giản ... mặc dù tôi thích giải pháp chơi gôn của bạn hơn ... hoàn thành tốt!
WallyWest

1

JavaScript (Firefox 48), 93 byte

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]

Điều này cho vay chính nó với phiên bản ES6 96 byte :

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)

Làm thế nào nó hoạt động

Đoạn chính đầu tiên của hàm là đây:

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

new Set(string)tạo một đối tượng Set chứa một trong mỗi ký tự duy nhất trong chuỗi. Ví dụ, new Set("foghorn")sẽ trở lại Set ["f", "o", "g", "h", "r", "n"]. Chúng ta có thể chuyển đổi nó thành một mảng với [... ], sau đó sắp xếp nó với tích hợp .sort(). Điều này biến "foghorn"thành["f", "g", "h", "n", "o", "r"] .

Bước tiếp theo là đây:

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

Điều này ánh xạ từng cvi khuẩn trong array đến nhân vật được nối với hai vật phẩm sau nó. Ví dụ , ["f", "g", "h", "n", "o", "r"] => ["fgh", "ghn", "hno", "nor", "orundefined", "rundefinedundefined"]. (Các undefineds bật lên khi bạn cố gắng truy cập một thành viên không tồn tại của mảng.

Bước cuối cùng là lọc:

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

Đầu tiên, !c[3]&là loại trừ bất kỳ chuỗi nào có chứa undefined. Điều này là cần thiết bởi vì một lỗi khiến thuật toán sau được tính, ví dụ gmundefinednhư một bộ ba liên tiếp.

Tất cả các chuỗi ba chuỗi liên tiếp, khi được hiểu là các số cơ sở 36, là 38 modulo 1333. Tôi đã tìm ra điều này bằng cách tính toán sau:

  • 012 (cơ sở 36) = 38
  • 123 (cơ sở 36) = 1371
  • 1371 - 38 = 1333
  • 1371 mod 1333 ≡ 38 mod 1333 38

Do đó, nếu một chuỗi ba char là 38 mod 1333 trong cơ sở 36, thì ba ký tự được liên tiếp trong bảng chữ cái.

Kiểm tra đoạn


Điều này không thành công cho các từ như gemmage.
Neil

Vì vậy, bạn đang nói rằng tất cả các bộ ba chữ cái liên tiếp khi được chuyển đổi trở lại từ thập lục phân (cơ sở 36) là 38 khi mod so với 1333 ... điều đó thật tuyệt vời!
WallyWest

@Neil Đã sửa với giá sáu byte.
Sản phẩm ETH

Tôi đã chiếm đoạt !c[3]mánh khóe của bạn để đưa câu trả lời ES6 của tôi xuống độ dài của câu trả lời ES6 trước đó, vì vậy bây giờ tôi thậm chí còn vượt xa câu trả lời Firefox 30+ của bạn. Xin lỗi vì điều đó.
Neil

@ Tôi không bận tâm :)
ETHproductions

1

Vợt 237 byte

(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))))))))))

Kiểm tra:

(f "education")

Đầu ra:

cde

Phiên bản chi tiết:

(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))))))))))

1

Ruby , 50 byte

each_cons(3)nhận được tất cả các danh sách con liên tiếp có độ dài 3 từ bảng chữ cái ?a..?z, sau đó sử dụng e&s.chars==eđể chỉ chọn những danh sách có tất cả các ký tự trong chuỗi mục tiêu bằng cách sử dụng giao lộ setwise. Trả về một danh sách các danh sách.

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

Hãy thử trực tuyến!


1

[R], 110 byte

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

Tôi chắc rằng nó vẫn có thể chơi được


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.