สแควร์ - unspiral สตริง!


12

รับสตริงให้ทำตารางแรกดังนี้:

ก่อนอื่นให้เขียนสตริง

abcde

จากนั้นเขียนสตริงที่หมุนไปทางซ้าย

abcde
bcdea

ทำสิ่งนี้ต่อไปจนกว่าคุณจะได้เขียนบรรทัดlen (สตริง)

abcde
bcdea
cdeab
deabc
eabcd

ตอนนี้อ่านจากสายเช่นนี้:

----+
+--+|
|+>||
|+-+|
+---+

ซึ่งจะช่วยให้:

abcdeabcdcbaedcbcdeabaede

พิมพ์สตริงนี้

กรณีทดสอบ

abcdef -> abcdefabcdedcbafedcbcdefabcbafedefaf
cena! -> cena!cenanec!anena!cec!a!
ppcg -> ppcgppcppgcpcgpg
abc -> abcabacbc
ab -> abab
a -> a
 -> 

โปรดแสดงความคิดเห็นหากกรณีทดสอบไม่ถูกต้อง

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


2
cena!มันผิด. ควรจับคู่ตัวอย่างของคุณด้วยabcdeเนื่องจากทั้งคู่เป็นตัวอักษร 5 ตัว:cena!cenanec!anena!cec!a!
Linus

@Lusus ขอบคุณฉันได้แก้ไขแล้ว
Oliver Ni

คำตอบ:


7

JavaScript (ES7), 83 80 78 77 ไบต์

s=>s.repeat(l=s.length).replace(/./g,_=>s[(c-=--i**.5-l&1||-1)%l],c=-1,i=l*l)

โปรแกรมที่สอดคล้องกับโบนัส ES3:

for(s=prompt(r=""),c=-1,l=s.length,i=l*l;i;)r+=s[(c-=l-Math.sqrt(i--)&1||-1)%l];alert(r)

คำอธิบาย

สิ่งนี้ใช้ประโยชน์จากข้อเท็จจริงที่ว่าเอาต์พุตสำหรับเช่นความยาว 5 สตริงสามารถแสดงเป็น:

abcdeabcd cbaedcb cdeab aed e
012345678 7654321 23456 543 4

โดยที่แต่ละหลักแสดงถึงดัชนีในสตริง (เริ่มต้นที่ 0), modulo ความยาวของสตริง กล่าวอีกนัยหนึ่งถ้าnคือความยาวของสตริงเราจะเพิ่มดัชนี2n - 1ครั้งจากนั้นลดลง2 (n - 1) - 1ครั้งจากนั้นเพิ่มขึ้น2 (n - 2) - 1ครั้งเป็นต้น สิ่งนี้สามารถทำให้เป็นอัลกอริทึมต่อไปนี้ได้ง่ายขึ้น:

  • เริ่มดัชนีฉันที่-1
  • สำหรับแต่ละจำนวนเต็มxในช่วง[n 2 ..1] :
    • ถ้าชั้น (sqrt (x))มีความเสมอกัน (แม้ / คี่) เป็นn , เพิ่มฉัน
    • มิฉะนั้นพร่องฉัน
    • เพิ่มอักขระที่ index i mod nไปยังเอาต์พุต

สิ่งนี้ทำงานได้เพราะfloor (sqrt (x))สลับ parities หลังจาก2n - 1 iterations, 2 (n - 1) - 1 iterations ฯลฯ


ไร้สาระ ทำได้ดีมาก!
MayorMonty

1

Pyth , 15 ไบต์

.Wp.(H0_CZ.<LQU

โปรแกรมที่รับอินพุต"quoted string"และพิมพ์ผลลัพธ์

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

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

.Wp.(H0_CZ.<LQU  Program. Input: Q
            L U  Map over [0, 1, 2, 3, ..., Q-1] (implicit input):
          .< Q     Q left-shifted by that many characters
                 Call this X
.W               While
   .(H0          popping the first element of X (mutates X in-place)
  p              and printing it with no trailing newline is truthy:
         Z           X = 
        C            X transposed
       _             reversed

1

Python 2.7 (ใน CMD.EXE), 91 ไบต์

นี้ต้องใช้ขั้วกับ Backspace ทำงาน (ก\b) และจะไม่ทำงานในrepl.itหรือideone.com คำสั่งพิมพ์ที่ลงท้ายด้วยเครื่องหมายจุลภาคคั่นเอาต์พุตเพิ่มเติมด้วยช่องว่างแทนการขึ้นบรรทัดใหม่หรือส่งคืน Backspace ช่วยให้เราสามารถเขียนทับช่องว่าง

s=input();r=s[::-1];n=len(s)-1;i=0
while i<=n:print'\b'+s[i:]+s[:n-i]+r[i+2:]+r[:n-i],;i+=2

Python 2.7, 96 ไบต์

ลองใช้บนideone.comหรือrepl.it (ขอบคุณโอลิเวอร์) 'cena!'การป้อนข้อมูลต้องเป็นสตริงหลามเช่น

s=input();r=s[::-1];n=len(s)-1;i=0;S=''
while i<=n:S+=s[i:]+s[:n-i]+r[i+2:]+r[:n-i];i+=2
print S

สี่ชิ้นต่อท้ายโดยวง ( s[i:], s[:n-i], r[i+2:], r[:n-i]) ที่นำมาจากสี่ขอบของเกลียว ตัวอย่างเช่นกับส01234แควร์คือ:

01234
12340
23401
34012
40123

ดังนั้นเราจึงใช้เวลา01234, 0123, ,210 4321ตัวแปรiคือดัชนีของค่าบนซ้ายในแต่ละขั้นตอนของกระบวนการ ในเกลียวสุดท้ายชิ้นส่วนต่างๆอาจว่างเปล่า


มันอาจจะไม่ได้เป็นเพียง แต่ประหยัด แต่โดยการเปลี่ยนหลาม 3 การกำจัดS='', print SและS+=, และการตัดทุกอย่างก่อนที่i+=2ในprint()คำสั่งกับsep=''คุณสามารถบันทึก 2 ไบต์
Kade

@Shebang ฉันไม่ได้ติดตามทันที รู้สึกฟรีเพื่อเพิ่มงูใหญ่ 3 ตอบตัวเอง
Linus

คุณสามารถเปลี่ยนi<=nเป็นn>i
Oliver Ni

มันช่วยประหยัดไบต์
Oliver Ni

@Oliver ขอบคุณ ... แต่มันใช้งานไม่ได้"a string of odd length."
Linus

1

เยลลี่ , 11 10 ไบต์

ẋ2µṖȮṖUµÐL

TryItOnline! หรือการทดสอบทั้งหมด

อย่างไร?

สแควร์ที่ไม่มีการหมุนเป็นชุดของการวิ่ง "ขอบบนบวกกับขอบด้านขวา" และ "ขอบล่างบวกกับขอบซ้าย" ซึ่งแต่ละตำแหน่งจะกลับด้านของการวิ่งก่อนหน้าโดยไม่มีตัวอักษรตัวแรกและตัวสุดท้ายและตัวแรก คืออินพุตบวกอินพุตที่ไม่มีตัวอักษรตัวสุดท้าย (เช่นอินพุต"abcde"มีเอาต์พุต"abcdeabcd" + "cbaedcb" + "cdeab" + "aed" + "e")

ẋ2µṖȮṖUµÐL - Main link: s                            e.g. abcde
ẋ2         - repeat s twice                          e.g. abcdeabcde
  µ    µ   - monadic chain separation
        ÐL - repeat until results are no longer unique:
   Ṗ       -     remove the last character                abcdeabcd / cbaedcb / cdeab / aed / e   / ""
    Ȯ      -     print z (with no linefeed) and return z
     Ṗ     -     remove the last character                abcdeabc  / cbaedc  / cdea  / ae  / ""  / ""
      U    -     reverse                                  cbaedcba  / cdeabc  / aedc  / ea  / ""  / "" <- no longer unique.

1

05AB1E, 12 ไบต์

2×[DõQ#¨D?¨R

ลองออนไลน์!

คำอธิบาย:

 2×[DõQ#¨D?¨R
               # Implicit input
 2×            # Repeat twice
   [           # Begin infinite loop
┏>  DõQ#       # If empty string, break
┃       ¨      # Remove last character
┃        D     # Duplicate
┃         ?    # Print with no newline and pop
┃          ¨   # Remove last character
┃           R  # Reverse
┗━━━━━━━━━━━━┛ # Implicit end infinite loop


0

C, 95 94 Bytes

i,j,k,l;f(char*s){for(k=-1,l=i=strlen(s);i--;)for(j=i*2;~j--;putchar(s[(k+=(l-i)%2*2-1)%l]));}

แรงบันดาลใจจาก @ETHproductions คำตอบ


0

Perl, 99 ไบต์

$_=<>;
chop;
@a=split//;
print(@a[$%,(@f=1-($b=@a-$%)..$b-3),$b-1?$b-2:(),reverse@f]),$%+=2 until$%>@a

ช่องว่างไม่ได้เป็นส่วนหนึ่งของโปรแกรมและมีไว้เพื่อให้สามารถอ่านได้

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

รหัสทำงานโดยการรวบรวมรายการของ palindromes คั่นด้วยเลขคู่ซึ่งแสดงถึงค่าสถานที่ของสตริงที่จะดึง


คุณสามารถใช้-F ซึ่งจะแทนที่บรรทัดที่ 1 และ 3 ให้การป้อนข้อมูลที่มีการลบecho -n chop(ที่ควรจะได้รับคุณประมาณ 81 ไบต์)
Dada

0

อันที่จริง , 21 13 ไบต์

ขั้นตอนวิธีนี้ส่วนใหญ่จะขึ้นอยู่กับโจนาธานอัลลันคำตอบของวุ้น มีสองวิธีที่จะดำเนินการพิมพ์ผลลัพธ์เป็นหนึ่งสตริง วิธีการที่ใช้ที่นี่ซ้ำขั้นตอนกลางแล้วเพิ่มลงในผลรวมสะสมในการลงทะเบียน 1 (สตริงว่างเปล่าโดยค่าเริ่มต้น); ;╕ในฟังก์ชั่นจากนั้นในตอนท้าย อีกวิธีหนึ่งคือการทำซ้ำขั้นตอนกลางปล่อยให้ขั้นตอนที่ซ้ำกันเหล่านั้นในสแต็กและรวมพวกเขาเป็นหนึ่งสายในตอนท้าย; ;ในฟังก์ชั่นจากนั้นในตอนท้าย

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

2*`dX;╕dXR`Y╛

Ungolfing

         Implicit input s.
2*       Push a string that repeats s two times.
`...`Y   Call the following function until there is no change from the last call
  dX       Discard the last element. Call this new string m.
  ;╕       Duplicate m and add it to the running total in register 1.
  dXR      Discard the last element again and reverse the string.
╛        Push the unspiralled string from register 1 to the stack.
         Implicit return.

0

Python 3, 59 ไบต์

x=input()*2
while x:x=x[:-1];print(x,end='');x=x[:-1][::-1]

repl.it

พอร์ตโดยตรงจากคำตอบของฉันเจลลี่ ; เฉพาะโปรแกรมเต็มรูปแบบที่รับอินพุต (แทนที่จะเป็นฟังก์ชัน) เป็นคำสั่งพิมพ์ซึ่งจะไม่พิมพ์ขึ้นบรรทัดใหม่เริ่มต้น
print(x,end='')


-1

Python 3, 93 ไบต์

s=input();r,n,i=s[::-1],len(s)-1,0
while n-i:print(s[i:]+s[:n-i]+r[i+2:]+r[:n-i],end='');i+=2

ลองออนไลน์!


แทนที่จะprint(...,end='')ทำprint(end=s[i:]+s[:n-i]+r[i+2:]+r[:n-i]
FlipTack

1
อย่างไรก็ตามวิธีนี้ใช้ไม่ได้ผลabcdeมันหายไปeในตอนท้าย
FlipTack

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