Прямоугольная струна!

12

Учитывая строку, сначала возведите ее в квадрат:

Сначала напишите строку.

abcde

Далее пишем строку повернутую на одну влево.

abcde
bcdea

Продолжайте делать это до тех пор, пока не напишите строки len (string) .

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 раз и т. Д. Это можно упростить до следующего алгоритма:

  • Начните индекс я с -1 .
  • Для каждого целого числа x в диапазоне [n 2 ..1] :
    • Если floor (sqrt (x)) имеет ту же четность (четное / нечетное), что и n , приращение i .
    • В противном случае, уменьшить i .
    • Добавьте символ с индексом i mod n к выводу.

Это работает, потому что floor (sqrt (x)) переключает четности после 2n - 1 итерации, затем 2 (n - 1) - 1 итерации и т. Д.

ETHproductions
источник
Rediculous. Молодец!
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
TheBikingViking
источник
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 (спасибо Оливеру). Входные данные должны быть строкой Python, например '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
Оливер Ни
Это сохраняет байт.
Оливер Ни
@ Оливер, спасибо ... но это не работает"a string of odd length."
Линус
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 байта

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.

cleblanc
источник
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 байта)
Дада
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.
Sherlock9
источник
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для вашего состояния.
Линус