Rotacja łańcucha - ciąg wyjściowy wielokrotnie przesuwa pierwszy znak na koniec

22

Wyzwanie polega na tym, aby pobrać ciąg i wyprowadzić wszystkie jego obroty, wielokrotnie przesuwając pierwszy znak na koniec, raz na znak w ciągu, kończąc na oryginalnym ciągu:

john -> ohnj, hnjo, njoh, john

Możesz także jechać w innym kierunku, przesuwając postacie od końca:

john -> njoh, hnjo, ohnj, john

Nadal powinieneś generować jeden obrót na literę, nawet jeśli wcześniej osiągnięte zostało oryginalne słowo:

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

Tablice znaków są dozwolone, o ile wynik działa, jak pokazano powyżej.

Najkrótsza odpowiedź wygrywa!

I_P_Edwards
źródło
5
Jeśli ciąg taki jak heeheepowraca do pierwotnego zamówienia w mniejszej liczbie cykli niż jego długość, czy na tym poprzestajemy? Spodziewam się, że to wiele zmieni w przypadku wielu odpowiedzi.
xor
Czy możemy jechać w innym kierunku?
xnor
2
Zredagowałem pytanie, w tym twoje wyjaśnienia, możesz je zmienić, jeśli nie jest to zamierzenie.
xor
1
@xnor, który wygląda o wiele jaśniej niż mój oryginalny post, wielkie dzięki!
I_P_Edwards
1
Czy wolno nam wprowadzać / wyprowadzać tablice znaków? (To rozróżnienie może być ważne w niektórych językach.)
LegionMammal978

Odpowiedzi:

7

Galaretka , 2 bajty

ṙJ

Monadyczny link akceptujący listę znaków, który daje listę list znaków

Wypróbuj online! (stopka ładnie drukuje, wywołując link i łącząc się ze znakami nowej linii)

Jonathan Allan
źródło
8

Haskell, 27 bajtów

scanl(\(a:b)_->b++[a])=<<id

Wypróbuj online!

nimi
źródło
6

Python 2 , 38 bajtów

s=input()
for c in s:s=s[1:]+c;print s

Wypróbuj online!

xnor
źródło
Python 3 ma tylko 9 bajtów więcej.
wizzwizz4,
1
@ wizzwizz4 Skąd masz 9? Python
3-39
@ pizzapants184 Zapomniałem, że ciągi są niezmienne; masz rację; to tylko 1 bajt więcej.
wizzwizz4,
6

JavaScript (ES6), 37 32 bajtów

Zwraca tablicę ciągów.

s=>[...s].map(c=>s=s.slice(1)+c)

Wypróbuj online!

Arnauld
źródło
4

Japt, 5 3 bajty

Pobiera dane wejściowe jako tablicę znaków, generuje tablicę tablic znaków

£=é

Wypróbuj tutaj

£=é     :Implicit input of character array U
£       :Map
  é     :  Rotate U one element to the right
 =      :  Reassign to U for next iteration
Kudłaty
źródło
3

pieprzenie mózgu , 59 bajtów

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

Wypróbuj online!

Zwraca każdy ciąg oddzielony pustymi bajtami.

Wyjaśnienie:

,[>,]    # 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
Jo King
źródło
3

MATL , 6 5 bajtów

tf&+)

1 bajt zapisany dzięki @luis!

Wypróbuj w MATL Online !

Objaśnienie :

    # 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
Suever
źródło
@LuisMendo Clever! Dzięki!
Suever,
3

Wolfram Language (Mathematica) , 35 26 bajtów

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

Wypróbuj online!

Pobiera na wejściu listę znaków.

Partition(ale nie jego wariant StringPartitionużyty poniżej) ma opcjonalny czwarty argument do traktowania danych wejściowych jako cyklicznych (i do określania, jak dokładnie to zrobić), co sprawia, że ​​to rozwiązanie jest prostsze niż łańcuchowe - oprócz tego, że nie ma zbudowanej 15 znaków -w funkcjach.

Wolfram Language (Mathematica) , 44 bajty

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

Wypróbuj online!

To samo, ale pobiera ciąg jako dane wejściowe.

Zamienia się "john"w "johnjohn", następnie bierze wszystkie StringLength["john"]podłańcuchy długości tego łańcucha z przesunięciem 1, tworząc {"john","ohnj","hnjo","njoh","john"}, a następnie upuszcza pierwszy z nich Rest.

Misza Ławrow
źródło
Ponieważ tablice znaków są dozwolone, Rest@Partition[#~Join~#,Length@#,1]&miałoby 36 bajtów.
LegionMammal978,
@ LegionMammal978 Dzięki! Prawdopodobnie jest też krótsze podejście z tablicami postaci, choć jeszcze o tym nie pomyślałem.
Misha Lavrov,
2

Attache , 13 bajtów

Rotate#{1:#_}

Wypróbuj online!

Wyjaśnienie

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

Alternatywy

15 bajtów :{_&Rotate!1:#_}

16 bajtów :{Rotate[_,1:#_]}

16 bajtów :Rotate@Rotations

16 bajtów :Rotate#(1&`:@`#)

17 bajtów :Rotate#{1+Iota@_}

18 bajtów :Rotate#(1&`+@Iota)

19 bajtów :Rotate#(Succ=>Iota)

Conor O'Brien
źródło
2

J , 7 bajtów

#\|."{]

Wypróbuj online!

Wyjaśnienie:

  |."{    - rotate ( "{ is short for "0 1 - rank 0 1 ) 
      ]   - the input
#\        - lenght of the successive prefixes of the input 
Galen Iwanow
źródło
2
Takie używanie "jest bardzo sprytne i wymaga znajomości języka w słowniku. Czy istnieje także czasownik z rangą 1 0?
Adám
@ Adám Myślę, że tak "#:. Nauczyłem się tego tutaj od Frownyfrog
Galen Ivanov
2

C (32-bit), 58 51 50 bajtów

-1 bajt dla ładnej okrągłej liczby dzięki pułapce cat

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

Wypróbuj online!

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.
}

źródło
Zaproponuj ~++i+printf("%s%.*s\n",s+i,i,s)zamiasti++<printf("%s%.*s\n",s+i,i,s)-2
ceilingcat
@ceilingcat Dzięki, jak zawsze!
@ceilingcat Naprawdę powinieneś się nazywać flooringcat.
1

Węgiel drzewny , 10 bajtów

⮌Eθ⭆θ§θ⁻μκ

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

  θ         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

Obracają się w kierunku przeciwnym, zastępuje Minussię Plus.

Neil
źródło
1

Python 2 , 54 48 bajtów

lambda i:[i[x:]+i[:x]for x in range(1,len(i)+1)]

Wypróbuj online!

Dobrze pokonany przez xnor, ale i tak opublikowany jako alternatywne podejście.

ElPedro
źródło
1

Perl 6 , 32 bajty

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

Wypróbuj online!

m:ex/^(.*)(.+)$/ exsilnie mwciska podany regex, dzieląc łańcuch wejściowy w każdym możliwym miejscu, z tym wyjątkiem, że drugi podłańcuch musi mieć co najmniej jeden znak - co zapobiega dwukrotnemu wyświetlaniu łańcucha wejściowego na wyjściu. Następnie każda z Matchgrup przechwytywania wynikowych obiektów jest redukowana ( []) do pojedynczego łańcucha za R~pomocą operatora odwrotnej konkatenacji łańcucha.

Sean
źródło
1

Pushy , 4 bajty

L:{"

Wypróbuj online!

L:    \ Length of the string times do:
  {   \    Cyclically shift left once
   "  \    Print
FlipTack
źródło
1

PowerShell, 44 bajty

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

Skrypt testowy:

$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
}

wydajność:

True
ohnj
hnjo
njoh
john
True
eeheeh
eheehe
heehee
eeheeh
eheehe
heehee
mazzy
źródło
1

Tcl , 80 91 bajtów

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

Wypróbuj online!

sergiol
źródło
Ponownie przypisz tekst za każdym razem, aby zaoszczędzić trochę bajtówproc R t {time {puts [set t [string ra $t 1 end][string in $t 0]]} [string len $t]}
David
Zmniejszono go do 80 bajtów dzięki @david
sergiol
1

Lua , 61 bajtów

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

Wypróbuj online!

Podziel ciąg przy kolejnych indeksach od jednego do długości łańcucha (indeksowanie na podstawie jednego), połącz elementy w odwrotnej kolejności, wydrukuj.

cyklista
źródło
1

Rubin , 39 bajtów

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

Wypróbuj online!

acornellier
źródło
1
Witamy na stronie! Nie wygląda na to, że Twój link TIO odpowiada twojej odpowiedzi. Wygląda również na to, że twoja odpowiedź nie pasuje do naszych wymagań wejścia / wyjścia. Możesz użyć funkcji lub STDIN / STDOUT, ale nie zezwalamy na zmianę przypisania zmiennej.
Wheat Wizard,
Dzięki, Garf. Nie jestem pewien, jak udało mi się zepsuć oba. Teraz powinno być dobrze.
acornellier
1

JavaScript, 48 43 36 bajtów

-5 bajtów dzięki uprzejmości @Bubbler * -7 bajtów dzięki uprzejmości @Shaggy

Dane wejściowe to tablica znaków, a dane wyjściowe to tablica znaków.

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

Wypróbuj online!

guest271314
źródło
1
43 bajty .
Bubbler,
1
36 bajtów
Kudłaty
@Shaggy Czy to ważna liczba bajtów i wpis? Nie [..."john"]liczy się jako manipulowanie łańcuchem wejściowym w tablicy przed wywołaniem funkcji?
guest271314
@ guest271314, dane wejściowe są znakami, a dane wyjściowe to tablice tablic znaków, które są dozwolone przez specyfikację wyzwania i nasze wartości domyślne we / wy.
Kudłaty
@Shaggy Zaktualizowano. Czy możesz uprzejmie zostawić powyższy komentarz? A może powinien zawierać Twój komentarz, aby uniknąć nieporozumień? Czy też nie jest konieczne?
guest271314
1

Common Lisp, 88 bajtów

(lambda(x)(loop for s from 1 to(length x)do(format t"~a~a "(subseq x s)(subseq x 0 s))))

Wypróbuj online!

Renzo
źródło
1

MBASIC , 69 66 bajtów

-3 bajty, dzięki Ørjan Johansen

1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT
wooshinyobject
źródło
Podejrzewam, że możesz to skrócić 1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT.
Ørjan Johansen
@ Ørjan Johansen Bardzo miło, dziękuję.
wooshinyobject
1

pieprzenie mózgu , 38 bajtów

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

Wypróbuj online!

Oparty na pomyśle JoKinga, aby używać znaków null jako symboli spacji. Ten kod oznacza bieżące litery do wydrukowania i zapętla się, aż dojdzie do lewego końca.

,[>>,]<<    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
dorycki
źródło