Поворот строки - выходная строка, многократно перемещающая первый символ в конец


22

Задача здесь состоит в том, чтобы взять строку и вывести все ее вращения, многократно перемещая первый символ в конец, один раз за символ в строке, заканчивающийся исходной строкой:

john -> ohnj, hnjo, njoh, john

Вы также можете перемещаться в другом направлении, перемещая персонажей с конца:

john -> njoh, hnjo, ohnj, john

Вы все равно должны выводить один оборот на букву, даже если до этого было достигнуто оригинальное слово:

heehee -> eeheeh, eheehe, heehee, eeheeh, eheehe, heehee

Допускаются массивы символов, если результат работает, как показано выше.

Кратчайший ответ выигрывает!


5
Если подобная строка heeheeвозвращается к исходному порядку за меньшее количество циклов, чем его длина, мы остановимся на этом? Я ожидаю, что это будет иметь большое значение для многих ответов.
xnor

Можем ли мы ездить на велосипеде в другом направлении?
xnor

2
Я редактировал вопрос, включая ваши разъяснения, не стесняйтесь менять его, если он не соответствует вашим ожиданиям.
xnor

1
@xnor, который выглядит намного яснее, чем мой оригинальный пост, спасибо большое!
I_P_Edwards

1
Разрешено ли вводить / выводить символьные массивы? (Различие может быть важным в некоторых языках.)
LegionMammal978

Ответы:







4

Japt, 5 3 байта

Принимает ввод как символьный массив, выводит массив символьных массивов

£=é

Попробуй здесь

£=é     :Implicit input of character array U
£       :Map
  é     :  Rotate U one element to the right
 =      :  Reassign to U for next iteration


3

брейкфук , 59 байт

,[>,]<[>>[>]+[<]<[<]>-[[>]>[>]<+[<]<[<]>-]>[.>]>[.>]<[<].<]

Попробуйте онлайн!

Выводит каждую строку, разделенную нулевыми байтами.

Объяснение:

,[>,]    # Get input
<[       # Start loop over input
  >>[>]       # Go to end of the string
  +           # Set it to one to mark it
  [<]<[<]>    # Move to the beginning of input
  -[[>]>[>]<+[<]<[<]>-]   # Transfer the first character to the end
  >[.>]>[.>]  # Print the rotated string
  <[<].       # Print a nul byte
<]       # Repeat loop while input

3

MATL , 6 5 байт

tf&+)

1 байт сохранен благодаря @luis!

Попробуйте это в MATL Online !

Пояснение :

    # Implicitly grab input string
t   # Duplicate the input
f   # Create an array [1, ..., N] where N is the number of characters in the input
&+  # Add the transpose of this array to itself to create a 2D array of indices
    #
    #   +   1  2  3  4
    #       ----------
    #   1 | 2  3  4  5
    #   2 | 3  4  5  6
    #   3 | 4  5  6  7
    #   4 | 5  6  7  8
    #
)   # Use this 2D array to index into the original string using periodic indexing
    # Implicitly display the resulting character array

@LuisMendo Умный! Благодарность!
Suever

3

Wolfram Language (Mathematica) , 35 26 байтов

Partition[#,Tr[1^#],1,-1]&

Попробуйте онлайн!

Принимает список символов в качестве входных данных.

Partition(но не его вариант, StringPartitionиспользуемый ниже) имеет необязательный четвертый аргумент для обработки его ввода как циклического (и для указания, как именно это сделать), что делает это решение проще, чем строковое - в дополнение к отсутствию 15-символьного построения в функции.

Wolfram Language (Mathematica) , 44 байта

Rest@StringPartition[#<>#,StringLength@#,1]&

Попробуйте онлайн!

То же самое, но принимает строку в качестве ввода.

Превращается "john"в "johnjohn", затем берет все StringLength["john"]подстроки длины этой строки со смещением 1, производя {"john","ohnj","hnjo","njoh","john"}, а затем отбрасывает первую из них с помощью Rest.


Так как символьные массивы разрешены, Rest@Partition[#~Join~#,Length@#,1]&будет 36 байтов.
LegionMammal978

@ LegionMammal978 Спасибо! Вероятно, есть и более короткий подход с массивами символов, хотя я еще ни о чем не думал.
Миша Лавров

2

Атташе , 13 байт

Rotate#{1:#_}

Попробуйте онлайн!

объяснение

Rotate#{1:#_}
      #          fork(f, g) = ${ f[x, g[x]] }; this forks:
Rotate               rotate's the input by
       {1:#_}        each number from 1 to the length of the input

альтернативы

15 байт :{_&Rotate!1:#_}

16 байт :{Rotate[_,1:#_]}

16 байт :Rotate@Rotations

16 байт :Rotate#(1&`:@`#)

17 байт :Rotate#{1+Iota@_}

18 байт :Rotate#(1&`+@Iota)

19 байтов :Rotate#(Succ=>Iota)


2

J 7 байт

#\|."{]

Попробуйте онлайн!

Объяснение:

  |."{    - rotate ( "{ is short for "0 1 - rank 0 1 ) 
      ]   - the input
#\        - lenght of the successive prefixes of the input 

2
Использовать "подобное очень умно и требует знания словаря языка. Есть ли глагол с рангом 1 0?
Адам

@ Адам, я так думаю "#:. Я узнал об этом здесь от Frownyfrog
Гален Иванов



2

C (32-разрядный), 58 51 50 байт

-1 байт для хорошего округлого числа благодаря потолку

i;f(s){for(i=0;i++<printf("%s%.*s\n",s+i,i,s)-2;);}

Попробуйте онлайн!

Degolf

i;           // "Global" i.
f(s){   // s is pointer to string, which conveniently fits in a 32 bit integer.
    for(i=0; // Initialize i.
        // Increment i and take its complement, and add it to the
        // return value of printf(); which just happens to be strlen(s)+1.
        // ~i + strlen(s) + 1 == strlen(s) + 1 - i - 1, so the last printed
        // string is the original string.
        ~++i + printf("%s%.*s\n",s+i,i,s);
        // The printf prints two strings: first until the terminating \0,
        // the second until a \0 or until i chars have been printed. It also
        // prints a linefeed.
}

Предложить ~++i+printf("%s%.*s\n",s+i,i,s)вместоi++<printf("%s%.*s\n",s+i,i,s)-2
потолок кошка

@ceilingcat Спасибо, как всегда!

@ceilingcat Тебе действительно нужно позвонить flooringcat.

1

Древесный уголь , 10 байт

⮌Eθ⭆θ§θ⁻μκ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

  θ         Input string
 E         Map over characters
    θ       Input string
   ⭆        Map over characters and join
      θ     Input string
     §      Circularly indexed by
       ⁻    Difference between
        μ   Inner index
         κ  Outer index
⮌           Reversed
            Implicitly print each string on its own line

Чтобы повернуть в противоположном направлении, замените Minusна Plus.




1

Perl 6 , 32 байта

{m:ex/^(.*)(.+)$/».&{[R~] @$_}}

Попробуйте онлайн!

m:ex/^(.*)(.+)$/ exhaustively mприсоединяется к данному регулярному выражению, разделяя входную строку в каждом возможном месте, за исключением того, что вторая подстрока должна иметь хотя бы один символ - что препятствует тому, чтобы входная строка дважды отображалась в выходных данных. Затем каждая из Matchгрупп захвата результирующих объектов сводится ( []) к одной строке с R~помощью оператора конкатенации обратной строки.




1

Powershell, 44 байта

($s=$args|% t*y)|%{$h,$t=$s;-join($s=$t+$h)}

Тестовый скрипт:

$f = {

($s=$args|% t*y)|%{$h,$t=$s;-join($s=$t+$h)}

}

@(
    ,('john', 'ohnj', 'hnjo', 'njoh', 'john')
    ,('heehee', 'eeheeh', 'eheehe', 'heehee', 'eeheeh', 'eheehe', 'heehee')
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$result"-eq"$expected"
    $result
}

выход:

True
ohnj
hnjo
njoh
john
True
eeheeh
eheehe
heehee
eeheeh
eheehe
heehee

1

Tcl , 80 91 байт

proc P s {time {puts [set s [string ra $s 1 e][string in $s 0]]} [string le $s]}

Попробуйте онлайн!


Переназначение текста каждый раз сохраняет несколько байтовproc R t {time {puts [set t [string ra $t 1 end][string in $t 0]]} [string len $t]}
Дэвид

Получил до 80 байт, благодаря @david
sergiol


1

Луа , 61 байт

function(s)for i=1,#s do print(s:sub(i+1)..s:sub(1,i))end end

Попробуйте онлайн!

Разбейте строку по последовательным индексам от одного до длины строки (индексация по одному), объедините фрагменты в обратном порядке, напечатайте.


1

Рубин , 39 байт

->s{a=s.chars.to_a;a.map{a.rotate!*''}}

Попробуйте онлайн!


1
Добро пожаловать на сайт! Не похоже, что ваша ссылка TIO соответствует вашему ответу. Также кажется, что ваш ответ не соответствует нашим требованиям ввода / вывода. Вы можете использовать либо функцию, либо STDIN / STDOUT, но мы не разрешаем переназначение переменных.
Волшебник Пшеницы

Спасибо Гарф. Не уверен, как мне удалось испортить оба из них. Теперь все должно быть хорошо.
Acornellier

1

JavaScript, 48 43 36 байт

-5 байтов любезно предоставлено @Bubbler * -7 байтов любезно предоставлено @Shaggy

Ввод - это массив символов, а вывод - это массив символьных массивов.

s=>s.map(_=>([a,...b]=s,s=[...b,a]))

Попробуйте онлайн!




@ Shaggy Это действительный счетчик байтов и запись? Не [..."john"]считается ли обработка входной строки в массив перед вызовом функции?
guest271314

@ guest271314, input - это символ, а output - это массив символьных массивов, которые разрешены спецификацией вызова и нашими значениями по умолчанию для ввода / вывода.
лохматый

@ Shaggy Обновлено. Можете ли вы оставить свой комментарий выше? Или ваш комментарий должен быть включен в ответ, чтобы избежать путаницы? Или это не обязательно?
guest271314


1

MBASIC , 69 66 байт

-3 байта, благодаря Орджану Йохансену

1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT

Я подозреваю, что вы можете сократить это до 1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT.
Орджан Йохансен

@ Эрджан Йохансен Очень приятно, спасибо.
wooshinyobject

1

брейкфак , 38 байт

,[>>,]<<<+>[[.>>]<<[<<]>-[+>.>-].<<+>]

Попробуйте онлайн!

Основано на идее JoKing использовать нулевые символы в качестве пробелов. Этот код отмечает текущие буквы для печати и циклически повторяется, пока не достигнет левого конца.

,[>>,]<<    input string with empty cells in between
<+>         set first marker
[           main loop
  [.>>]     print remaining characters
  <<[<<]    return to start
  >-[+>.>-] print until marker (remove marker)
  .         print null
  <<+       set new marker
  >         restart loop with next character to the left
]           stop if there's no character to the left
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.