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!


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)






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


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

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

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


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)


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 

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

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

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.




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.




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

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!


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.


1

Ruby , 39 byte

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

Cobalah online!


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!




@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!


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.