การหมุนสตริง - สตริงเอาต์พุตย้ายอักขระตัวแรกไปยังจุดสิ้นสุดซ้ำ ๆ


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

คำตอบ:





6

Python 2 , 38 ไบต์

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

ลองออนไลน์!


Python 3 มีขนาดเพียง 9 ไบต์เท่านั้น
wizzwizz4

1
@ wizzwizz4 คุณได้รับ 9 ที่ไหน Python 3 - 39 ไบต์ (อินพุต stdin โดยไม่มีเครื่องหมายอัญประกาศ)
pizzapants184

@ pizzapants184 ฉันลืมว่าสตริงนั้นไม่เปลี่ยนรูป คุณถูก; เป็นเพียง 1 ไบต์เท่านั้น
wizzwizz4


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

brainfuck , 59 ไบต์

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

ลองออนไลน์!

เอาต์พุตแต่ละสตริงคั่นด้วย null null

คำอธิบาย:

,[>,]    # 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 ฉลาด! ขอบคุณ!
Suever

3

ภาษา Wolfram (Mathematica) , 35 26 ไบต์

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

ลองออนไลน์!

ใช้รายการอักขระเป็นอินพุต

Partition(แต่ไม่ใช่ตัวแปรที่StringPartitionใช้ด้านล่าง) มีอาร์กิวเมนต์ที่สี่ที่เป็นตัวเลือกสำหรับจัดการอินพุตของมันเป็นวงจร (และสำหรับการระบุวิธีการทำเช่นนั้น) ซึ่งทำให้การแก้ปัญหานี้ง่ายกว่าสตริงหนึ่ง - นอกเหนือจากไม่มีอักขระ 15 ตัวใด ๆ ในฟังก์ชั่น

ภาษา Wolfram (Mathematica)ขนาด 44 ไบต์

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

ลองออนไลน์!

เหมือนกัน แต่ใช้สตริงเป็นอินพุต

ผลัดกัน"john"เข้าไป"johnjohn"แล้วจะใช้เวลาทั้งหมด length- StringLength["john"]สตริงของสตริงนี้กับชดเชย 1, การผลิตแล้วลดลงเป็นครั้งแรกของเหล่านี้ด้วย{"john","ohnj","hnjo","njoh","john"}Rest


เนื่องจากอนุญาตให้ใช้อาร์เรย์อักขระRest@Partition[#~Join~#,Length@#,1]&จะเป็น 36 ไบต์
LegionMammal978

@ LegionMammal978 ขอบคุณ! อาจมีวิธีที่สั้นกว่าด้วยอาร์เรย์อักขระแม้ว่าฉันยังไม่ได้คิดอะไรเลย
Misha Lavrov

2

ทูตขนาด 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หรือไม่
อดัม

@ "#:อดัมผมคิดว่ามัน ฉันได้เรียนรู้สิ่งนี้จาก Frownyfrog
Galen Ivanov



2

C (32- บิต), 58 51 50 ไบต์

-1 ไบต์สำหรับจำนวนรอบที่ดีต้องขอบคุณแมวป่า

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

ลองออนไลน์!

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

แนะนำ~++i+printf("%s%.*s\n",s+i,i,s)แทนi++<printf("%s%.*s\n",s+i,i,s)-2
ceilingcat

@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

เพื่อหมุนในทิศทางตรงกันข้ามแทนที่ด้วยMinusPlus




1

Perl 6 , 32 ไบต์

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

ลองออนไลน์!

m:ex/^(.*)(.+)$/ exmการแยก regex ที่กำหนดไว้อย่างเร่งด่วนแยกสตริงอินพุตในทุกที่ที่เป็นไปได้ยกเว้นสตริงย่อยที่สองต้องมีอักขระอย่างน้อยหนึ่งตัว - ซึ่งป้องกันไม่ให้สตริงอินพุตแสดงขึ้นสองครั้งในเอาต์พุต จากนั้นแต่ละMatchกลุ่มการดักจับของวัตถุที่เป็นผลลัพธ์จะถูกลดขนาดลง ( []) เหลือเพียงสายเดียวด้วยR~ตัวดำเนินการเชื่อมต่อสายอักขระที่กลับด้าน



1

V , 8 ไบต์

ýñx$pÙñd

ลองออนไลน์!

hexdump:

00000000: fdf1 7824 70d9 f164                      ..x$p..d

ýñx$pÙñdให้ 8 โดยการลบความต้องการH tio.run/##K/v///DewxsrVAoOzzy8MeX/f6/8jDwA
Kritixi Lithos

@Cowsquack ดียิ่งขึ้น:ý<M-->ñx$pÙ
DJMcMayhem

นั่นไม่ได้ทำซ้ำบรรทัดสุดท้ายหรือไม่
Kritixi Lithos

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

Tcl , 80 91ไบต์

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

ลองออนไลน์!


มอบหมายข้อความใหม่ในแต่ละครั้งจะบันทึกบางไบต์proc R t {time {puts [set t [string ra $t 1 end][string in $t 0]]} [string len $t]}
david

รับไปถึง 80 ไบต์ขอบคุณ @david
sergiol


1

ลัว 61 ไบต์

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

ลองออนไลน์!

แยกสตริงที่ดัชนีต่อเนื่องจากหนึ่งถึงความยาวของสตริง (การทำดัชนีแบบฐานเดียว) เชื่อมต่อชิ้นส่วนตามลำดับย้อนกลับพิมพ์


1

Ruby , 39 ไบต์

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

ลองออนไลน์!


1
ยินดีต้อนรับสู่เว็บไซต์! ดูเหมือนว่าลิงก์ TIO ของคุณจะตรงกับคำตอบของคุณ ดูเหมือนว่าคำตอบของคุณจะไม่ตรงกับข้อกำหนดอินพุต / เอาต์พุตของเรา คุณสามารถใช้ฟังก์ชั่นหรือ STDIN / STDOUT แต่เราไม่อนุญาตให้มีการมอบหมายตัวแปรใหม่
ข้าวสาลีตัวช่วยสร้าง

ขอบคุณ Garf ไม่แน่ใจว่าฉันจัดการให้ยุ่งทั้งคู่ได้อย่างไร ควรจะดีตอนนี้
acornellier

1

JavaScript, 48 43 36 ไบต์

-5 ไบต์ความอนุเคราะห์ของ @Bubbler * -7 bytes ความอนุเคราะห์ของ @Shaggy

อินพุตเป็นอาร์เรย์อักขระและเอาต์พุตเป็นอาร์เรย์ของอักขระอาร์เรย์

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

ลองออนไลน์!


1
43 ไบต์
Bubbler


@Shaggy นั่นคือจำนวนไบต์และรายการที่ถูกต้องหรือไม่ ไม่[..."john"]นับเป็นการจัดการสตริงอินพุตให้กับอาร์เรย์ก่อนการเรียกใช้ฟังก์ชันหรือไม่
guest271314

@ guest271314 อินพุตเป็นอักขระและเอาต์พุตคืออาร์เรย์ของอาร์เรย์อักขระที่ได้รับอนุญาตจากข้อมูลจำเพาะของความท้าทายและค่าเริ่มต้น I / O ของเรา
Shaggy

@Shaggy อัปเดตแล้ว คุณสามารถแสดงความคิดเห็นข้างต้นได้ไหม? หรือความคิดเห็นของคุณควรรวมอยู่ในคำตอบเพื่อหลีกเลี่ยงความสับสน? หรือไม่จำเป็นเลย?
guest271314


1

MBASIC , 69 66 ไบต์

-3 ไบต์ขอบคุณØrjan Johansen

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

brainfuck , 38 ไบต์

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

ลองออนไลน์!

ตามแนวคิดของ JoKing ที่จะใช้อักขระ null เป็นสัญลักษณ์ช่องว่าง รหัสนี้ทำเครื่องหมายตัวอักษรปัจจุบันเพื่อพิมพ์และวนซ้ำจนกว่าจะถึงด้านซ้าย

,[>>,]<<    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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.