คำนี้บนกระดานเกรงกลัวหรือไม่?


38

บทนำ

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

งานของคุณ

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

อินพุตจะอยู่ในรูปแบบของหก\nบรรทัด ห้าบรรทัดแรกจะประกอบด้วยบอร์ดเกรงกลัว 5x5 และแต่ละเส้นจะประกอบด้วยตัวพิมพ์ใหญ่ห้าตัว บรรทัดที่หกจะมีคำที่เป็นปัญหารวมอยู่ในตัวพิมพ์ใหญ่ทั้งหมด

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

AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER

เอาต์พุตสามารถเป็นอะไรก็ได้ที่บ่งบอกถึงความจริงหรือเท็จในภาษาการเขียนโปรแกรมที่คุณเลือกอย่างไม่น่าสงสัยและปฏิบัติตามอนุสัญญามาตรฐานที่เป็นศูนย์, ไม่มีค่า, และไม่มีความหมายที่ว่างเปล่า

ตัวอย่างเอาต์พุตสำหรับอินพุตด้านบน:

1

แนวทาง I / O

  • อินพุตอาจถูกอ่านจาก stdin และตอบเอาต์พุตไปยัง stdout

หรือ

  • อินพุตอาจเป็นอาร์กิวเมนต์สตริงเดี่ยวของฟังก์ชันและ answer เป็นค่าส่งคืนของฟังก์ชันนั้น

กฎเกรงกลัว

  • คำว่า 'บนกระดาน' หากคุณสามารถสร้างคำผ่านเส้นทางของแผ่นต่อเนื่องติดกันและไม่ซ้ำกันบนกระดาน
  • แผ่นกระเบื้องนั้นถูกพิจารณาว่าอยู่ติดกับแผ่นกระเบื้องทั้งแปดที่ล้อมรอบมัน แผ่นกระเบื้องที่ขอบของบอร์ดอยู่ติดกับห้าแผ่นเท่านั้น เรียงมุมที่ติดกับกระเบื้องเพียงสาม
  • ตัวอักษรต่อเนื่องในคำจะต้องอยู่ติดกันตัวอักษรในคำนั้นจะต้องอยู่ติดกับiตัวอักษรi-1th และi+1th
  • ตัวอักษรอาจปรากฏในคำมากกว่าหนึ่งครั้ง แต่คุณไม่สามารถใช้สี่เหลี่ยมเดียวกันบนกระดานเกรงกลัวมากกว่าหนึ่งครั้งต่อคำ
  • wordplay.netไซต์ boggle ออนไลน์อาจมีประโยชน์หากคุณไม่เคยเล่น boggle มาก่อน แต่ต้องการทำความเข้าใจกับกฎเหล่านี้

ซึ่งแตกต่างจากเกรงกลัวปกติ:

  • คุณไม่ต้องกังวลกับคำว่าเป็นคำภาษาอังกฤษที่ถูกต้อง
  • จะไม่มีไทQuล์เดี่ยว
  • คำที่สงสัยอาจมีความยาวเท่าใดก็ได้> 0

ตัวอย่าง

บนกระดานของ

AJNES
TNFTR
LSAIL
UDNEX
EQGMM

คำเหล่านี้ควรส่งคืนค่าจริง: ชะตากรรมวันที่ยืนแทนความคิด

คำเหล่านี้ควรกลับเท็จ: SADDEN, SULTANS, EXIST, SUEDE, QUEST

นี่คือความท้าทายของรหัส - กอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ!


คณะกรรมการห่อรอบ? ฉันจำไม่ได้
Claudiu

ไม่มันไม่ได้ห่อฉันปรับปรุงการชี้แจงเกี่ยวกับคำคุณศัพท์เพื่อสะท้อนถึงสิ่งนี้
turbulencetoo

เส้นทางสามารถข้ามตัวเอง (แนวทแยงมุม) ได้หรือไม่?
Martin Ender

@ m.buettner อ๋อ
turbulencetoo

การเกรงกลัวเป็นปกติคณะกรรมการ 4x4
mbomb007

คำตอบ:


11

GolfScript, 74 ตัวอักษร

:^n%5>)]){{^@==}+29,\,{{+}+1$/}%\;}/{:s$..&=[s{.@-\}*;]1567`{7&.~)}%-!&},,

อินพุตต้องถูกกำหนดบน STDIN พิมพ์จำนวนเส้นทางที่ถูกต้องบนกระดานเช่น0ไม่มีและจำนวนบวก (จริง) อื่น

คุณสามารถทดสอบตัวอย่างออนไลน์

รหัสที่มีความคิดเห็น:

:^              # assign the input to variable ^
n%              # split at newlines
5>              # truncate array such that [WORD] remains
)])             # prepares [[]] and WORD on the stack

# the following loop generates all possible paths (valid and invalid ones)
# by looking up all index combinations which yield the correct word
{               # loop over all characters
  {^@==}+29,\,  # get all indices of current character in the board
  {{+}+1$/}%\;  # append any index to all lists in the result set
}/              # end loop

# filter the results list for valid paths
{               # {...}, -> apply filter
  :s            # save path to variable s
  $..&=         # check if all numbers in path are unique
  [s{.@-\}*;]   # calculate differences along the path
  1567`{7&.~)}% # generate the array [1 -1 5 -5 6 -6 7 -7] of valid
                # differences
  -!            # check if all differences were valid
  &             # are both conditions fulfilled?
},              # end of filter block

,               # count the number of remaining paths

12

Javascript (E6) 137 160 175 190

Golfscript น้อยกว่า 2 * ชัยชนะทางศีลธรรม ...

F=a=>[...a].some((e,p,b)=>(Q=(p,n)=>p>29||b[p]!=b[n]||(b.r|=!b[++n])||(b[p]=b[n+~[1,5,6,7].map(q=>Q(p+q,n)|Q(p-q,n),b[p]=0)]))(p,30)&b.r)

แก้ไขการจัดระเบียบรหัส Golfed ครั้งแล้วครั้งเล่า

Ungolfedเวอร์ชั่นล่าสุดค่อนข้างยากที่จะติดตาม

F = a => 
  [...a] // input string to array, 30 chars of board then the target word
  .some ( // use some to scan the board, return true when found
      (e,p,b)=> // params to callback: element, position, complete array 
      (         // NB array b has no .r property, so use it for return value (it's undefined at start) 
        Q = (p,n) =>         // Scan function, p=position in board, n=nth char of target word
          p > 29 ||          // Chaek if going outside the board to the target word
          b[p] != b[n] ||    // if invalid char at current position, return
          (b.r |= !b[++n]) ||  // if at end of target, set r to 1 and return (also increment n )
          (                  // else... (NB next tree lines are coalesced in golfed code)
            b[p] = 0,        // remove current char (to avoid reusing) 
            [1,5,6,7].map( q => Q(p+q,n)|Q(p-q,n)), // recursive call for + - 1,5,6,7
            b[p] = b[n-1]    // put current char into array again 
          )
      )(p,30) & b.r // initial position 0 in target word is 30 in the array
  ) 

Ungolfed First version ควรมีความชัดเจนมากขึ้น

F = a => (
  b = a.split('\n'),
  w = b.pop(),
  r = 0,
  Q = (p, n) => 
    (r |= !w[n]) || 
    (
      b[p] = 0,
      [1,5,6,7,-1,-5,-6,-7].map( q => b[q+=p]==w[n] && Q(q,n+1)),
      b[p] = w[n-1]
    ),
  b = [...b+''],
  b.map((e, p) => e==w[0] && Q(p,1)),
  r
)

การใช้

F("AJNES\nTNFTR\nLSAIL\nUDNEX\nEQGMM\nLIFTS\nDAFTER")

ทดสอบ

['DAFTER', 'STANDS', 'LIFTS', 'FATE', 'DATING' ,
 'SADDEN','SULTANS', 'EXIST', 'SUEDE', 'QUEST']
.map(w => [w, F("AJNES\nTNFTR\nLSAIL\nUDNEX\nEQGMM\n" +w)])

เอาท์พุท:

[["DAFTER", true], ["STANDS", true], ["LIFTS", true], ["FATE", true], ["DATING", true], 
["SADDEN", false], ["SULTANS", false], ["EXIST", false], ["SUEDE", false], ["QUEST", false]]

1
การเพิ่มประสิทธิภาพเล็กน้อยบางส่วน:F=a=>(b=a.split('\n'),w=b.pop(Q=(p,n)=>((R|=!w[n])||(b[p]=0)||[1,5,6,7,-1,-5,-6,-7].map(q=>b[q+=p]==w[n]&&Q(q,n+1,b[q]=w[n])))),[Q(~~p,1)for(p in b=[...b.join(R=0)])if(b[p]==w[0])],R)
ขีด

มันควรจะเป็นw = a.pop()(กอล์ฟ) หรือw = b.pop()(ungolfed, บรรทัด 2) หรือไม่? (อาจจะหลังผมคิดว่า)
HLT

@ androyd ฉันทิ้งโค้ดที่ไม่อัปโหลดไว้เพื่อความกระจ่างแจ้งหลังจากจัดโครงสร้างใหม่ แต่ซิงค์ไม่ได้ 100% ฉันจะพยายามชี้แจง
edc65

ที่ไม่ดีที่ฉันไม่เห็นคุณเปลี่ยนไปa=a.pop()แทนb=a.pop()...
HLT

4

Python, 207 204 203

g=raw_input
r=range
b=''.join(g()for _ in r(5))
w=g()
s=lambda b,w,i:0<=i<25and(not w or(b[i]==w[0])*any(s(b[:i]+'_'+b[i+1:],w[1:],i+j+k*5-6)for j in r(3)for k in r(3)))
print any(s(b,w,i)for i in r(25))

การแทนที่... (b[i]==w[0])*any ...ด้วย... b[i]==w[0]and any ...ให้ประสิทธิภาพที่ดีกว่ามากในราคา 2 ตัวอักษร


1
คุณสามารถโกนช่องว่างเมื่ออยู่ระหว่างตัวเลขและคำสั่ง 0<=i<25and
seequ

3

J - 75 ตัวอักษร

Eugh อันนี้ดูน่ารังเกียจ และไม่แม้แต่จะผูกกับ Golfscript! นี่คือฟังก์ชั่นการใช้สตริงเป็นอาร์กิวเมนต์เพียงอย่างเดียว คุณสามารถใช้ตัวคั่นหนึ่งตัวใดก็ได้ตราบใดที่พบที่ท้ายบรรทัดแต่ละบรรทัดรวมถึงตัวสุดท้าย

+/@([:*/"1^:2(2(=*)@-/\>@~.)S:1)@{@(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)@(<;._2)

คำอธิบายดังนี้ โปรดทราบว่าฟังก์ชั่นสามารถแบ่งออกเป็น 5 ส่วนระดับบนสุดที่แตกต่างกันแต่ละแยกด้วย@ดังนั้นเราจะปฏิบัติต่อแต่ละส่วนเหล่านั้นแยกจากขวาไปซ้าย

  • (<;._2)- สิ่งนี้จะแยกบรรทัดบนอักขระขึ้นบรรทัดใหม่ / ตัวคั่น มันใช้ตัวละครที่ส่วนท้ายของสตริงเป็นตัวละครที่จะแยก เราใส่ทุกอย่างลงในกล่อง ( <) เพราะถ้าเราไม่ได้รับปัญหาการเติมเต็มเมื่อ J ให้ผลลัพธ์กลับมา

  • (((<@#:i.)5 5)<@#~&,"2{:=/&:>}:) - สำหรับแต่ละตัวอักษรในคำที่จะตรวจสอบสร้างรายการของดัชนีในกระดานเกรงกลัวที่หนึ่งสามารถค้นหาตัวอักษรที่

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

    • &:>เปิดกล่องที่เราทำไว้ก่อนหน้านี้ด้วยผลพลอยได้ที่มีประโยชน์จากการเปลี่ยน}:เป็นอาร์เรย์ของตัวละคร 2D =/จากนั้นสร้างสำเนาของบอร์ดเกรงกลัวนี้สำหรับตัวอักษรแต่ละตัวในคำและเปลี่ยนตำแหน่งเป็นบูลีนขึ้นอยู่กับว่าตัวอักษรในกระดานตรงกับตัวอักษรที่อยู่ในคำว่า

    • ((<@#:i.)5 5)เป็นวิธีสั้น ๆ ในการแสดงอาร์เรย์ 5x5 ของดัชนี x#:yจะถูกแปลงyเป็นอาร์เรย์ของการxแสดงฐาน (อืมเกือบความจริงนั้นซับซ้อนกว่า แต่มันใช้งานได้ตามวัตถุประสงค์ของเรา)

    • <@#~&,"2- สำหรับเมทริกซ์บูลีนที่ได้รับของจดหมายแต่ละฉบับให้รวบรวมดัชนีจริงที่สอดคล้องกันทั้งหมดเข้าด้วยกัน "2ทำให้ทุกอย่างทำงานบนผลลัพธ์ที่ถูกต้อง#~&,ทำการเลือกและ<@รวบรวมผลลัพธ์แต่ละรายการลงในกล่องเพื่อเตรียมพร้อมสำหรับขั้นตอนต่อไป

  • {- กริยานี้ใช้แบบ monadically เรียกว่า Catalog และรับรายการกล่องเป็นอาร์กิวเมนต์ มันรวมด้านในของแต่ละกล่องในทุกวิถีทาง ดังนั้นเช่นแคตตาล็อกในกล่องที่มีสตริง "AB" และ "abc" จะให้ผลลัพธ์ "Aa", "Ab", "Ac", "Ba", "Ba", "Bb", "Bc"

    การดำเนินการนี้กับรายการดัชนีที่บรรจุอยู่ในกล่องของเราจะทำให้การรวมกันของดัชนีเป็นไปได้ นี่อาจเป็นชุดใหญ่ถ้าคำนั้นยาวและมีตัวอักษรซ้ำหลายตัว แต่ก็ว่างเปล่าถ้าตัวอักษรใด ๆ ไม่ได้อยู่บนกระดาน นอกจากนี้เรายังทราบด้วยว่าเราจะนำไพ่มาใช้ใหม่ในบางเส้นทางเหล่านี้: เราจะดำเนินการในภายหลัง

  • ([:*/"1^:2(2(=*)@-/\>@~.)S:1) - ที่นี่เราตรวจสอบแต่ละเส้นทางเพื่อดูว่ามันถูกต้องหรือไม่

    • (...)S:1นำไปใช้(...)กับแต่ละพา ธ และรวบรวมผลลัพธ์ลงในรายการแฟล็ต สิ่งนี้มีความสำคัญเนื่องจากผลลัพธ์ของการ{เป็นอาร์เรย์หลายมิติและเราไม่สนใจเกี่ยวกับโครงสร้างของอาร์เรย์นั้นเพียงเนื้อหาในแต่ละกล่อง

    • 2(=*)@-/\>ให้ 1 ถ้าแต่ละพิกัดของแต่ละดัชนีอยู่ห่างจากที่อยู่ถัดจากมันมากที่สุดและ 0 เป็นอย่างอื่น 2และ/\มีความรับผิดชอบในการทำคู่นี้

    • */"1^:2ตรรกะ -and เหล่านี้ทั้งหมดเข้าด้วยกันในตอนท้าย ชิ้น[:ส่วนเป็นสิ่งโครงสร้างใน J ไม่ต้องกังวลกับมัน

    • การเพิ่ม@~.ลงใน>นั้นเป็นวิธีที่ชาญฉลาดในการยกเว้นเส้นทางที่มีรายการซ้ำ ~.เตะรายการที่ไม่ซ้ำของรายการเพื่อให้รายการจะสั้นลงถ้ามันตนเองปริภูมิ, และรายการสั้นได้รับเบาะโดยอัตโนมัติด้วย 0s S:เมื่อพวกเขากำลังใส่กันชอบวิธีที่ว่าผลที่จะรวมกันตามที่พวกเขาออกมาจาก ท้ายที่สุดนี้จะสั้นกว่าการแยกเส้นทางตัดเองอย่างชัดเจน

  • +/- ในที่สุดเราก็รวมทุกอย่างเข้าด้วยกันในตอนท้าย ผลลัพธ์คือจำนวนเส้นทางที่ถูกต้องที่ทำให้คำบนกระดานโดยที่ 0 หมายถึงไม่มีเส้นทางนั่นคือคำนี้ไม่ได้อยู่บนกระดาน สำหรับค่าใช้จ่ายของตัวละครตัวหนึ่งเราสามารถเขียน+./(ตรรกะ - ORing ทุกอย่างด้วยกัน) แทนซึ่งจะให้บูลีน 1 หรือ 0 อย่างชัดเจน

นี่คือตัวอย่างการรัน คุณจะได้รับล่าม J ที่jsoftware.comหรือลองออนไลน์ได้ที่tryj.tk

   NB. the  0 : 0 ... )  thing is how you do multiline strings in J
   +/@([:*/"1^:2(2(=*)@-/\>@~.)S:1)@{@(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)@(<;._2) 0 : 0
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER
)
1
   b =: +/@([:*/"1^:2(2(=*)@-/\>@~.)S:1)@{@(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)@(<;._2)
   b 'AJNES TNFTR LSAIL UDNEX EQGMM FATE '    NB. any separator will do
1
   b 'AJNES TNFTR LSAIL UDNEX EQGMM SADDEN '  NB. not on the board
0
   b 'AJNES TNFTR LSAIL UDNEX EQGMM SANDS '   NB. self-intersecting path
0
   b 'AJNES TNFTR LSAIL UDNEX EQGMM MEND '    NB. multiple paths
2

1
+1 สำหรับรายละเอียด ฉันต้องการคำตอบเพิ่มเติมเช่นนี้!
edc65

2

อารัมภบท - 315

r(L):-get_char(C),(C='\n',!,L=[];r(T),L=[C|T]).
b(0,[]):-!.
b(N,[R|T]):-M is N-1,r(R),b(M,T).
d(-1). d(0). d(1).
d([A,B],[C,D]):-d(X),C is A+X,d(Y),D is B+Y.
f([L|W],B,P,U):-P=[X,Y],nth(Y,B,R),nth(X,R,L),\+member(P,U),(W=[];d(P,Q),f(W,B,Q,[P|U])).
m:-b(5,B),r(W),f(W,B,_,[]),write(t);write(f).
:-initialization(m).

ฉันคิดว่าภาษาอารัมภบทอาจเป็นภาษาที่ดีสำหรับภาษานี้ด้วยการสนับสนุนการย้อนรอยในตัว แต่ฉันคิดว่ามันเป็นความพิการมากกว่าโดยต้องการตัวแปรสำหรับเกือบทุกค่าที่คำนวณ

ทดสอบกับ GNU Prolog; ควรสอดคล้องกับ ISO Prolog

Ungolfed:

get_line(Line) :-
    get_char(C),
    (   C='\n', !, Line=[]
    ;   get_line(Tail), Line=[C|Tail]
    ).

% The cut prevents recursion to help_get_board(-1, MoreRows)
% (and golfs one character shorter than putting N>0 in the second rule).
help_get_board(0, []) :- !.
help_get_board(N, [Row|Tail]) :-
    M is N-1, get_line(Row), help_get_board(M, Tail).

% The golfed version doesn't define an equivalent to get_board/1.
% help_get_board(5,Board) is used directly instead.
get_board(Board) :- help_get_board(5,Board).

small(-1). small(0). small(1).
step([X1,Y1],[X2,Y2]) :-
    small(DX), X2 is X1+DX,
    small(DY), Y2 is Y1+DY.

% The golfed version doesn't define an equivalent to letter_at/3.
% See find_word/4.
letter_at([X,Y], Letter, Board) :-
    nth(Y, Board, Row),
    nth(X, Row, Letter).

find_word([Letter|Word], Board, Pos1, Used) :-
%    letter_at(Pos1, Letter, Board),  % "inlined" to next three lines:
    ( Pos1 = [X,Y],
      nth(Y, Board, Row),
      nth(X, Row, Letter) ),
    \+member(Pos1, Used),
    (   Word=[]
    ;
        step(Pos1, Pos2),
        find_word(Word, Board, Pos2, [Pos1|Used])
    ).

main :-
    get_board(Board),
    get_line(Word),
    % Begin at any position. Initially no positions are "Used".
    find_word(Word, Board, _, []).
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.