Rotasi string - string keluaran berulang kali memindahkan karakter pertama ke akhir

22

Tantangannya di sini adalah untuk mengambil string dan mengeluarkan semua rotasinya, dengan berulang kali memindahkan karakter pertama ke akhir, sekali per karakter dalam string, berakhir dengan string asli:

john -> ohnj, hnjo, njoh, john

Anda juga dapat berputar ke arah lain, memindahkan karakter dari ujung:

john -> njoh, hnjo, ohnj, john

Anda masih harus mengeluarkan satu rotasi per huruf bahkan jika kata aslinya tercapai sebelum itu:

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

Array karakter diperbolehkan, selama hasilnya berfungsi seperti yang ditunjukkan di atas.

Jawaban terpendek menang!

I_P_Edwards
sumber
5
Jika string suka heeheekembali ke urutan semula dalam siklus yang lebih sedikit dari panjangnya, apakah kita berhenti di situ? Saya berharap ini akan membuat perbedaan besar untuk banyak jawaban.
xnor
Bisakah kita berputar ke arah yang lain?
xnor
2
Saya mengedit pertanyaan termasuk klarifikasi Anda, silakan mengubahnya jika bukan yang Anda maksud.
xnor
1
@ xnor yang terlihat jauh lebih jelas daripada posting asli saya, terima kasih banyak!
I_P_Edwards
1
Apakah kita diizinkan untuk memasukkan / mengeluarkan array karakter? (Perbedaannya bisa penting dalam beberapa bahasa.)
LegionMammal978

Jawaban:

7

Jelly , 2 byte

ṙJ

Tautan monadik yang menerima daftar karakter yang menghasilkan daftar daftar karakter

Cobalah online! (footer cetakan cantik dengan memanggil tautan dan bergabung dengan karakter baris baru)

Jonathan Allan
sumber
8

Haskell, 27 byte

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

Cobalah online!

nimi
sumber
6

Python 2 , 38 byte

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

Cobalah online!

Tidak
sumber
Python 3 hanya 9 byte lagi.
wizzwizz4
1
@ wizzwizz4 Dari mana Anda mendapat 9? Python 3 - 39 byte (input stdin tanpa tanda kutip)
pizzapants184
@ pizzapants184 Saya lupa bahwa string tidak dapat diubah; kamu benar; hanya 1 byte lagi.
wizzwizz4
6

JavaScript (ES6), 37 32 byte

Mengembalikan array string.

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

Cobalah online!

Arnauld
sumber
4

Japt, 5 3 byte

Mengambil input sebagai array karakter, menghasilkan array array karakter

£=é

Coba di sini

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

brainfuck , 59 byte

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

Cobalah online!

Output setiap string dipisahkan oleh null bytes.

Penjelasan:

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

MATL , 6 5 byte

tf&+)

1 byte disimpan berkat @luis!

Cobalah di MATL Online !

Penjelasan :

    # 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
sumber
@LuisMendo Pintar! Terima kasih!
Suever
3

Bahasa Wolfram (Mathematica) , 35 26 byte

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

Cobalah online!

Mengambil daftar karakter sebagai input.

Partition(tetapi bukan variannya yang StringPartitiondigunakan di bawah) memiliki argumen opsional keempat untuk memperlakukan inputnya sebagai siklik (dan untuk menentukan bagaimana tepatnya melakukannya), yang membuat solusi ini lebih sederhana daripada string - selain tidak memiliki karakter 15 karakter yang dibangun dalam fungsi.

Bahasa Wolfram (Mathematica) , 44 byte

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

Cobalah online!

Sama, tetapi mengambil string sebagai input.

Berubah "john"menjadi "johnjohn", lalu ambil semua StringLength["john"]substring panjang dari string ini dengan offset 1, produksi {"john","ohnj","hnjo","njoh","john"}, lalu masukkan yang pertama dengan ini Rest.

Misha Lavrov
sumber
Karena array karakter diperbolehkan, Rest@Partition[#~Join~#,Length@#,1]&akan menjadi 36 byte.
LegionMammal978
@ LegionMammal978 Terima kasih! Mungkin juga ada pendekatan yang lebih pendek dengan array karakter, meskipun saya belum memikirkan apa pun.
Misha Lavrov
2

Attache , 13 byte

Rotate#{1:#_}

Cobalah online!

Penjelasan

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

Alternatif

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

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

16 byte :Rotate@Rotations

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

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

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

19 byte :Rotate#(Succ=>Iota)

Conor O'Brien
sumber
2

J , 7 byte

#\|."{]

Cobalah online!

Penjelasan:

  |."{    - rotate ( "{ is short for "0 1 - rank 0 1 ) 
      ]   - the input
#\        - lenght of the successive prefixes of the input 
Galen Ivanov
sumber
2
Menggunakan "seperti itu sangat pintar, dan membutuhkan pengetahuan kamus bahasa. Apakah ada kata kerja dengan peringkat 1 0?
Adem
@ Adám saya pikir itu "#:. Saya belajar ini di sini dari Frownyfrog
Galen Ivanov
2

R , 58 byte

function(s,`[`=substring)paste0(s[n<-nchar(s):1],s[1,n-1])

Cobalah online!

menggali semua
sumber
2

C (32-bit), 58 51 50 byte

-1 byte untuk angka bulat yang bagus berkat ceilingcat

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

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

sumber
Sarankan ~++i+printf("%s%.*s\n",s+i,i,s)alih-alihi++<printf("%s%.*s\n",s+i,i,s)-2
ceilingcat
@ceilingcat Terima kasih, seperti biasa!
@ceilingcat Anda benar-benar harus dipanggil flooringcat.
1

Arang , 10 byte

⮌Eθ⭆θ§θ⁻μκ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  θ         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

Untuk memutar ke arah yang berlawanan, ganti Minusdengan Plus.

Neil
sumber
1

Python 2 , 54 48 byte

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

Cobalah online!

Dipukul dengan baik oleh xnor tetapi diposting sebagai pendekatan alternatif.

ElPedro
sumber
1

Perl 6 , 32 byte

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

Cobalah online!

m:ex/^(.*)(.+)$/ exsecara agresif mmemecah regex yang diberikan, membelah string input di setiap tempat yang memungkinkan, kecuali bahwa substring kedua harus memiliki setidaknya satu karakter - yang mencegah string input muncul dua kali dalam output. Kemudian masing-masing Matchkelompok tangkapan objek yang dihasilkan direduksi ( []) menjadi string tunggal dengan R~, operator concatenation string terbalik.

Sean
sumber
1

Pushy , 4 byte

L:{"

Cobalah online!

L:    \ Length of the string times do:
  {   \    Cyclically shift left once
   "  \    Print
FlipTack
sumber
1

V , 8 byte

ýñx$pÙñd

Cobalah online!

Hexdump:

00000000: fdf1 7824 70d9 f164                      ..x$p..d
DJMcMayhem
sumber
ýñx$pÙñdmemberikan 8 dengan menghapus kebutuhan untuk H tio.run/##K/v///DewxsrVAoOzzy8MeX/f6/8jDwA
Kritixi Lithos
@Cowsquack Bahkan lebih baik:ý<M-->ñx$pÙ
DJMcMayhem
Bukankah itu mengulangi baris terakhir?
Kritixi Lithos
1

Powershell, 44 byte

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

Skrip uji:

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

keluaran:

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

Tcl , 80 91 byte

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

Cobalah online!

sergiol
sumber
Tetapkan ulang teks pada setiap kali menyimpan beberapa byteproc R t {time {puts [set t [string ra $t 1 end][string in $t 0]]} [string len $t]}
david
Menurunkannya menjadi 80 byte, terima kasih kepada @david
sergiol
1

Lua , 61 byte

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

Cobalah online!

Membagi string pada indeks berurutan dari satu ke panjang string (pengindeksan berbasis satu), menyatukan potongan-potongan dalam urutan terbalik, mencetak.

pengendara sepeda
sumber
1

Ruby , 39 byte

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

Cobalah online!

acornellier
sumber
1
Selamat datang di situs ini! Itu tidak terlihat seperti tautan TIO Anda sesuai dengan jawaban Anda. Tampaknya juga jawaban Anda tidak sesuai dengan persyaratan input / output kami. Anda dapat menggunakan fungsi atau STDIN / STDOUT tetapi kami tidak mengizinkan penetapan ulang variabel.
Wheat Wizard
Garf terima kasih. Tidak yakin bagaimana saya berhasil mengacaukan keduanya. Seharusnya semuanya baik-baik saja sekarang.
acornellier
1

JavaScript, 48 43 36 byte

-5 byte milik @Bubbler * -7 byte milik @Shaggy

Input adalah array karakter dan output adalah array array karakter.

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

Cobalah online!

guest271314
sumber
1
43 byte .
Bubbler
1
36 byte
Shaggy
@Shaggy Apakah itu jumlah dan entri byte yang valid? Tidak [..."john"]dihitung sebagai manipulasi dari string input ke array sebelum pemanggilan fungsi?
tamu271314
@ guest271314, input adalah karakter dan output adalah array array karakter yang diizinkan oleh spec tantangan dan standar I / O kami.
Shaggy
@Shaggy Diperbarui. Bisakah Anda meninggalkan komentar Anda di atas? Atau haruskah komentar Anda dimasukkan pada jawaban untuk menghindari kebingungan? Atau tidak perlu?
guest271314
1

Common Lisp, 88 byte

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

Cobalah online!

Renzo
sumber
1

MBASIC , 69 66 byte

-3 byte, terima kasih kepada Ørjan Johansen

1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT
wooshinyobject
sumber
Saya curiga Anda bisa mempersingkat itu menjadi 1 INPUT S$:L=LEN(S$):FOR I=1 TO L:S$=MID$(S$+S$,2,L):PRINT S$:NEXT.
Ørjan Johansen
@ Ørjan Johansen Bagus sekali, terima kasih.
wooshinyobject
1

brainfuck , 38 byte

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

Cobalah online!

Berdasarkan ide JoKing untuk menggunakan null-karakter sebagai simbol ruang. Kode ini menandai huruf-huruf saat ini untuk dicetak dan diulang sampai mencapai ujung kiri.

,[>>,]<<    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
sumber