Обертання рядка - вихідний рядок, багаторазово переміщаючи перший символ до кінця


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 Розумний! Спасибі!
Суєвер

3

Мова Вольфрама (Mathematica) , 35 26 байт

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

Спробуйте в Інтернеті!

Візьме список символів як вхідний.

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

Мова Вольфрама (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

Attache , 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?
Адам

@ Adám Я думаю, що це "#:. Про це я дізнався тут від Frownyfrog
Галена Іванова



2

C (32-бітний), 58 51 50 байт

-1 байт за хороший круглий номер завдяки стельовій кішці

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

Спробуйте в Інтернеті!

Дегольф

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
roofcat

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

Луа , 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, але ми не дозволяємо змінну переназначення.
Пшеничний майстер

Спасибі Гарфе. Не впевнений, як мені вдалося зіпсувати обох. Має бути все добре зараз.
аккорнель

1

JavaScript, 48 43 36 байт

-5 байт люб’язно надано @Bubbler * -7 байт люб’язно надано @Shaggy

Вхід - це символьний масив, а вихід - масив символьних масивів.

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

Спробуйте в Інтернеті!




@Shaggy Це дійсне число байтів і запис? Чи [..."john"]не вважається маніпуляцією вхідного рядка до масиву перед викликом функції?
гість271314

@ guest271314, введення - це символ, а вихід - це масив символьних масивів, дозволений специфікацією виклику та нашими стандартними умовами вводу / виводу.
Кудлатий

@Shaggy Оновлено. Чи можете ви залишити свій коментар вище? Або ваш коментар повинен бути включений у відповідь, щоб уникнути плутанини? Або це не потрібно?
гість271314


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.
Ørjan Johansen

@ Ørjan Johansen Дуже приємно, дякую.
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.