String-Rotation - Ausgabe-String, bei dem das erste Zeichen wiederholt bis zum Ende verschoben wird

22

Hier besteht die Herausforderung darin, eine Zeichenfolge zu nehmen und alle ihre Rotationen auszugeben, indem das erste Zeichen einmal pro Zeichen in der Zeichenfolge bis zum Ende verschoben wird und mit der ursprünglichen Zeichenfolge endet:

john -> ohnj, hnjo, njoh, john

Sie können auch in die andere Richtung fahren und die Zeichen vom Ende verschieben:

john -> njoh, hnjo, ohnj, john

Sie sollten immer noch eine Umdrehung pro Buchstabe ausgeben, auch wenn das ursprüngliche Wort zuvor erreicht wurde:

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

Zeichenarrays sind zulässig, solange das Ergebnis wie oben gezeigt funktioniert.

Kürzeste Antwort gewinnt!

I_P_Edwards
quelle
5
Wenn eine Zeichenfolge wie heeheein weniger Zyklen als in ihrer Länge zur ursprünglichen Reihenfolge zurückkehrt, hören wir dann dort auf? Ich gehe davon aus, dass dies für viele Antworten einen großen Unterschied bedeuten wird.
xnor
Dürfen wir in die andere Richtung radeln?
xnor
2
Ich habe die Frage einschließlich Ihrer Erläuterungen bearbeitet. Sie können sie jederzeit ändern, wenn sie nicht Ihren Vorstellungen entspricht.
8.
1
@xnor das sieht viel klarer aus als mein ursprünglicher Beitrag, vielen Dank!
I_P_Edwards
1
Dürfen wir Zeichenfelder eingeben / ausgeben? (Die Unterscheidung kann in einigen Sprachen wichtig sein.)
LegionMammal978

Antworten:

7

Gelee , 2 Bytes

ṙJ

Ein monadischer Link, der eine Liste von Zeichen akzeptiert, die eine Liste von Zeichenlisten ergibt

Probieren Sie es online! (Die Fußzeile wird hübsch gedruckt, indem der Link aufgerufen und mit Zeilenumbruchzeichen verbunden wird.)

Jonathan Allan
quelle
6

Python 2 , 38 Bytes

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

Probieren Sie es online!

xnor
quelle
Python 3 besteht nur noch aus 9 Bytes.
wizzwizz4
1
@ wizzwizz4 Woher hast du 9? Python 3 - 39 Bytes (
Standardeingabe
@ pizzapants184 Ich habe vergessen, dass die Zeichenfolgen unveränderlich sind. Du hast recht; Es ist nur noch 1 Byte.
wizzwizz4
4

Japt, 5 3 Bytes

Übernimmt die Eingabe als Zeichenarray und gibt ein Array von Zeichenarrays aus

£=é

Probieren Sie es hier aus

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

Brainfuck , 59 Bytes

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

Probieren Sie es online!

Gibt jede durch Null-Bytes getrennte Zeichenfolge aus.

Erläuterung:

,[>,]    # 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
Scherzen
quelle
3

MATL , 6 5 Bytes

tf&+)

1 Byte gespart dank @luis!

Probieren Sie es bei MATL Online !

Erklärung :

    # 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
quelle
@ LuisMendo Clever! Vielen Dank!
Suever
3

Wolfram Language (Mathematica) , 35 26 Bytes

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

Probieren Sie es online!

Nimmt eine Liste von Zeichen als Eingabe.

Partition(aber nicht StringPartitiondie unten verwendete Variante ) verfügt über ein optionales viertes Argument, um die Eingabe als zyklisch zu behandeln (und anzugeben, wie genau dies erfolgen soll), wodurch diese Lösung einfacher als die Zeichenfolge ist - zusätzlich dazu, dass keine 15 Zeichen erstellt werden -in Funktionen.

Wolfram Language (Mathematica) , 44 Byte

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

Probieren Sie es online!

Das gleiche, nimmt aber einen String als Eingabe.

Turns "john"in "johnjohn"nimmt dann alle längen- StringLength["john"]Strings dieser Zeichenfolge mit Offset 1, produziert {"john","ohnj","hnjo","njoh","john"}, dann fällt die erste von diesen mit Rest.

Mischa Lawrow
quelle
Da Zeichenarrays erlaubt sind, Rest@Partition[#~Join~#,Length@#,1]&wären das 36 Bytes.
LegionMammal978
@ LegionMammal978 Danke! Es gibt wahrscheinlich auch einen kürzeren Ansatz für Zeichen-Arrays, obwohl mir noch nichts eingefallen ist.
Mischa Lawrow
2

Attache , 13 Bytes

Rotate#{1:#_}

Probieren Sie es online!

Erläuterung

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

Alternativen

15 Bytes :{_&Rotate!1:#_}

16 Bytes :{Rotate[_,1:#_]}

16 Bytes :Rotate@Rotations

16 Bytes :Rotate#(1&`:@`#)

17 Bytes :Rotate#{1+Iota@_}

18 Bytes :Rotate#(1&`+@Iota)

19 Bytes :Rotate#(Succ=>Iota)

Conor O'Brien
quelle
2

J , 7 Bytes

#\|."{]

Probieren Sie es online!

Erläuterung:

  |."{    - rotate ( "{ is short for "0 1 - rank 0 1 ) 
      ]   - the input
#\        - lenght of the successive prefixes of the input 
Galen Ivanov
quelle
2
So etwas zu "benutzen ist sehr clever und erfordert Wörterbuchkenntnisse der Sprache. Gibt es auch ein Verb mit Rang 1 0?
Adám
@Adám Ich denke es ist "#:. Das habe ich hier von Frownyfrog
Galen Ivanov
2

C (32 Bit), 58 51 50 Bytes

-1 Byte für eine schöne runde Zahl dank ceilingcat

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

Probieren Sie es 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.
}

quelle
Schlagen Sie ~++i+printf("%s%.*s\n",s+i,i,s)stattdessen vori++<printf("%s%.*s\n",s+i,i,s)-2
ceilingcat
@ceilingcat Danke, wie immer!
@ceilingcat Du solltest wirklich angerufen werden flooringcat.
1

Kohle , 10 Bytes

⮌Eθ⭆θ§θ⁻μκ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

  θ         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

Um in die entgegengesetzte Richtung zu drehen, ersetzen Sie Minusdurch Plus.

Neil
quelle
1

Python 2 , 54 48 Bytes

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

Probieren Sie es online!

Gut geschlagen von xnor, aber trotzdem als Alternative gepostet.

ElPedro
quelle
1

Perl 6 , 32 Bytes

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

Probieren Sie es online!

m:ex/^(.*)(.+)$/ exDient mzum schnellen Abgleichen des angegebenen regulären Ausdrucks und Aufteilen der Eingabezeichenfolge an jeder möglichen Stelle, mit der Ausnahme, dass die zweite Teilzeichenfolge mindestens ein Zeichen enthalten muss. Dadurch wird verhindert, dass die Eingabezeichenfolge in der Ausgabe zweimal angezeigt wird. Dann wird jede MatchErfassungsgruppe der resultierenden Objekte []mit R~dem umgekehrten Zeichenfolgenverkettungsoperator auf eine einzelne Zeichenfolge reduziert ( ) .

Sean
quelle
1

Powershell, 44 Bytes

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

Testskript:

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

Ausgabe:

True
ohnj
hnjo
njoh
john
True
eeheeh
eheehe
heehee
eeheeh
eheehe
heehee
mazzy
quelle
1

Tcl , 80-91 Bytes

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

Probieren Sie es online!

Sergiol
quelle
Weisen Sie Text jedes Mal neu zu, um einige Bytes zu speichernproc R t {time {puts [set t [string ra $t 1 end][string in $t 0]]} [string len $t]}
David
Dank @david
sergiol
1

Lua , 61 Bytes

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

Probieren Sie es online!

Teilen Sie die Zeichenfolge bei aufeinanderfolgenden Indizes von 1 auf die Länge der Zeichenfolge auf (einseitige Indizierung), verketten Sie die Teile in umgekehrter Reihenfolge, und drucken Sie sie aus.

Cyclaminist
quelle
1

Ruby , 39 Bytes

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

Probieren Sie es online!

Eichhörnchen
quelle
1
Willkommen auf der Seite! Es sieht nicht so aus, als ob Ihr TIO-Link Ihrer Antwort entspricht. Es scheint auch, dass Ihre Antwort nicht mit unseren Anforderungen an die Eingabe / Ausgabe übereinstimmt. Sie können entweder eine Funktion oder STDIN / STDOUT verwenden, die variable Neuzuweisung ist jedoch nicht zulässig.
Wheat Wizard
Vielen Dank, Garf. Ich bin nicht sicher, wie ich es geschafft habe, beide durcheinander zu bringen. Sollte jetzt alles gut sein.
Eichhörnchen
1

JavaScript, 48 43 36 Bytes

-5 Bytes mit freundlicher Genehmigung von @Bubbler * -7 Bytes mit freundlicher Genehmigung von @Shaggy

Die Eingabe ist ein Zeichenarray und die Ausgabe ist ein Array von Zeichenarrays.

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

Probieren Sie es online!

guest271314
quelle
1
43 Bytes .
Bubbler
1
36 Bytes
Shaggy
@ Shaggy Ist das eine gültige Byteanzahl und ein gültiger Eintrag? Gilt [..."john"]nicht als Manipulation der Eingabezeichenfolge für ein Array vor dem Funktionsaufruf?
guest271314
@ guest271314, input ist ein Zeichen und output ist ein Array von Zeichenarrays, die in der Challenge-Spezifikation und unseren E / A-Standardwerten zulässig sind.
Shaggy
@ Shaggy aktualisiert. Können Sie bitte Ihren obigen Kommentar hinterlassen? Oder sollte Ihr Kommentar in die Antwort aufgenommen werden, um Verwirrung zu vermeiden? Oder ist beides nicht nötig?
guest271314
1

Common Lisp, 88 Bytes

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

Probieren Sie es online!

Renzo
quelle
1

MBASIC , 69 66 Bytes

-3 Bytes, danke an Ørjan Johansen

1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT
wooshinyobject
quelle
Ich vermute, Sie können das auf kürzen 1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT.
Ørjan Johansen,
@ Ørjan Johansen Sehr schön, danke.
Wooshinyobject
1

Brainfuck , 38 Bytes

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

Probieren Sie es online!

Basierend auf der Idee von JoKing, Nullzeichen als Leerzeichen zu verwenden. Dieser Code markiert die aktuell zu druckenden Buchstaben und führt eine Schleife durch, bis das linke Ende erreicht ist.

,[>>,]<<    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
Dorian
quelle