คำที่ถัก


22

บทนำ

ตามที่โพสต์ของ Rand Al'Thorใน Puzzling SE คำที่ใกล้ชิดคือคำใด ๆ ที่มีตัวอักษรเรียงตามลำดับตัวอักษรสามตัว (เรียงตามลำดับใด ๆ )

คำเช่นการศึกษา , Foghornและคาบาเรต์ถือว่าเป็นคำที่มีความใกล้ชิดกันในขณะที่คำต่าง ๆ เช่นการเรียนรู้ , klaxonและการแสดงนั้นไม่ใช่คำที่ใกล้เคียงกัน

ท้าทาย

ความท้าทายคือการเขียนโค้ดโปรแกรมที่สามารถใช้คำเดียวเป็นอินพุต (สมมติตัวพิมพ์เล็กสำหรับเจตนาและวัตถุประสงค์ทั้งหมด) และส่งคืนเอาต์พุตที่ (ถ้ามี) แสดงรายการชุดตัวอักษรต่อเนื่องทั้งหมด (เช่นในตัวพิมพ์เล็ก) เป็นคำที่ใกล้เคียงกันและให้ผลลัพธ์ที่ว่างเปล่าหากไม่ใช่คำที่ใกล้เคียงกัน

ตัวอย่าง

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

กฎระเบียบ

  1. ในขณะที่อินพุตจะถือว่าเป็นคำตัวพิมพ์เล็กและผลลัพธ์จะต้องเป็นตัวพิมพ์เล็กลักษณะของเอาต์พุตจะแตกต่างกันไปตามตัวเลือกของภาษาการเข้ารหัสของคุณ โปรดเลือกรูปแบบการแสดงผลที่เหมาะสมกับลักษณะของความท้าทายที่ดีที่สุดไม่ว่าจะเป็น STDOUT, ไฟล์เอาต์พุต, อาร์เรย์ ฯลฯ
  2. เพราะนี่คือโค้ดกอล์ฟมันจะเป็นกรณีของจำนวนไบต์ต่ำสุดที่เป็นผู้ชนะที่ชัดเจน
  3. ไม่มีช่องโหว่โง่
  4. ฉันจะไม่ยอมรับคำตอบที่มีตัวอักษรต่อเนื่องตามลำดับที่ไม่ใช่ตัวอักษร ... ดังนั้นcabจะไม่ถือว่าเป็นผลลัพธ์ที่เหมาะสมcabaretเช่น
  5. หมายเหตุพิเศษในขณะที่ "triplets" ไม่จำเป็นต้องเรียงตามตัวอักษร แต่ตัวละครใน triplets จะต้อง ... ดังนั้นในกรณีของคำว่า "ประสิทธิภาพ" ตัวอย่างเช่นผลลัพธ์mno,nopจะได้รับการยอมรับ nop,mnoเป็นความประสงค์ ในกรณีที่มีคำว่า "หักหลัง" มีหกวิธีที่สามของghi, hijและijkจะได้รับการจัดให้อยู่ในรายการและทั้งหกพีชคณิตเป็นที่ยอมรับเป็นผลผลิต

นอกจากนั้นในคะแนนของคุณรับชุดกอล์ฟ!


เอาต์พุตสามารถเป็นอาร์เรย์ถ่าน 2 มิติพร้อมชุดตัวอักษรต่อเนื่องสามชุดในแต่ละคอลัมน์ได้หรือไม่?
Luis Mendo

@LuisMendo คุณช่วยยกตัวอย่างให้ฉันเพื่อที่ฉันจะได้เห็นมันได้หรือไม่?
WallyWest

ลองรหัสของฉันโดยไม่ต้องขั้นสุดท้าย!และมีคำอื่นเป็นหนึ่งในปัจจุบันให้ผลเหมือนกัน :-)
หลุยส์ Mendo

@LuisMendo เป็นคอลัมน์ MATL ที่สำคัญหรืออะไร
Maltysen

1
เอาต์พุตในรูปแบบของอาร์เรย์ของ tuples โอเคนั่นคือเอาต์พุตของpneumoniaสามารถเป็นได้[('m','n','o'),('n','o','p')])?
R. Kap

คำตอบ:


8

05AB1E , 7 6 5 ไบต์

รหัส:

3ãAŒÃ

คำอธิบาย:

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

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


นี่เป็นอัจฉริยะที่แท้จริง ... ฉันจะต้องพยายามสร้างความท้าทายที่ผลักดันภาษานี้ให้ถึงขีด จำกัด ... ;)
WallyWest

10

Python 3.5, 68 ไบต์

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

พิมพ์สตริงเอาต์พุตและยุติด้วยข้อผิดพลาดเมื่อค่าอักขระมีขนาดใหญ่เกินไป

สร้างสตริงทั้งหมดที่สามติดต่อกันและพิมพ์พวกเขาที่เป็นส่วนย่อยของคำอินพุต


8

Pyth - 11 10 8 7 ไบต์

วิธีการเดรัจฉานแรงสุด

@^z3.:G

Test Suite

@            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

เยลลี่ขนาด 7 ไบต์

ØaẆfṗ3$

นี่คือลิงค์ monadic ลองออนไลน์!

มันทำงานอย่างไร

Ø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 ไบต์

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>

ค่าที่ขาดหายไปเชื่อมต่อกันundefinedดังนั้นสตริงผลลัพธ์จึงมีอักขระมากกว่า 3 ตัว ฉันยืม!c[3]เคล็ดลับจาก @ETHproductions เพื่อประหยัด 5 ไบต์


2
โดยบังเอิญundefinedคือคำที่มีความใกล้ชิด;)
WallyWest

ทำไมparseInt(c,36)แทนc.charCodeAt()?
ติตัส

@Titus ฉันคิดว่ามันไม่ได้สร้างความแตกต่างฉันแค่คุ้นเคยกับการใช้parseIntในการตีกอล์ฟ
Neil


4

PHP, 100 ไบต์

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

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง พิมพ์เครื่องหมายจุลภาคต่อท้าย -rทำงานด้วย


1
for($s=join(range(Z,z));$a=substr($s,++$i,3);)เป็นวิธีที่สั้นกว่าในการสร้าง $ a ตรวจสอบเครื่องหมายวรรคตอนและชุดอักขระ 2 ตัว แต่ยอมรับว่าเป็นตัวอักษรตัวพิมพ์เล็กเท่านั้นและต้องการให้พบอักขระ 3 ตัวที่ใช้ได้
user59178

for($a="AB", $ i = 98; $ i <123!;) strstr (count_chars ($ argv [1], 3), $ A = substr ($ ที่ 1) .chr ($ i ++)) ?: พิมพ์ "$ a,"; `ประหยัด 2 ไบต์วิธีที่ดีมากฉันลองใช้วิธีอื่นใน PHP แต่ไม่สามารถเข้าถึงรหัสไบต์ของคุณฉันไม่แน่ใจว่าคุณต้องการพื้นที่ว่างหลังจากเครื่องหมายจุลภาคหรือไม่
JörgHülsermann

4

C, 175 174 ไบต์

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

เยื้อง:

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

ในขณะที่ทำการจัดเรียงมันจะแทนที่ค่าที่ซ้ำกันด้วย 0s 0s เหล่านี้จะถูกเรียงลำดับไปยังจุดเริ่มต้นของคำ การมองหาค่าที่ต่อเนื่องกันเป็นเรื่องเล็กน้อย


1
ยินดีต้อนรับสู่เว็บไซต์!
DJMcMayhem

1
ใช่ยินดีต้อนรับสู่ PPCG! ทำงานได้ดีกับคำตอบของคุณ C ไม่ใช่หนึ่งในสนามกอล์ฟที่ง่ายที่สุด!
WallyWest

3

MATL , 13 ไบต์

2Y23YCtjmAZ)!

ลองออนไลน์!

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 ไบต์

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

สร้างอเนกประสงค์สามตัวต่อเนื่องกันสามตัวใช้เวลาที่ใช้เฉพาะตัวอักษรในอินพุต


53 ไบต์:

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

รายการ['c'..]ประกอบด้วยอักขระ Unicode ทั้งหมดจาก'c'เป็นต้นไป ความเข้าใจในรายการ[[pred$pred c..c]|c<-['c'..]]จะเปลี่ยนเป็นสตริงทั้งหมดที่มี 3 ตัวอักษรติดต่อกันนับจากนี้"abc"เป็นต้นไป เราย้อนกลับ[pred$pred c..c]ไปข้างหน้าด้วยแทนที่จะส่งต่อด้วย[c..succ$succ c]เพื่อหลีกเลี่ยงข้อผิดพลาดเมื่อรับช่วงตัวอักษรยูนิโค้ดที่สูงที่สุด

อเนกประสงค์เหล่านี้จะถูกกรองสำหรับผู้ที่ใช้ตัวอักษรในอินพุตเท่านั้น



3

T-SQL, 153 ไบต์

ต้องตอบสนองต่อความคิดเห็นจาก WallyWest เกี่ยวกับมันเป็นเวลานานตั้งแต่คำตอบ TSQL ล่าสุด คำตอบส่วนหนึ่งได้แรงบันดาลใจจากคำตอบของ Brian J

แข็งแรงเล่นกอล์ฟ:

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

ซอ

Ungolfed:

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
นั่นฉลาด! ยังไม่รู้เกี่ยวกับตารางนั้น สิ่งที่ดีไม่มีคำยาวเกิน 2048 ตัวอักษร!
Brian J

2

Haskell, 63 60 52 ไบต์

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

ตัวอย่างการใช้งาน: ->f "hijacking"["ghi","hij","ijk"]

scanr(:)"_"['a'..]สร้างรายการที่มีหางของรายการสินค้าทั้งหมดของตัวอักษร Unicode ที่เริ่มต้นด้วยการ'a'และช่วยให้มันจบลงด้วยเช่น'_' จากนั้นเราก็ใช้เวลาถึงสามตัวอักษรของแต่ละสายและผูกมัน["abcde...\1114111_", "bcde...\1114111_", "cde...\1114111_", ..., "\1114109\1114110\1114111_", "\1114110\1114111_", "\1114111_", "_"] xเก็บทั้งหมดที่ตัวอักษรของมันทุกพารามิเตอร์อยู่ในการป้อนข้อมูลxw

แก้ไข: @xnor บันทึกแล้ว3 7 ไบต์ ขอบคุณ!


ไม่มีใครรู้ว่าฉันสามารถจับภาพสามองค์ประกอบแรกของรายการa:b:c:_ด้วย @ - รูปแบบ?
nimi

ฉันไม่รู้เกี่ยวกับ @ -pattern แต่คุณสามารถลบ'z'ขอบบนและปล่อยให้มันลองตัวละครทุกตัว
xnor

การจับองค์ประกอบ 3 อย่างแรกนั้นน่ารำคาญจริงๆ ที่ดีที่สุดที่ฉันเห็นคือใช้takeและลบสตริงเปล่า:f w=[x|x<-init$take 3<$>scanr(:)""['a'..],all(`elem`w)x]
xnor

@xnor: ดี เราสามารถเริ่มต้นscanrด้วย "." แทนและละเว้น"" init$
nimi

2

T-SQL (SQL Server 2014), 217 ไบต์

แข็งแรงเล่นกอล์ฟ

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)

การใช้

ก่อนอื่นให้ประกาศ @a ตัวแปรว่าเป็น char ของการเรียงลำดับและกำหนดอินพุตเช่นนั้น

declare @a varchar(max) = 'pneumoultramicroscopicsilicovolcanoconiosis'

ฉันไม่ได้นับการประกาศเป็นส่วนหนึ่งของรหัสของฉัน แต่ฉันไม่พบ sql มาตรฐานสำหรับการป้อนข้อมูลดังนั้นฉันยินดีที่จะเปลี่ยนการนับของฉัน

เอาต์พุตจะเป็นหนึ่งแถวสำหรับแต่ละทริปเปิลหรือไม่มีแถวหากคำไม่ได้ถักใกล้กัน

Ungolfed

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)

การประกาศจะไม่ถูกนับเนื่องจากเรากำลังจัดการกับรหัสที่จะต้องใช้ในการดำเนินการตามประกาศการทำงานที่ต้องการในอินสแตนซ์นี้ เยี่ยมมากมาพักหนึ่งแล้วที่ฉันเห็นโซลูชัน SQL สำหรับความท้าทาย การทำงานที่ดี!
WallyWest

ฉันเล่นกอล์ฟสคริปต์ของคุณลงไปที่ 185 ตัวอักษรนี่เป็นเวอร์ชั่นที่ไม่ดี คุณอาจต้องการตรวจสอบคำตอบของฉันเช่นกัน
t-clausen.dk

2

R, 220 ไบต์

ทางออกของฉันค่อนข้างตรงไปตรงมา มันวนซ้ำผ่านตัวอักษรสามตัวที่เป็นไปได้วนซ้ำและตรวจสอบอักขระของสตริงที่ป้อนกับตัวอักษรสามตัวที่ต่อเนื่องกันและเพิ่มเข้าไปในสตริง สตริงจะถูกพิมพ์ก็ต่อเมื่อพบตัวอักษรสามตัว (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))}}}}

อินพุต / เอาต์พุต

> 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 ไบต์:

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

ฟังก์ชั่นแลมบ์ดานิรนาม รับอินพุตเป็นสตริงตัวพิมพ์ใหญ่และเอาต์พุตอาร์เรย์ของ tuples โดยอักขระที่เติมด้วยอักขระตัวพิมพ์ใหญ่สามตัวที่แสดงถึง3ตัวอักษรต่อเนื่องทั้งหมดที่ปรากฏในอินพุต ตัวอย่างเช่น,

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

HIJACKINGจะมีการส่งออกสำหรับการป้อนข้อมูล รูปแบบผลลัพธ์นี้ได้รับการยืนยันว่าใช้ได้โดย OP มีรูปแบบอินพุตตัวพิมพ์ใหญ่เท่านั้น อย่างไรก็ตามหากคุณต้องการใส่ตัวพิมพ์เล็กเท่านั้นให้แทนที่range(65,91)ด้วยrange(97,123)เพิ่มอีกหนึ่งไบต์

Rep..it กับกรณีทดสอบทั้งหมด!

คำอธิบาย:

โดยทั่วไปสิ่งที่เกิดขึ้นที่นี่คือ:

  1. รายการWถูกสร้างขึ้นโดยใช้W=[*map(chr,range(65,91))]ซึ่งมีตัวอักษรตัวพิมพ์ใหญ่ทั้งหมดในตัวอักษรภาษาอังกฤษ ด้วยเหตุนี้จึงจำเป็นต้องป้อนข้อมูลตัวพิมพ์ใหญ่เสมอ

  2. สำหรับแต่ละ tuple, iในรายการซึ่งเราจะเรียกUที่มีทั้งหมดสาม tuples จดหมายติดต่อกันเช่น:

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

    ที่สร้างขึ้นโดยzip(W,W[1:],W[2:])แต่ละiจะมีการเพิ่มรายชื่ออย่างเต็มที่เพื่อส่งออกเป็นเวลานานเป็นองค์ประกอบทั้งหมดในรุ่นชุดi( {*i}) อยู่ในรุ่นชุดของการป้อนข้อมูลX( {*X}) คือ{*X}>={*i}คือXเป็นเซ็ตiของ มิฉะนั้นรุ่นว่างของi( ()) จะถูกเพิ่มเข้าไปในรายการ

  3. เมื่อ tuples ทั้งหมดได้ผ่านการแข่งขันที่เพิ่มเข้ามาอย่างสมบูรณ์แล้วรายการจะถูกส่งกลับเป็นเอาต์พุตสุดท้าย


2

สกาลา 59 ไบต์

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

Ungolfed:

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

คำอธิบาย:

(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

จริงแล้ว 13 ไบต์

ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

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 ไบต์

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

สิ่งนี้น่าจะเล่นกอล์ฟได้ แต่ความท้าทายนั้นรุนแรงกว่าที่ฉันคิดใน Java

กรณีที่ไม่ได้รับการทดสอบ &:

ลองที่นี่

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

เอาท์พุท:

cde 
fgh 
abc 
ghi hij ijk 
mno nop 



abc bcd cde def efg fgh ghi hij ijk jkl klm 

เพียงแค่ต้องถามว่าทำไม Java มันไม่ใช่ภาษาที่เล่นกอล์ฟได้มากที่สุด ... ? +1 สำหรับความพยายามแน่นอน ...
WallyWest

1
@WallyWest ดีฉันเป็นนักพัฒนา Java ในชีวิตประจำวัน และฉันรู้ว่าฉันจะไม่ชนะความท้าทายใด ๆ กับวิธีการใช้ Java verbose แต่ก็ยังสนุกกับ codegolf ใน Java imho :)
Kevin Cruijssen

1
คาดเดาไม่ได้ว่าจะเกิดอะไรขึ้นกับรหัสโฆษณาที่ท้าทายในอนาคตอันใกล้นี้เพื่อให้คุณได้มีส่วนร่วม :) งานที่ดี!
WallyWest

1

PowerShell v2 +, 93 ไบต์

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

รู้สึกนานกว่าที่ต้องการ แต่ฉันไม่สามารถเล่นกอล์ฟได้อีกต่อไป

$nจะเข้า ลูปจาก97เพื่อ120การสร้างที่อยู่ติดกันสตริงสามตัวอักษร - นั่นคือขึ้นอยู่กับ|?เราจะมีabc, bcd, cdeและอื่น ๆ บนท่อ จากนั้นจะถูกป้อนผ่านWhere-Object( |?) เพื่อดึงเฉพาะรายการเหล่านั้นที่ข้อเป็นจริง ที่นี่ข้อคือ 1) สตริงอินพุต$n, โยนเป็นchar-array, sorted และselect -unique'd, จากนั้น-joined กลับเข้าไปในสตริง, 2) -matched กับสตริงสามตัวอักษร (เช่นการจับคู่ regex) |?ถ้ามันการแข่งขันแล้วสตริงสามตัวอักษรที่อยู่ในคำและดังนั้นจึงกรองผ่าน ผลลัพธ์จะถูกทิ้งไว้บนไปป์ไลน์และเอาท์พุทเป็นนัย

ตัวอย่าง

(โปรดทราบว่าที่นี่ผลลัพธ์เป็นช่องว่างคั่นเนื่องจากเรา stringifying เอาท์พุทโดยเรียงต่อกัน)

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

คำอธิบายที่ดี ฉันจะให้คะแนนสองถ้าเป็นไปได้
WallyWest

1

เรติน่า, 106 56 ไบต์

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

คัดลอกซ้ำ abcเพิ่ม ค้นหาว่าพบสตริงย่อยและผนวกถ้าเป็นเช่นนั้น แปลเป็นสตริงย่อยถัดไป ทำซ้ำ จากนั้นลบสองบรรทัดแรก

ลองออนไลน์


โซลูชันไร้เดียงสา:

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

ซ้ำจัดเรียงแล้วส่งออกการจับคู่ที่ทับซ้อนกันของ 3 ตัวอักษรตามลำดับ

ลองออนไลน์


วิธีการแก้ปัญหาไร้เดียงสาดูค่อนข้างตรงไปตรงมา ... แม้ว่าฉันจะชอบสารละลายกอล์ฟของคุณดีกว่า ... ทำได้ดีมาก!
WallyWest

1

JavaScript (Firefox 48), 93 ไบต์

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]

สิ่งนี้ทำให้ตัวเองเป็นรุ่น ES6 96- ไบต์ :

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)

มันทำงานอย่างไร

อันสำคัญอันแรกของฟังก์ชั่นนี้คือ:

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

new Set(string)สร้างชุดวัตถุที่มีหนึ่งในตัวละครที่ไม่ซ้ำกันในสตริง ยกตัวอย่างเช่นจะกลับมาnew Set("foghorn") Set ["f", "o", "g", "h", "r", "n"]เราสามารถแปลงนี้ลงในอาร์เรย์ที่มีแล้วจัดเรียงด้วยในตัว[... ] .sort()ผลัดกันนี้เข้าไป"foghorn"["f", "g", "h", "n", "o", "r"]

ขั้นตอนต่อไปคือ:

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

นี่แมปตัวละครแต่ละตัวcในarray กับตัวละครที่เชื่อมต่อกับสองรายการหลังจากนั้น ตัวอย่างเช่น["f", "g", "h", "n", "o", "r"] => ["fgh", "ghn", "hno", "nor", "orundefined", "rundefinedundefined"]. ( undefinedปรากฏขึ้นเมื่อคุณพยายามเข้าถึงสมาชิกที่ไม่มีอยู่ของอาร์เรย์

ขั้นตอนสุดท้ายคือการกรอง:

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

ครั้งแรก!c[3]&คือการออกกฎสตริงใด ๆ undefinedที่มี สิ่งนี้จำเป็นเนื่องจากข้อบกพร่องทำให้อัลกอริทึมต่อไปนี้นับเช่นgmundefinedเป็น triplet ต่อเนื่อง

สตริงสามตัวที่ต่อเนื่องกันทั้งหมดเมื่อตีความว่าเป็นหมายเลข -36 เป็น 38 โมดูโล 1333 ฉันคิดออกโดยการคำนวณต่อไปนี้:

  • 012 (ฐาน 36) = 38
  • 123 (ฐาน 36) = 1371
  • 1371 - 38 = 1333
  • 1371 mod 1333 ≡ 38 mod 1333 ≡ 38

ดังนั้นถ้าสตริงสามอักขระคือ 38 mod 1333 ใน base-36 อักขระสามตัวจะต่อเนื่องกันในตัวอักษร

ตัวอย่างการทดสอบ


นี้ล้มเหลวสำหรับคำเช่นและgem mage
Neil

ดังนั้นคุณกำลังบอกว่าตัวอักษรสามตัวที่ต่อเนื่องกันทั้งหมดเมื่อถูกแปลงกลับมาจากฐานสิบหก (ฐาน 36) คือ 38 เมื่อตัวดัดแปลงเทียบกับ 1333 ... นั่นมันสุดยอดมาก!
WallyWest

@ คงที่ค่าใช้จ่ายหกไบต์
ETHproductions

ฉันจัดสรร!c[3]เคล็ดลับของคุณซึ่งทำให้คำตอบ ES6 ของฉันลงไปตามความยาวของคำตอบ ES6 ก่อนหน้าของคุณดังนั้นตอนนี้ฉันก็ยิ่งตอบ Firefox 30+ ขึ้นไป ขอโทษสำหรับเรื่องนั้น.
Neil

@ ไม่มีฉันไม่ทราบ :)
ETHproductions

1

แร็กเก็ต 237 ไบต์

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

การทดสอบ:

(f "education")

เอาท์พุท:

cde

รุ่นโดยละเอียด:

(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 ไบต์

each_cons(3)รับรายการย่อยที่ต่อเนื่องกันทั้งหมดที่มีความยาว 3 จากตัวอักษร?a..?zจากนั้นใช้e&s.chars==eเพื่อเลือกเฉพาะรายการที่มีอักขระทั้งหมดในสตริงเป้าหมายโดยใช้การแยก setwise ส่งคืนรายการของรายการ

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

ลองออนไลน์!


1

[R], 110 ไบต์

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

ฉันแน่ใจว่ามันยังเล่นได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.