อ่านคำไขว้


11

แรงบันดาลใจจากคำถามนี้เกี่ยวกับการบรรจุในรูปแบบนี้

บางครั้งฉันเห็นคำไขว้ที่สมบูรณ์และเป็นฉันฉันไม่สามารถทราบว่าคำตอบของปมคืออะไร

การป้อนข้อมูล:

  • สตริง 2D (รูปแบบใด ๆ , การขึ้นบรรทัดใหม่, รายการ 2d เป็นต้น)
  • สี่เหลี่ยมว่างจะแสดงด้วย(อักขระเว้นวรรค)
  • สี่เหลี่ยมจัตุรัสอื่น ๆ จะเป็นตัวอักษรพิมพ์เล็ก
  • คุณอาจคิดว่าอินพุตจะถูกเสริมด้วยช่องว่างเพื่อสร้างสี่เหลี่ยมผืนผ้า

เอาท์พุท:

  • พบคำแต่ละคำ
    • คุณต้องค้นหาคำตามและลง
    • คำจะมีความยาวอย่างน้อยสองตัวอักษร
    • หากมีคำที่ซ้ำกันคุณจะต้องส่งออกคำเหล่านั้นทุกครั้งที่ปรากฏ
  • คุณไม่ต้องทำการตรวจสอบใด ๆ
  • คำอาจถูกเอาท์พุทในลำดับใด ๆ
  • ไม่มีกฎการจัดรูปแบบที่เข้มงวด

กรณีทดสอบ:

word
e e 
step
t d 

word, step, west, reed
---
pies
 not
  no
wasp

pies, not, no, wasp, in, eons, stop
---
igloo
    n
word

igloo, word, on

คำตอบ:


8

Pyth - 11 10 8 7 ไบต์

บันทึกหนึ่งไบต์ด้วย @issacg

t#cjsCB

ลองมันออนไลน์ได้ที่นี่

t#               Filter by if len > 1
 c               Chop by whitespace by default
  j              Join by newlines
   sCB           Input, implicit and its transpose in one list

@ Maltysen ที่ยอดเยี่ยม
Leun Nun

1
Pyth ชนะ เหมือนเคย.
Leun Nun

1
คุณสามารถบันทึกหนึ่งไบต์โดยการลบdซึ่งทำให้jเข้าร่วมในการขึ้นบรรทัดใหม่ซึ่งยังคงสับโดยc ... )
isaacg

@isaacg เจ๋งจริงๆขอบคุณ
Maltysen

2

CJam, 14 ไบต์

{_z+S*S%{,(},}

บล็อกที่ไม่มีชื่อที่คาดว่าจะมีรายการของสตริง (เบาะ) ที่ด้านบนของสแต็กและออกจากรายการคำแทน

ทดสอบที่นี่

คำอธิบาย

_z    e# Duplicate and transpose the grid.
+     e# Append the transpose to the original grid.
S*    e# Join all lines by spaces to ensure that we don't get words 
      e# spanning multiple lines.
S%    e# Split around spaces, discarding empty segments.
{,(}, e# Filter: keep only those strings with length 2 or greater.


0

Pyth , 18 ไบต์

Lm:d"\S\S+"1byQyCQ

ลองออนไลน์!

ตัวอย่างอินพุต:

["pies"," not","  no","wasp"," t  "]

ตัวอย่างผลลัพธ์:

[['pies'], ['not'], ['no'], ['wasp'], []]
[[], ['in', 'at'], ['eons'], ['stop']]

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

Lm:d"\S\S+"1byQyCQ                                 The "1" here is mode
                    assign('Q',eval_input())       "1" which means show
                    @memoized                      all matches
L                   def y(b):                               v
 m:d"\S\S+"1b           return map(lambda d:regex(d,"\S\S+",1),b)
             yQ     imp_print(y(Q))
               yCQ  imp_print(y(transpose(Q)))

0

Haskell, 58 ไบต์

import Data.List
f x=[w|w@(_:_:_)<-words=<<x++transpose x]

ตัวอย่างการใช้งาน: ->f ["pies"," not"," no","wasp"]["pies", "not", "no", "wasp", "in", "eons", "stop"]

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


0

C ++ 14, 209 207 201 ไบต์

จำนวนไบต์ที่สูงขึ้นอย่างน่าขัน แต่ก็ดี เมทริกซ์แปลงสัญญาณ, สตริงการแยก ง่าย. แย่มากที่ไม่มีฟังก์ชันเนทีฟสำหรับการแปลง

[](vector<string>; m){auto t=m;int C=size(m[0]),j=0;for(;++j<C*C;)t[j%C][j/C]=m[j/C][j%C];for(j=0;++j<C+C;){stringstream Z(j<C?m[j]:t[j-C]);string s;while(getline(Z,s,' '))cout<<(size(s)>1?s+' ':"");}}

Ungolfed:

using S=vector<string>;
[](S m){
  S t=m;
  int C=size(m[0]),j=0;
  for(;j<C*C;++j)t[j%C][j/C]=m[j/C][j%C]; // Transpose
  for(j=0;j<C+C;++j){ // since rectangle matrix, we can iterate like so
    stringstream Z(j<C?m[j]:t[j-C]); // Get string from m or t
    string s;
    while(getline(Z,s,' '))
      cout<<(size(s)>1?s+' ':"");
  }
}

วิธีใช้งาน (โปรดทราบว่าคุณต้องบังคับใช้การเติมภายในตามคำถาม):

using S = vector<string>;[](S m) { ... }({"pies", " not", "  no", "wasp"});

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