Квадратно-спіральна струна!


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 Дякую, я це виправив.
Олівер Ні

Відповіді:


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), по модулю довжина рядка. Іншими словами, якщо n - довжина рядка, ми збільшуємо індекс 2n - 1 раз, потім зменшуємо його 2 (n - 1) - 1 раз, потім збільшуємо його 2 (n - 2) - 1 раз тощо. Це можна спростити за допомогою наступного алгоритму:

  • Почніть індекс i з -1 .
  • Для кожного цілого числа x у діапазоні [n 2 ..1] :
    • Якщо підлога (sqrt (x)) має таку ж паритетність (парний / непарний), як n , приріст i .
    • Інакше декремент i .
    • Додайте символ до індексу i mod n до виводу.

Це працює, тому що floor (sqrt (x)) перемикає парність після 2n - 1 ітерацій, потім 2 (n - 1) - 1 ітерацій тощо.


Слідкуючи. Хороша робота!
МерМонти

1

Піт , 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 . Оператор друку, що закінчується комою, відокремлює подальший вихід із пробілом замість нового рядка чи повернення. Задній простір дозволяє перезаписати розділовий простір.

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- це індекс верхнього лівого значення на кожному кроці процесу. У заключній спіралі кілька зрізів можуть бути порожніми.


Це, ймовірно , не тільки зберегти, але і за рахунок зміни в Python 3, позбувшись S='', print Sі S+=, загортання і все , перш ніж i+=2в print()заяві з sep='', ви можете зберегти 2 байти.
Каде

@Shebang Я не слідкую за цим. Не соромтеся самостійно додати відповідь python 3.
Лінус

Ви можете змінитись i<=nдоn>i
Олівер Ні

Це економить байт.
Олівер Ні

@Oliver, спасибі ... але це не працює"a string of odd length."
Linus

1

Желе , 11 10 байт

ẋ2µṖȮṖUµÐL

СпробуйтеItOnline! або всі тести

Як?

Неспіральний квадрат - це ряд прогонів "верхній край плюс правий край" та "нижній край плюс лівий край", кожен з яких - зворотний бік попереднього пробігу без першої та останньої літери, і перша з яких - це вхід плюс вхід без останньої літери (наприклад, вхід "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 байт

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 байт, тому що я міг вирізати стільки.

Код працює за допомогою складання списку паліндромів, розділених парними числами, які представляють значення місця рядка, який потрібно витягнути.


Ви можете скористатись тим, -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

Прямий порт моєї відповіді Jelly ; лише повна програма, що приймає дані (а не функцію).
Це 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свого стану.
Лінус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.