ค้นหาคำที่หมุนวน!


41

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

หมุนของ Wordสามารถ:

  1. ตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา
  2. ศูนย์กลางหรือแรงเหวี่ยง

นี่คือตัวอย่างบางส่วนของคำที่หมุนวน :

แผนภาพคำหมุนวน

ภารกิจที่ 1:

เขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่จะใช้คำหนึ่งคำจากอินพุตมาตรฐานและจะแสดงผลหากเป็นSwirling Wordและคุณลักษณะของมันในรูปแบบที่อ่านได้ข้อความที่ขยายขยายตัวอักษร 3 ตัวธง ฯลฯ

กรณีทดสอบและตัวอย่างผลลัพธ์สำหรับคำต่าง ๆ (แต่คุณสามารถตัดสินใจว่าจะแสดงผลลัพธ์อย่างไร):

EARTH, GROUP            > NO        // NOT A SWIRLING WORD
OPERA, STAY, IRIS       > SW,CF,CW  // SWIRLING WORD, CENTRIFUGAL, CLOCKWISE
MINER, TAX, PLUG, META  > SW,CF,CC  // SWIRLING WORD, CENTRIFUGAL, COUNTERCLOCKWISE
AXIOM, AXIS, COOK       > SW,CP,CW  // SWIRLING WORD, CENTRIPETAL, CLOCKWISE
WATCH, YETI, PILL       > SW,CP,CC  // SWIRLING WORD, CENTRIPETAL, COUNTERCLOCKWISE

MORE EXAMPLES OF FALSE TEST CASES (NOT SWIRLING WORDS): 
EARTH, GROUP, OUTPUT, WORD, CONNECTION, ODD, MOM, DAD, 
CHARACTER, EXAMPLE, QUESTION, NEWSLETTER, OTHER

กฎ:

  1. การเชื่อมต่อระหว่างตัวละครทั้งสองครั้งแรกจะต้องขึ้น (เหมือนในกราฟิก) ทุกการเชื่อมต่อแม้จะต้องลงทุกการเชื่อมต่อคี่จะต้องขึ้น
  2. คุณสามารถละเว้นตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กหรือพิจารณา / แปลงทั้งหมดเป็นตัวพิมพ์ใหญ่หรือทั้งหมดเป็นตัวพิมพ์เล็ก
  3. คำที่ป้อนเป็นตัวอักษรในช่วงตัวอักษรของ AZ ไม่มีช่องว่างไม่มีเครื่องหมายวรรคตอนและอื่น ๆ
  4. หากคำมีตัวอักษรซ้อนเช่น "GROOVE" คุณจะต้องยุบคู่ผสมเป็นหนึ่งอักขระ: "GROOVE"> "GROVE"
  5. คำที่ป้อนจะมีอักขระที่แตกต่างกันอย่างน้อย 3 ตัว คำเช่น "MOM", "DAD", "LOL" ไม่ใช่คำที่ถูกต้อง
  6. เป็นไปได้ที่จะผ่านหลาย ๆ ครั้งในตัวละครเดียวกันเช่น "IRIS"
  7. รหัสที่สั้นที่สุดชนะ

ภารกิจที่ 2:

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

การเข้ารหัสที่มีความสุข!


15
ไดอะแกรมที่ดี! :) (และเป็นความท้าทายที่ดีเช่นกัน.))
Martin Ender

การละเว้น "Swirling" เป็นรูปแบบเอาต์พุตที่ถูกต้องหรือไม่เนื่องจากเป็นการบอกเป็นนัยเมื่ออินพุตไม่ใช่ "ไม่หมุน"
Martin Ender

@MartinEnder ใช่เพราะมันเป็นที่เข้าใจเมื่อมันหมุนหรือไม่สามารถว่างสำหรับ "ไม่ใช่" และ "1" สำหรับ "ใช่" ฯลฯ (ดีใจที่คุณชอบไดอะแกรมและความท้าทาย! :))
Mario

1
@ TimmyD แต่ไม่ใช่ทุกคำที่เป็นหลุมเป็นบ่อ :)
Martin Ender

2
@ ลินน์ขอบคุณสำหรับคำขอบคุณและคำแนะนำฉันจะพยายามปรับปรุงเพื่ออนาคต ฉันเพิ่มกฎ "ลบสองครั้ง" เพื่อคาดหวังให้ผู้คนถามฉันในลักษณะเช่น "เราจะทำอย่างไรเมื่อมีคู่ผสม" > คุณสามารถพิจารณาเป็นสองเท่าของตัวละครเดี่ยวได้เพราะจาก "L" ถึง "L" คือระยะทางศูนย์ :) ไม่ใช่ว่าฉันต้องการที่จะเพิ่มความยากลำบากให้กับตัวเอง
มาริโอ

คำตอบ:


11

MATL , 33 31 30 ไบต์

lydhg)dt|dZSXz&=wZSdh?4M1)3M1)

อินพุตเป็นตัวอักษรตัวพิมพ์ใหญ่ (หรือเป็นตัวอักษรตัวพิมพ์เล็ก แต่ไม่ผสมกัน)

ผลลัพธ์คือ:

  • หากคำนั้นไม่หมุน: จะไม่มีการสร้างเอาต์พุต
  • ถ้ามันหมุน: ตัวเลขสองจำนวนถูกสร้างในบรรทัดที่ต่างกัน:
    • หมายเลขแรก1/ -1 บ่งชี้แรงเหวี่ยง / centripetal
    • ตัวเลขตัวที่สอง1/ `-1 'หมายถึงทวนเข็มนาฬิกา / ทวนเข็มนาฬิกา

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด (แก้ไขรหัสเพื่อรับอินพุตทั้งหมดและสร้างหมายเลขเอาต์พุตสองหมายเลขในบรรทัดเดียวกัน)

คำอธิบาย

ลองทำ'OPERAA'ตัวอย่างเป็นตัวอย่าง

ส่วนแรกของรหัสจะลบตัวอักษรคู่:

l     % Push 1
      %   STACK: 1
y     % Take input implicitly from below, and duplicate
      %   STACK: 'OPERAA', 1, 'OPERAA'
d     % Convert to code points and compute differences
      %   STACK: 'OPERAA', 1, [1 -11  13 -17 0]
h     % Concatenate horizontally
      %   STACK: 'OPERAA', [1 1 -11  13 -17 0]
g     % Convert to logical
      %   STACK: 'OPERAA', [true true true true true false]
)     % Index
      %   STACK: 'OPERA'

ตอนนี้เราตรวจสอบว่าระยะห่างระหว่างตัวอักษรไม่ลดลงหรือไม่ (เงื่อนไขที่จำเป็นสำหรับคำที่จะหมุน):

d     % Convert to code points and compute differences
      %   STACK: [1 -11  13 -17]
t|    % Duplicate and take absolute value
      %   STACK: [1 -11  13 -17], [1 11  13 17]
d     % Differences
      %   STACK: [1 -11  13 -17], [10 2 4]
ZS    % Signum
      %   STACK: [1 -11  13 -17], [1 1 1]
Xz    % Remove zeros (gives a vertical vector). Needed for words like 'IRIS',
      % where some consecutive distances are equal
      %   STACK: [1 -11  13 -17], [1; 1; 1]
&=    % All pairwise equality comparisons. Gives a matrix. If all the signs 
      % were equal the matrix will contain all ones
      %   STACK: [1 -11  13 -17], [1 1 1; 1 1 1; 1 1 1]

จากนั้นเราตรวจสอบว่าตัวอักษรไปมาหรือไม่ (นี่เป็นเงื่อนไขอื่น ๆ สำหรับคำที่จะหมุน):

w     % Swap
      %   STACK: [1 1 1; 1 1 1; 1 1 1], [1 -11  13 -17]
ZS    % Signum
      %   STACK: [1 1 1; 1 1 1; 1 1 1], [1 -1 1 -1]
d     % Differences
      %   STACK: [1 1 1; 1 1 1; 1 1 1], [-2 2 -2]

สุดท้ายเราตรวจสอบว่าทั้งสองเงื่อนไขมีอยู่หรือไม่และในกรณีนั้นให้สร้างผลลัพธ์:

h     % Concatenate horizontally
      %   STACK: [1 1 1 1 1 1 1 1 1 -2 2 -2]
?     % If all elements are nonzero
  4M  %   Push first signum array without zeros, from the automatic clipboard
      %     STACK: [1; 1; 1]
  1)  %   Get first element (tells if first difference was positive or negative)
      %     STACK: 1
  3M  %   Push second signum array, from the automatic clipboard
      %     STACK: 1, [1 -1 1 -1]
  1)  %   Get first element (tells if first movement was right or left)
      %     STACK: 1, 1
      %   Implicitly end if
      % Implicitly display

6

Mathematica, 117 111 ไบต์

ขอบคุณ JHM สำหรับการบันทึก 6 ไบต์และทำให้ตัวพิมพ์เล็กและตัวพิมพ์เล็กไม่ต้องบู๊ต!

 {o=OrderedQ/@{a=Abs[d=Differences[#&@@@Split@LetterNumber@#]],Reverse@a},d[[1]]>0,Or@@o&&Max[Most[d]Rest@d]<0}&

{{B1,B2},B3,B4}ฟังก์ชั่นที่ไม่มีชื่อที่ใช้เวลาสตริงและส่งกลับรายการที่ซ้อนกันของบูลีนในรูปแบบ B4 บันทึกว่าคำนั้นหมุนหรือไม่ (และหากไม่ใช่คำสั่งที่เหลือก็คือขยะ) ถ้าคำนั้นหมุนดังนั้น B1 จะบันทึกว่าคำนั้นเป็นแรงเหวี่ยงหรือไม่ B2 จะบันทึกว่าคำนั้นเป็นศูนย์กลางและ B3 บันทึกว่าคำนั้นตามเข็มนาฬิกา (จริง) หรือทวนเข็มนาฬิกา (เท็จ)

และนี่ก็เป็นอีกรุ่นที่โพสต์กระบวนการ (บรรทัดแรก) ฟังก์ชั่นข้างต้น (ระยะห่างมากกว่าสาย 2-5) ที่จะให้มันเหมือนกันกับสหกรณ์: NOถ้าเป็นคำที่ไม่หมุนและเลือกที่เหมาะสมของ{SW,CF,CW}, {SW,CF,CC}, {SW,CP,CW}หรือ{SW,CP,CC}ถ้า คำว่าหมุนวน:

If[#3, {SW, If[#[[1]], CF, CP], If[#2, CW, CC]}, NO] & @@
  {o = OrderedQ /@
    {a = Abs[d = Differences[# & @@@ Split@LetterNumber@#]], Reverse@a},
  d[[1]] > 0,
  Or @@ o && Max[Most[d] Rest@d] < 0} &

คำอธิบายนั้นเหมือนกับคำตอบ CJam ของ Martin Ender โดยมีหมายเหตุเพิ่มเติมอีกหนึ่งรายการ: รายการความแตกต่างติดต่อกันจะต้องสลับกันเพื่อลงชื่อคำว่าจะหมุนวนและสามารถตรวจจับได้โดยทำให้แน่ใจว่าผลิตภัณฑ์ทั้งหมดของคู่ที่ต่อเนื่องกันเป็นลบ (นั่นคือสิ่งที่Max[Most[d]Rest@d]<0ทำ)

การใช้งานฟังก์ชั่นของคำศัพท์กว่า 40,000 คำของ Mathematica WordList[]เราจะพบคำที่หมุนวน 8 ตัวอักษรต่อไปนี้ซึ่งเป็นคำที่ยาวที่สุดในประเภทการหมุนวนของพวกมัน:

operetta    {SW, CF, CW}
opposite    {SW, CF, CW}
stowaway    {SW, CF, CW}
assassin    {SW, CP, CW}
assessor    {SW, CP, CW}
baccarat    {SW, CF, CC}
keenness    {SW, CF, CC}
positive    {SW, CF, CC}

(บราวนี่ชี้ไปpositiveที่ไม่มีตัวอักษรสองตัวและตัวอักษรซ้ำซ้อนน้อยกว่าstowaway)

แต่แชมป์เปี้ยนแน่นอนคือคำศัพท์ศูนย์กลางทวนเข็มหมุนทวนเข็มนาฬิกา 9 ตัวอักษรvassalage!


1
คุณสามารถบันทึก 3 ไบต์โดยใช้LetterNumberแทนToCharacterCodeและอีก 3 ไบต์โดยใช้แทนMost[d] Drop[d,-1]
JungHwan Min

5

สกาลา, 110 ไบต์

def/(s:String)={val ? =s.sliding(2).map(t=>(t(0)-t(1)).abs).toSeq
(Seq(?,?reverse)indexOf(?sorted),s(0)<s(1))}

ส่งคืน tuple (a,b)ด้วย

  • a == 1 ถ้า s เป็นศูนย์กลาง
  • a == 0 ถ้า s เป็นแรงเหวี่ยง
  • a == -1 ถ้า s ไม่หมุน

และ

  • b == true ถ้า s ตามเข็มนาฬิกา
  • b == false ถ้า s คือทวนเข็มนาฬิกา
  • b สามารถเป็นจริงหรือเท็จหาก s ไม่หมุน

คำอธิบาย:

def/(s:String)={      //define a method called / with a String argument
  val ? =s            //define ? as...
    .sliding(2)       //an iterator for each two consecutive elements
    .map(t=>          //foreach 2 chars
      (t(0)-t(1)).abs //get the absolute value of their difference
    ) 
    .toSeq            //and convert the iterator to a Seq, because iterator doesn't have reverse and sorted methods
  (                   //return a tuple of
    Seq(?,?reverse)     //a Seq of ? and reversed ?
    .indexOf(?sorted)   //and check which of them is sorted ?
  ,                   //and
   s(0)< s(1)          //the difference bewteen the first two elements of the string.
  )
}

5

เยลลี่ 30 ไบต์

3Ŀḟ0ṠE
ÑṠḟ0Ṃ
ÑAI
OIḟ0
ÇṠḢ;2Ŀ;Ñ

TryItOnline
หรือดูกรณีทดสอบ (มีการเปลี่ยนแปลงเล็กน้อยเนื่องจากไฟล์ล่าสุดÑจะชี้ไปที่ลิงก์หลักใหม่)

(การขาดทักษะการผูกมัดของฉันน่าจะมีค่าใช้จ่ายไม่กี่ไบต์ที่นี่)
ทั้งหมดหรือต่ำกว่าทั้งหมด
ส่งกลับรายการธง [D, F, S]:
S: Spinning = 1 / ไม่หมุน = 0
F: centrifugal = 1 (Circular = 0) centripetal = -1
D: clockwise = 1 / anticlockwise = -1
- ถ้า S = 0 แฟล็กอื่น ๆ ยังคงถูกประเมินแม้ว่าจะไม่มีข้อมูลที่เป็นประโยชน์ก็ตาม

อย่างไร?

3Ŀḟ0ṠE      - Link 1, isSpinning: s
3Ŀ          - call link 3 as a monad with s
  ḟ0        - filter out zeros
    Ṡ       - sign
     E      - all equal?

ÑṠḟ0Ṃ       - Link 2, centrifugal(-1), circular(0) or centripetal(1): s
Ñ           - call next link (3) as a monad with s
 Ṡ          - sign (+1 for positive changes, -1 for negative changes, 0 for no change)
  ḟ0        - filter out zeros (ignore these for cases like "IRIS")
    Ṃ       - minimum (will be the only value for spinning words)
            -    (circular words like "DAD", now excluded, yield min([])=0)

ÑAI         - Link 3, absolute change of moves over alphabet: s
Ñ           - call next link (4) as a monad with s
 A          - absolute
  I         - differences

OIḟ0        - Link 4, non-zero moves over alphabet: s
O           - ordinal cast
 I          - differences
  ḟ0        - filter out zeros

ÇṠḢ;2Ŀ;Ñ    - Main link: s
Ç           - call last link (4) as a monad with s
 Ṡ          - sign
  Ḣ         - head (clockwise / anticlockwise: 1 / -1)
   ;  ;     - concatenate
    2Ŀ      - call link (2) as a monad with s
       Ñ    - call next link (1) as a monad with s

1
ฉันคิดว่าคุณกำลังประสบกับสิ่งที่ฉันเรียกว่า "ซินโดรมมือใหม่" ที่นี่ ฉันรู้สึกเหมือนกับคุณ บางทีเดนนิสอาจช่วยได้ที่นี่ แต่ฉัน +1 เพราะฉันเห็นว่าเป็นไปได้ในเจลลี่ นอกจากนี้คุณยังสามารถลบตัวเรือนกลมออกได้; มันไม่มีอยู่แล้ว
Erik the Outgolfer

ขอบคุณสำหรับการกระตุ้นเกี่ยวกับคำวงกลม - มันปรากฏออกมา 6 ไบต์เพื่อรองรับพวกเขาจริง ๆ แล้วก็ไม่จำเป็นเพราะรายการต่ำสุดว่างเปล่า0ดังนั้นมันจึงใช้ได้สำหรับคนเหล่านั้นเช่นกัน!
Jonathan Allan

ดังนั้นมันจะต้องใช้งานได้สำหรับพวกเขา? ฉันเห็นว่าคุณยังมีcircular(0)คำอธิบายอยู่ข้างในบางทีอาจถึงเวลาที่จะลบออกเช่นกัน
Erik the Outgolfer

ไม่จำเป็นไม่ต้อง - แต่รหัสนี้ยังคงทำอยู่หลังจากลบสิ่งที่ฉันใช้ในการทำอย่างชัดเจนเนื่องจากmin([])=0 jelly.tryitonline.net/#code=W13huYI&input= - เนื่องจากความจริงที่ว่าjelly.tryitonline.net/#code=W13huYI&input= - ข้อมูลป้อนเข้าที่คาดไว้ไม่มีปัญหาในการจัดเลี้ยงสำหรับพวกเขา
Jonathan Allan

ฉันแค่ขอให้คุณตรวจสอบอีกครั้ง และฉันเข้าใจว่าคุณหมายถึงmin([])==0แต่ฉันคิดว่านี่ยังคงสามารถเล่นกอล์ฟได้
Erik the Outgolfer

3

CJam , 39 ไบต์

r{2ew::-V}:D~-_:g_0=\D#)!@:zD-:g_0=\(-!

ลองออนไลน์!

อินพุตอาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก แต่ไม่ผสมกัน

โปรแกรมจะชี้ให้เห็นคำที่ไม่จำเป็นต้องใช้แรงเหวี่ยงหรือศูนย์กลาง แต่อย่างอื่นตอบสนองความต้องการของการเป็นเกลียว สิ่งเหล่านี้อธิบายว่า "วงกลม" ในแผนภูมิด้านล่าง

ในการตีความผลลัพธ์ให้ใช้แผนภูมินี้:

SPIRAL (output contains four 1s)
-11-11 : Clockwise Centrifugal
-1111  : Clockwise Centripetal
11-11  : Counter-clockwise Centrifugal
1111   : Counter-clockwise Centripetal

CIRCULAR (output contains two 1s)
-11    : Clockwise Circular
11     : Counter-clockwise Circular

NONSPIRAL (output contains a 0)


คำอธิบาย:

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

r{2ew::-V}:D~-   e# take difference of overlapping pairs, removing 0s handles duplicates
               ede# store difference function plus 0 as D, it's multipurpose
_:g_0=\          e# compute signs differences, keep first to show starting direction
               ede# -1 = CLOCKWISE, 1 = COUNTERCLOCKWISE
D#)!@            e# difference of signs includes 0 if not alternating, keep in stack
               ede# 1 = ALTERNATING, 0 = NOT ALTERNATING
:zD-:g           e# signs of difference of absolute values, ignoring 0s (fixed magnitude)
_0=\             e# keep first sign in stack to indicate how the sequence starts
               ede# -1 = INCREASING, 1 = DECREASING
(-!              e# remove first item from entire list and see if nothing remains
               ede# 1 = EMPTY(MONOTONE), 0 = NONEMPTY

3

PHP, 322 ไบต์

for(;++$i<strlen($z=preg_replace("#(.)\\1#","$1",$argv[1]));){$t[]=$z[$i-1]<=>$z[$i]?:0;$o[]=$z[0]<=>$z[$i];$i<2?:$k[]=$z[$i-2]<=>$z[$i];}$s=preg_match("#^1?(-11)*(-1)?$#",join($t))?($t[0]!=1?1:2):0;$s+=2*preg_match($r="#^(-1|0)?([01](-1|0))*[01]?$#",join($o));$s*=preg_match($r,join($k));count_chars($z,3)[2]?:$s=0;echo$s;

เพื่อผลลัพธ์ที่สวยงามยิ่งขึ้น echo["n","+P","-P","+F","-F"][$s];

รุ่นขยาย

for(;++$i<strlen($z=preg_replace("#(.)\\1#","$1",$argv[1]));){
    $t[]=$z[$i-1]<=>$z[$i]?:0;
    $o[]=$z[0]<=>$z[$i];
    $i<2?:$k[]=$z[$i-2]<=>$z[$i];
    }
$s=preg_match("#^1?(-11)*(-1)?$#",join($t))?($t[0]!=1?1:2):0; #Clockwise direction or not
$s+=2*preg_match($r="#^(-1|0)?([01](-1|0))*[01]?$#",join($o)); # True centrifugal
$s*=preg_match($r,join($k)); #true or false second test for not
count_chars($z,3)[2]?:$s=0; # word must have >2 different characters
echo$s;# short output
echo["n","+P","-P","+F","-F"][$s]; #long output alternative

ภารกิจที่ 2 ค่าที่สองโดยไม่มีกฏสั้นคู่

4 -F killness 11 Bytes บวก 10 ไบต์

3 + F ความขัดแย้งตรงข้าม 10 ไบต์ logogogue 9 ไบต์

2 -P vassalage 9 Bytes sarcocol, sasarara 8 Bytes

1 + P assession 9 ไบต์ apanage, อะราเมอิก, อาร์กอน, ประมูล, avision, ที่ได้รับรางวัล, crenele, exesion, exition, exew, eyewink 7 Bytes

เห็นภาพคำ

header('Content-Type: image/svg+xml; charset=UTF-8');
$w=$_GET["w"]??"OOPERRA";
$w=strtoupper($w);
echo '<?xml version="1.0" encoding="UTF-8"?>'
.'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'

.'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 -100 420 400">'
.'<title>Swirl Word</title><desc>Viualize a Word</desc>';
echo '<text x="210" y="-50" text-anchor="middle" font-family="arial">'.$w.'</text>';

foreach(range("A","Z")as $x=>$c){
    echo '<text x="'.(15+$x*15).'" y="110" text-anchor="middle" font-family="arial">'.$c.'</text>';
    $r[$c]=15+$x*15;
}
for($i=0;++$i<strlen($w);){
    echo '<path d="M '.($r[$w[$i-1]]).',105 A '.($radius=abs($r[$w[$i]]-$r[$w[$i-1]])/2).' '.($radius).' 0 0 0 '.($r[$w[$i]]).',105" style="stroke:gold; stroke-width:1px;fill:none;" />';
}
echo '</svg>';  

ในตัวอย่างคือผลลัพธ์ของ SVG ที่ฉันสร้าง

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 -100 420 400"><title>Swirl Word</title><desc>Viualize a Word</desc><text x="210" y="-50"  text-anchor="middle" font-family="arial">KILLINGNESS</text><text x="15" y="110" text-anchor="middle" font-family="arial">A</text><text x="30" y="110" text-anchor="middle" font-family="arial">B</text><text x="45" y="110" text-anchor="middle" font-family="arial">C</text><text x="60" y="110" text-anchor="middle" font-family="arial">D</text><text x="75" y="110" text-anchor="middle" font-family="arial">E</text><text x="90" y="110" text-anchor="middle" font-family="arial">F</text><text x="105" y="110" text-anchor="middle" font-family="arial">G</text><text x="120" y="110" text-anchor="middle" font-family="arial">H</text><text x="135" y="110" text-anchor="middle" font-family="arial">I</text><text x="150" y="110" text-anchor="middle" font-family="arial">J</text><text x="165" y="110" text-anchor="middle" font-family="arial">K</text><text x="180" y="110" text-anchor="middle" font-family="arial">L</text><text x="195" y="110" text-anchor="middle" font-family="arial">M</text><text x="210" y="110" text-anchor="middle" font-family="arial">N</text><text x="225" y="110" text-anchor="middle" font-family="arial">O</text><text x="240" y="110" text-anchor="middle" font-family="arial">P</text><text x="255" y="110" text-anchor="middle" font-family="arial">Q</text><text x="270" y="110" text-anchor="middle" font-family="arial">R</text><text x="285" y="110" text-anchor="middle" font-family="arial">S</text><text x="300" y="110" text-anchor="middle" font-family="arial">T</text><text x="315" y="110" text-anchor="middle" font-family="arial">U</text><text x="330" y="110" text-anchor="middle" font-family="arial">V</text><text x="345" y="110" text-anchor="middle" font-family="arial">W</text><text x="360" y="110" text-anchor="middle" font-family="arial">X</text><text x="375" y="110" text-anchor="middle" font-family="arial">Y</text><text x="390" y="110" text-anchor="middle" font-family="arial">Z</text><path d="M 165,105 A 15 15 0 0 0 135,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 135,105 A 22.5 22.5 0 0 0 180,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 180,105 A 0 0 0 0 0 180,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 180,105 A 22.5 22.5 0 0 0 135,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 135,105 A 37.5 37.5 0 0 0 210,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 210,105 A 52.5 52.5 0 0 0 105,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 105,105 A 52.5 52.5 0 0 0 210,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 210,105 A 67.5 67.5 0 0 0 75,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 75,105 A 105 105 0 0 0 285,105" style="stroke:gold; stroke-width:1px;fill:none;" /><path d="M 285,105 A 0 0 0 0 0 285,105" style="stroke:gold; stroke-width:1px;fill:none;" /></svg>


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

@ มาริโอมันต้องการเพียงปัจจัย'.(.8*$radius).'แทน'.($radius).'และถ้าคุณแทนที่($radius).' 0 0 0ด้วย($radius).' 0 0 '.(($w[$i-1]<$w[$i]?1:0)^(($i-1)%2)).'โปรแกรมที่ไม่มีทิศทางการแก้ไข
JörgHülsermann

2

Haskell, 148 ไบต์

z f=tail>>=zipWith f
g c=and.z c.filter(/=0).map abs.z(-).map fromEnum
(a:b:r)%c|a==b=(b:r)%c|1<3=c a b
f s|a<-[g(>=)s,g(<=)s]=or a:a++[s%(<),s%(>)]

ลองใช้กับ Ideone

ข้อมูลที่ป้อนต้องเป็นอักษรตัวล่างหรือตัวพิมพ์ใหญ่
เอาท์พุทเป็นรายการของห้า booleans [SW?, CF?, CP?, CW?, CC?]นี้:

f "positive" -> [True,True,False,False,True]

สิ่งนี้เปิดออกมานานกว่าที่คาดไว้โดยเฉพาะการยุบตัวของอักขระซ้ำใช้เวลาประมาณ 40 ไบต์

ตอนแรกฉันเปรียบเทียบตัวละครสองตัวแรกเพื่อให้ได้ผลCWหรือCCก่อนที่จะสังเกตเห็นว่าตัวอย่างเช่นbbaหรือbbcมีผลใช้ได้และเอาชนะแนวทางนี้


2

Python 152 ไบต์:

lambda C:[C[-1]in max(C)+min(C),C[1]>C[0]]*all([[i>g,i<g][[h%2>0,h%2<1][C[1]>C[0]]]for i,g,h in filter(lambda i:i[0]!=i[1],zip(C,C[1:],range(len(C))))])

ฟังก์ชั่นแลมบ์ดานิรนาม โทรprint(<Function Name>('<String>'))มา

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

ส่งออกอาร์เรย์ที่มีอะไร ( []) ถ้าคำไม่ swirly หรืออาร์เรย์ในรูปแบบต่อไปนี้เป็นอย่างอื่น:

  • องค์ประกอบที่ 1 คือสำหรับTrue/FalseCentrifugal/Centripetal
  • องค์ประกอบที่ 2 คือสำหรับTrue/FalseClockwise/Counterclockwise

ลองออนไลน์! (Ideone)

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