มันเป็น wordinian หรือไม่?


20

เป็นวิธีที่สั้นที่สุดเพื่อดูว่าการป้อนข้อมูลเป็น wordinian โดยใช้ภาษาการเขียนโปรแกรมใด ๆ ?

Wordinian เป็นคำที่มีความยาว 1 ถึงความยาวของคำดั้งเดิม ตัวอย่างเช่น,

ถัง

'ฉัน' เป็นคำว่า
'ใน' เป็นคำว่า
'ถังขยะ' เป็นคำ

หรือ,

เวที

'a' เป็นคำว่า
'ta' เป็นคำ ( ใช่มันคือ )
'อายุ' คือคำว่า
'stag' เป็นคำว่า
'stage' เป็นคำ

อินพุต

รหัสของคุณควรใช้คำและพจนานุกรมเป็นอินพุตในรูปแบบที่เหมาะสม

เอาท์พุต

ผลลัพธ์ควรเป็นค่าที่บ่งบอกว่าเป็นจริงหรือเท็จเพื่อบอกเราว่าคำนั้นเป็นภาษา wordinian

สำหรับข้อมูลเพิ่มเติมเกี่ยว wordinians คลิกที่นี่

นี่คือรายการคำที่ฉันจะใช้เป็นอินพุตและ subwords นอกจากนี้เพื่อตอบสนองต่อ @xnor จะต้องมี subwords ของแต่ละความยาวไม่ใช่สายย่อยของ subwords โปรดทราบว่าจะใช้คำเดียวเป็นอินพุต


@FryAmTheEggman ฉันไม่สามารถวางพจนานุกรมทั้งหมดไว้ที่นี่ได้ เกิดอะไรขึ้นถ้ามันเป็นคำใด ๆ ที่มีอยู่?
Jacques Marais

6
ฉันขอแนะนำให้ส่งผ่านพจนานุกรมเป็นอินพุต ด้วยวิธีนี้มันง่ายที่จะเกิดขึ้นกับกรณีทดสอบ (ในขณะที่คุณสามารถสร้างพจนานุกรมเล็ก ๆ ของคุณเอง)
นาธานเมอร์ริลล์

2
มันจะต้องมี subwords ของแต่ละความยาวหรือพวกเขาจะต้องเป็นโซ่ที่แต่ละ subword เพิ่มตัวอักษรหนึ่งตัวไปยังก่อนหน้า?
xnor

@FryAmTheEggman ฉันได้แก้ไขคำถามของฉันเพื่อให้รายการคำทั้งหมด
Jacques Marais

1
@JacquesMarais แนวคิดคือการใช้คำและพจนานุกรมและคืนค่าจริงถ้าคำนั้นเป็น wordinian (ตามพจนานุกรม)
Nathan Merrill

คำตอบ:


4

Pyth, 20 16 15 13 11 ไบต์

ขอบคุณ Leaky Nun สำหรับการบันทึก 4 ไบต์! น่าเสียดายที่ฉันเปลี่ยนวิธีการทั้งหมดหลังจากนั้น แต่ก็ยังช่วยได้

gl{lM}#zQlz

คาดว่าการป้อนข้อมูลเป็นพจนานุกรมตามด้วยคำ เอาต์พุตจริงหรือเท็จ

ลองที่นี่!

คำอธิบาย:

        lz   Collects the length of the word  input
g             and compares it to:
 l             The length of the following:
     # Q        Select all words from the dictionary that
    } z         are contained within the input word.
  lM            Map them to their respective lengths, and
 {              then remove any duplicates.

สิ่งนี้จะไม่ทำงานหากสตริงที่ว่างเปล่า""เป็นคำที่ถูกต้อง


1
.Eสามารถแทนที่ด้วยs
Leun Nun

1
m}kHสามารถแทนที่ด้วย}RH
Leun Nun


11

Python ขนาด 52 ไบต์

lambda w,d:len({len(x)for x in d if x in w})==len(w)

ฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้คำและพจนานุกรมw dมันต้องใช้คำในdที่มีสตริงของทำให้ชุดของความยาวของพวกเขาและการตรวจสอบแล้วว่ามีความยาวแตกต่างกันมากที่สุดเท่าที่มีตัวอักษรในww


ฮึฉันแค่เขียนสิ่งเดียวกันแน่นอนยกเว้นฉันมี W แทน x และ [แทน { +1
Daniel

@Dopapp มันจะไม่ทำงานถ้าคุณใช้แทน[ เป็นชุดความเข้าใจ (เช่นเดียวกับ) {{...}set([...])
mbomb007

@ mbomb007 โอ้ขวาชุดจะต้อง
แดเนียล

@xnor ขออภัยในความไม่เลือกคำตอบนี้ แต่มันเป็นกอล์ฟรหัสผมต้องเลือกที่สั้นที่สุด ...
ฌาคส์ Marais

4

Python 3, 108 ไบต์

lambda w,d,r=range:all(any(i in d for i in j)for j in[[w[i:i+s]for i in r(len(w)+1-s)]for s in r(1,len(w))])

ฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้เวลาการป้อนข้อมูลผ่านอาร์กิวเมนต์ของคำwเป็นสตริงและพจนานุกรมdเป็นรายการของสตริงและผลตอบแทนหรือTrueFalse

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

ขั้นตอนแรกคือรายการความเข้าใจที่สร้างรายการของรายการของสตริงย่อยทั้งหมดwยกเว้นwจัดกลุ่มตามความยาว ตัวอย่างเช่นสำหรับ'stage'รายการ[['s', 't', 'a', 'g', 'e'], ['st', 'ta', 'ag', 'ge'], ['sta', 'tag', 'age'], ['stag', 'tage']]ถูกสร้างขึ้น นี้จะทำได้โดยการวนลูปมากกว่าทุกดัชนีเริ่มต้นที่ถูกต้องiสำหรับแต่ละระยะเวลาย่อยsและหั่นทุกย่อยมีความยาวโดยใช้s w[i:i+s]สำหรับแต่ละรายการในรายการนี้จะมีการตรวจสอบการมีอยู่ของสตริงย่อยแต่ละรายการในพจนานุกรม การโทรanyจะส่งคืนการเข้าชมหากพบอย่างน้อยหนึ่งการแข่งขันสำหรับระยะเวลาที่กำหนด ในที่สุดการโทรallจะตรวจสอบว่าพบการจับคู่สำหรับความยาวสตริงย่อยทั้งหมดหรือไม่และผลลัพธ์ของสิ่งนี้จะถูกส่งคืน

ลองใช้กับ Ideone


4

Ruby, 44 ไบต์

  • ปิด 7 ไบต์ด้วย @NotThatCharles และลูกเล่นการตั้งค่าของเขา!
  • ปิด 2 ไบต์ด้วย @Jordan พร้อมกับเคล็ดลับการใช้งานระบบนำทางปลอดภัยทับทิม 2.3 w[x]&.size:)
->w,d{[*1..w.size]-d.map{|x|w[x]&.size}==[]}

มันเป็นฟังก์ชั่นที่ไม่ระบุชื่อซึ่งจะนำคำwและพจนานุกรม d(อาร์เรย์ของคำ) สร้างสองอาร์เรย์: ตัวแรกประกอบด้วยตัวเลข 1 ถึงและรวมถึงความยาวของw; แถวที่สองคือdกับแต่ละคำแมปกับขนาดของพวกเขาหากพวกเขาเป็นย่อยของมิฉะนั้นw nilจากนั้นจะตั้งค่าการแทนที่เพื่อตรวจสอบว่าอาร์เรย์ที่สองมีองค์ประกอบทั้งหมดของอาร์เรย์แรกหรือไม่


1
ด้วย "ผู้ประกอบนำทางปลอดภัย" ในรูบี 2.3 คุณสามารถบันทึกไบต์คู่: แทนw[x]&.size==i x.size==i&&w[x]
จอร์แดน

โอ้ว้าวขอบคุณ @Jordan ไม่ทราบว่าน่ากลัว :)
daniero

1
คุณสามารถบันทึกอีกสองสามไบต์ในฟังก์ชั่นนิรนามของคุณ (และอาจเป็นโปรแกรมเต็มรูปแบบ) โดยการวางuniqและ-[p]และใช้การลบชุดแทน:[*1..w.size]-d.map{...}==[]
ไม่ใช่ Charles

@NotthatCharles ยอดเยี่ยมมาก! ขอบคุณ :)
daniero

3

PowerShell v3 + v2 +, 127 110 70 65 ไบต์

param($a,$d)($d|?{$a-match$_}|select length -U).count-eq$a.length

(ฉันเห็นแล้วว่าวิธีการของฉันคล้ายกับ @ xnor แม้ว่าฉันจะพัฒนามันเอง)

ใช้คำที่ป้อนเข้า$aและพจนานุกรม$dโดยคาดว่าจะ$dเป็นอาร์เรย์ (ดูตัวอย่างด้านล่าง) วนซ้ำทั้งหมด$dและดำเนินการWhere-Objectเพื่อดึงรายการที่คำปัจจุบัน$_คือ regex -matchกับคำที่ป้อน$a (กล่าวคือเป็นคำปัจจุบันที่เป็นสตริงย่อยของคำที่ป้อน)

เรารวบรวมคำย่อยทั้งหมดเหล่านั้นและไพพ์ไปSelect-Objectที่lengthพารามิเตอร์และ-Uข้อ จำกัด เฉพาะ ที่จะดึงความยาวที่ไม่ซ้ำกันของแต่ละสตริงย่อย ตัวอย่างเช่นสำหรับคำอินพุตcombนี่จะเป็นอาร์เรย์ของ(4,2)สำหรับ('comb','om')สำหรับ

เราใช้เวลาที่อาร์เรย์ผลและเปรียบเทียบกับคำของการป้อนข้อมูล.count .lengthหากเท่ากับนั่นหมายความว่าทุกความยาวซับสตริงอยู่ในพจนานุกรมดังนั้น$TRUEมิฉะนั้นเราจะพลาดอย่างน้อยหนึ่งความ$FALSEยาว ค่าบูลีนนั้นถูกทิ้งไว้บนไพพ์ไลน์

NB - สิ่งนี้ควรทำงานใน v2 + เนื่องจาก-inไม่มีตัวดำเนินการอีกต่อไป แต่ฉันไม่ได้ทดสอบเวอร์ชันนั้น

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\is-it-a-wordinian.ps1 'stage' (gc .\words.txt)
True

PS C:\Tools\Scripts\golfing> .\is-it-a-wordinian.ps1 'metal' (gc .\words.txt)
True

PS C:\Tools\Scripts\golfing> .\is-it-a-wordinian.ps1 'comb' (gc .\words.txt)
False

2

Perl, 86 ไบต์

ต้อง-Eไม่มีค่าใช้จ่ายเพิ่มเติม

chop(($s,@d)=<>);for$=(1..($x=length$s)){$-+=!!grep$s=~/$_/,grep$===y///c,@d}say$-==$x

ยอมรับอินพุตทั้งหมดผ่าน STDIN อินพุตแรกคือคำเป้าหมายส่วนที่เหลือคือพจนานุกรม พิมพ์1เมื่อสำเร็จสตริงว่างเปล่าเมื่อล้มเหลว

การใช้

perl -E 'chomp(($s,@d)=<>);for$=(1..($x=length$s)){$-+=!!grep$s=~/$_/,grep$===y///c,@d}say$-==$x' <<< 'stage
a
ta
age
stag
stage'
1
perl -E 'chomp(($s,@d)=<>);for$=(1..($x=length$s)){$-+=!!grep$s=~/$_/,grep$===y///c,@d}say$-==$x' <<< 'stage
a
at
age
stag
stage'

perl -E 'chomp(($s,@d)=<>);for$=(1..($x=length$s)){$-+=!!grep$s=~/$_/,grep$===y///c,@d}say$-==$x' <<< 'bin
i
in
bin'
1

2

Mathematica, 90 ไบต์

Sort[MemberQ[DictionaryWordQ/@StringPartition[#,t,1],True]~Table~{t,StringLength@#}][[1]]&

ใช้Mathematica ของDictionaryWordQ builtin

การป้อนข้อมูลdด้วยพจนานุกรมจะสั้นกว่า 5 ไบต์ แต่ช้ากว่ามากสำหรับรายการแบบยาว:

m=MemberQ;Sort[m[d~m~#&/@StringPartition[#,t,1],True]~Table~{t,StringLength@#}][[1]]&

2

MATL , 15 ไบต์

1 ไบต์บันทึกไว้โดยใช้ความคิดจากคำตอบของ @ XNOR

XXgc32>!suz1Gn=

เอาท์พุท1หรือ0เพื่อความจริงหรือเท็จ

ลองออนไลน์!

XX      % Take the two inputs implicitly. Apply the second as a regex into the
        % first. Since the second input is a cell array, each of its contents is
        % applied separately as a regex. So for each dictionary word ("sub-word") 
        % this outputs the sub-word if found in the original word, or else an 
        % empty array. Gives a cell array of cells of strings
g       % Remove one level of nestedness
c       % Convert to char. This concatenates all found sub-words as rows of a 2D 
        % char array, padding with spaces as needed
32>!s   % For each row, count how many non-space characters there are. This is 
        % the length of each sub-word
uz      % Number of distinct non-zero elements
1Gn     % Push length of the original word
=       % Are they equal? Implicitly display

1

Perl, 42 41 ไบต์

รวมถึง +2 สำหรับ -p0

ให้คำตามด้วยพจนานุกรมบน STDIN:

(echo stage; cat dictionary.txt) | ./wordinian.pl

(เมื่อทำการทดสอบกับยูนิกซ์ตรวจสอบให้แน่ใจว่า dictionary.txt ใช้\nเป็นตัวยุติบรรทัดไม่ใช่\r\n)

wordinian.pl:

#!/usr/bin/perl -p0
s%\G.%!/^.*(.{$+[0]})\H*
\1
/%eg;$_=!//

1

JavaScript (Firefox 30-57), 68 ไบต์

(w,a)=>new Set((for(x of a)if(~w.search(x))x.length)).size==w.length

การใช้เครื่องกำเนิดไฟฟ้าเข้าใจเพื่อหลีกเลี่ยงการสร้างอาร์เรย์กลาง รุ่น 73 byte ES6:

(w,a)=>new Set(a.filter(x=>~w.search(x)).map(x=>x.length)).size==w.length

1

05AB1E , 8 ไบต์

ŒÃ€gZLåP

Word เป็นอินพุตแรกพจนานุกรมรายการเป็นอินพุตที่สอง

ลองออนไลน์หรือตรวจสอบกรณีทดสอบอีกสองสามข้อ

คำอธิบาย:

Œ         # Get all possible substrings of the (implicit) input-string
 Ã        # Only keep the ones which are also in the (implicit) dictionary-list
  g      # Get the length of each remaining string
    Z     # Push the maximum length (without popping the list)
     L    # Pop and push a list in the range [1, maximum-length]
      å   # Check for each value if it's in the list of lengths
       P  # And check if this is truthy for all
          # (then output the result implicitly as result)


0

SQF , 147 ไบต์

การใช้รูปแบบฟังก์ชั่นเป็นไฟล์:

params["w","d"];a=[];c=count w;for"i"from 1 to c do{a=a+[""];for"j"from 0 to c-i do{q=w select[j,i];if(q in d)then{a set[i-1,q]}}};c==count(a-[""])

โทรเป็น: ["WORD", DICTIONARY] call NAME_OF_COMPILED_FUNCTION

Ungolfed:

//name parameters
params["w", "d"];
a = []; c = count w;
//for each length of subword
for "i" from 1 to c do {
    //add entry to the `a`
    a = a + [""];
    //for each starting position for that length
    for "j" from 0 to c - i do {
        //get subword
        q = w select [j, i];
        //check if in dictionary
        if(q in d) then {
            //set the entry to the wubword
            a set [i - 1, q]
        }
    }
};
//check if length of word is equal to number of subwords
c == count (a - [""])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.