เลื่อนอักขระในสตริง


12

ในการท้าทายนี้คุณจะต้องเลื่อนอักขระในสตริงที่ป้อนเข้า n จำนวนครั้งและส่งออกสตริงที่เลื่อน

อินพุต

อินพุตจะมีสตริงเป็นอันดับแรก ในบรรทัดถัดไปเป็นจำนวนเต็มซึ่งหมายถึงnจะถูกนำเสนอ

เอาท์พุต

  • ถ้าnเป็นบวกให้เลื่อนอักขระในสตริงไปทางnเวลาที่ถูกต้อง
  • ถ้าnเป็นลบเปลี่ยนตัวอักษรในสตริงไปทางซ้ายnครั้ง
  • ถ้าnเป็นศูนย์อย่าเลื่อนอักขระในสตริง

หลังจากเลื่อน (ยกเว้นเมื่อnมีค่าเป็นศูนย์) ให้พิมพ์สตริงที่เลื่อน

หมายเหตุ

  • nullสตริงจะไม่ว่างหรือ
  • สตริงจะต้องไม่ยาวเกิน 100 ตัวอักษรและจะมีเฉพาะอักขระ ASCII ในช่วง(เว้นวรรค) ถึง~(ตัวหนอน) (รหัสตัวอักษร 0x20 ถึง 0x7E รวมอยู่ด้วย) ดูตาราง ASCIIสำหรับการอ้างอิง
  • การเปลี่ยนแปลงเป็นวัฏจักร
  • จำนวนnอาจเป็นค่าบวกลบหรือศูนย์
  • n จะมากกว่าหรือเท่ากับ -1000 และน้อยกว่าหรือเท่ากับ 1,000 เสมอ
  • คุณสามารถรับอินพุตผ่านstdinหรือจากอาร์กิวเมนต์บรรทัดคำสั่ง
  • สตริงที่เลื่อนต้องถูกเอาต์พุตในstdout(หรือใกล้เคียงที่สุด)
  • คุณสามารถเขียนโปรแกรมแบบเต็มหรือฟังก์ชั่นที่รับอินพุตและเอาต์พุตสตริงในstdoutหรือใกล้เคียงที่สุด

กรณีทดสอบ

1)

Hello world!
5             -->orld!Hello w

2)

Testing...
-3            -->ting...Tes

3)

~~~
1000          -->~~~

4)

12345
0             -->12345

5)

ABA
17            -->BAA

เกณฑ์การให้คะแนน

นี่คือดังนั้นการส่งที่สั้นที่สุด (เป็นไบต์) จะชนะ

คำตอบ:


5

Pyth, 4 ไบต์

.>zQ

นี่เกือบจะคล้ายกับเวอร์ชั่น CJam 5 byte ของฉันยกเว้น Pythนั้นเป็นตัวดำเนินการอินพุตQอัตโนมัติ

.>              # Cyclic right shift of 
  z             # Input first line as string
   Q            # Rest of the input as evaluated integer

ลองออนไลน์ได้ที่นี่


ว่าวิธีการแก้ปัญหาเช่นเดียวกับนี้ :-)
Spikatrix

@CoolGuy มันตรงไปตรงมาสวย แม้ว่าฉันไม่เห็นสิ่งนี้ใน sandbox ..
เครื่องมือเพิ่มประสิทธิภาพ

ดูเหมือนจะไม่ทำงานอีกต่อไปด้วยเหตุผลบางอย่าง นี่คือทางเลือกที่ใช้งานได้เช่นกัน 4 ไบต์
hakr14

3

Javascript ( ES5 ), 55 52 ไบต์

p=prompt;with(p())p(slice(b=-p()%length)+slice(0,b))

แสดงความคิดเห็น:

p = prompt; // store a copy of prompt function for reuse
with(p()) // extend scope chain with first input
    p( // print result
        slice(b = -p() % length) // take second input negated and modulo length
        +                        // and slice string by result
        slice(0, b) // concatenate with opposite slice
    )

2

CJam, 5 ไบต์

llim>

นี่คือตรงไปตรงมาสวย

l               e# Read the first line
 li             e# Read the second line and convert to integer
   m>           e# Shift rotate the first string by second integer places

ลองออนไลน์ได้ที่นี่


1
สิ่งนี้จะตกอยู่ภายใต้ฟังก์ชั่นในตัวหรือไม่?
LegionMammal978

@ LegionMammal978 มันเป็นฟังก์ชั่นในตัว แต่ OP ไม่ได้ จำกัด การใช้งาน ins ที่
เพิ่ม

1
Built-in ฟังก์ชั่นที่มีช่องโหว่มาตรฐาน
LegionMammal978

4
@ LegionMammal978 คุณชี้ไปที่คำตอบซึ่งเกือบ 50-50 โหวตขึ้น / ลง นั่นไม่ใช่การตัดสินใจของชุมชน
เครื่องมือเพิ่มประสิทธิภาพ

2

C, 93 ไบต์

main(a,v,n)char**v;{a=v[2]-v[1]-1;n=atoi(v[2]);a=a*(n>0)-n%a;printf("%s%.*s",v[1]+a,a,v[1]);}

ชัดเจนยิ่งขึ้นคือเวอร์ชันฟังก์ชันอาร์กิวเมนต์ที่ปรับเปลี่ยนเพื่อให้เวอร์ชันอาร์กิวเมนต์บรรทัดคำสั่ง

f(s,n,c)char*s;{c=strlen(s);c=c*(n>0)-n%c;printf("%s%.*s",s+c,c,s);}

อันนี้มีขนาด 68 ไบต์เท่านั้นซึ่งแสดงให้เห็นว่า C ที่ด้อยโอกาสเป็นอย่างไรเมื่อจัดการกับอาร์กิวเมนต์บรรทัดคำสั่ง

หากการเปลี่ยนแปลงที่nเป็นบวกแล้วstrlen(s)-n%strlen(s)จะชดเชยและถ้าเป็นเชิงลบจะชดเชยn พิมพ์จากชดเชย, การสิ้นสุดของสตริงแล้วสุดท้ายตัวละครจากจุดเริ่มต้น-n%strlen(s)printfcc

ตัวอย่าง:

$ ./rotstr "Hello world!" 5
orld! Hello w
$ ./rotstr "การทดสอบ ... " -3
การใช้งาน ... Tes
$ ./rotstr "~~~" 1,000
~~~
$ ./rotstr "12345" 0
12345
$ ./rotstr "ABA" 17
BAA
$ ./rotstr "Hello world!" -16
o world! Hell

มันไม่ทำงานตามที่คาดไว้สำหรับฉัน เมื่อv[2]ใด"1"ที่รหัสจะแสดงผลลัพธ์สตริงโดยไม่มีการแก้ไขใด ๆ และเท่านั้น"~~~"และใช้"12345"งานได้ ส่วนที่เหลือให้ผลที่ไม่ถูกต้อง หากพวกเขาหมุนอีกครั้งมันจะถูกแก้ไข
Spikatrix

ฉันได้ทดสอบทั้ง gcc และ (ด้วยการดัดแปลงเล็กน้อยmain(a,v,n)-> n;main(a,v)) เสียงดังกราวด์บน linux และทำงานได้ตามที่คาดไว้ สำหรับ GCC ฉันใช้เวอร์ชั่น 5.1.0 gcc -o rotstr rotstr.cและรวบรวมกับ คุณใช้คอมไพเลอร์อะไร?
CL-

พยายามสร้างnโลกด้วยเช่นกัน ปัญหาเดียวกัน gcc file.c -o fileผมรวบรวมโดยใช้ ฉันใช้ GCC 4.8.1 บน windows มีพฤติกรรมที่ไม่ได้กำหนดในรหัสของคุณหรือไม่
Spikatrix

การแทนที่v[2]-v[1]-1ด้วยstrlen(v[1])อาจสร้างความแตกต่างนั่นคือที่เดียวที่ฉันนึกถึงบางสิ่งที่เกิดขึ้น น่าเสียดายที่ฉันไม่สามารถเข้าถึงเครื่อง windows เพื่อทดสอบ
CL-

ใช่. รหัสทำงานเมื่อฉันเปลี่ยนที่
Spikatrix

2

Python 3, 45 ไบต์

s=input();n=int(input());print(s[-n:]+s[:-n])

แกนหลักของโปรแกรมคือ

s[-n:]+s[:-n]

ส่วนที่เหลือทั้งหมดเป็นเพียงเงอะงะทำงานกับ I / O


2
สิ่งนี้ล้มเหลวสำหรับABA 17กรณีทดสอบครั้งสุดท้ายและโดยทั่วไปแล้วถ้า|n| > length of string
Sp3000

ถ้าคุณใช้n=int(input())%len(s);มันจะทำงานสำหรับจำนวนเต็มมากกว่าความยาวสตริง แต่ต้องใช้ 7 ตัวอักษรเพิ่มเติม
JPMC

2

K, 8 7 ไบต์

{|x!|y}

มี "การหมุน" แบบดั้งเดิม ( !) ซึ่งดำเนินการการวางนัยของการดำเนินการนี้สำหรับรายการ สตริง K เป็นรายการอักขระดังนั้นจึงมีผลบังคับใช้ สเป็คชอบ CJam และ Pyth เล็กน้อยเนื่องจากการหมุนของ K เกิดขึ้นในทิศทางตรงกันข้ามกับสิ่งที่ต้องการ การตัด!ฟังก์ชั่นและลบล้างข้อโต้แย้งโดยนัยxจะทำสิ่งที่เราต้องการ:

  f:{(-x)!y}
{(-x)!y}
  f[5;"Hello world!"]
"orld!Hello w"
  f[-3;"Testing..."]
"ting...Tes"
  f[17;"ABA"]
"BAA"

วิธีที่สั้นกว่าเล็กน้อยที่แนะนำโดย kirbyfan64sos คือทำไปกับวงเล็บและการปฏิเสธเพื่อสนับสนุนการย้อนกลับสตริง ( |) ก่อนและหลังการหมุน

ถ้าไม่ใช่เพราะความต้านทานนี้ไม่ตรงกันการแก้ปัญหาก็อาจจะง่าย

!

เรียกว่าเหมือนกัน:

  f:!
!
  f[5;"Hello, World!"]
", World!Hello"
  f[-5;"Hello, World!"]
"orld!Hello, W"
  f[0;"Hello, World!"]
"Hello, World!"

1
จะย้อนกลับสตริงด้วย|หมุนที่และย้อนกลับอีกครั้งให้ผลลัพธ์เดียวกัน ถ้าเป็นเช่นนั้นคุณสามารถตัดตัวละคร
kirbyfan64sos

จุดดี! ที่จะทำงาน
JohnE

1

Pip 10 ไบต์

สิ่งนี้อาจจะได้รับการปรับปรุงให้ดียิ่งขึ้นไปอีก สำหรับภาษาที่ไม่มีโอเปอเรเตอร์กะ 10 ไบต์ก็ไม่เลว

a@_M-b+,#a

คำอธิบาย:

            a, b are command-line args (implicit)
       ,#a  range(len(a))
    -b+     range(-b, len(a)-b)
a@_M        map(lambda x: a[x], range(-b, len(a)-b))
            Concatenate the list and print (implicit)

มันทำงานได้เพราะสตริงและรายชื่อการจัดทำดัชนีใน Pip "Hello"@9 == "Hello"@4 == "o"เป็นวัฏจักร:


1

อาร์เอส , 180 ตัวอักษร

^(-\d+) (.*)/\1 \2\t
+^(-\d+) (.)(.*?)\t(.*)$/\1 \3\t\2\4
^(-\d+) \t/\1 
^(-?)(\d+)/\1 (_)^^(\2)
+_(_*) (.*)(.)$/\1 \3\2
^- /- \t
+^- (.*?)\t(.*?)(.)$/- \1\3\t\2
^-? +/
\t/

การสาธิตสด

ส่วนใหญ่จะย้อนกลับสตริงถ้าหมายเลขอินพุตเป็นลบ ฉันใช้ประโยชน์จากข้อเท็จจริงที่ว่ามีเพียงอักขระ ASCII บางตัวเท่านั้นที่เป็นอินพุตที่ถูกต้องและใช้แท็บเพื่อประโยชน์ของฉัน

โปรดทราบว่าฉันต้องโกงนิดหน่อย: เนื่องจากอาร์เอสเป็นตัวดัดแปลงข้อความบรรทัดเดียวฉันจึงต้องใช้<number> <text>เป็นรูปแบบอินพุต


1

Java, 167

enum S{;public static void main(String[]r){int n=-Integer.parseInt(r[1]),l=r[0].length();while(n<0)n+=l;n%=l;System.out.print(r[0].substring(n)+r[0].substring(0,n));}}

รับอินพุตผ่านบรรทัดรับคำสั่ง

ตลกพอเดิมฉันได้ย้อนกลับโดยไม่ตั้งใจว่าสายควรจะเปลี่ยน แต่การแก้ไขข้อผิดพลาดนั้นสั้นกว่าเพียงแค่คูณ n ด้วย -1 เพื่อเขียนตรรกะอย่างถูกต้อง

ขยาย:

enum Shift{
    ;
    public static void main(String[]args){
        int n=-Integer.parseInt(args[1]),length=args[0].length();
        while(n<0)n+=length;
        n%=length;
        System.out.print(args[0].substring(n)+args[0].substring(0,n));
    }
}

ทำไมคุณมีenum S{; ... }?
Spikatrix

1
ฉันเลือกที่จะเขียนโปรแกรมเต็มเพราะ 9 ไบต์ไม่ได้สร้างความแตกต่างอย่างมาก นอกจากนี้ยังเป็นเครื่องเตือนความจำเมื่อฉันมองย้อนกลับไปที่ชอบ Enum S {; ... } มากกว่าคลาส S {... } เพราะ (แม้ว่าพวกเขาจะใช้จำนวนไบต์เดียวกันในตัวอย่างนี้) หากฉันต้องการอินสแตนซ์ ของคลาสใช้เวลาหนึ่งไบต์ขึ้นไปกับรุ่น enum: enum S {X; ... } สิ่งนี้จะช่วยในกรณีที่ฉันต้องการประกาศเมธอดหรือตัวแปรในคลาสโดยไม่ต้องใช้คำสำคัญคงที่หรือสร้างอินสแตนซ์ของวัตถุใหม่ของคลาส
Jack Ammo

ว้าว! ดี ไม่เคยรู้เลยว่าenumมันสามารถใช้แบบนี้ได้!
Spikatrix

ฉันรู้ว่ามันเกือบสองปีแล้วตั้งแต่คุณโพสต์สิ่งนี้ แต่คุณสามารถตีกอล์ฟได้สองสามอย่าง Integer.parseIntสามารถเป็นnew Integer(-5 ไบต์); และn%=l;สามารถลบออกได้หากคุณเปลี่ยนr[0].substring(n)+เป็นr[0].substring(n%=l)+(-2 ไบต์) นอกจากนี้คุณอาจต้องการระบุว่านี่คือ Java 6 เพราะใน Java 7 หรือสูงกว่า enum ที่มีmain-method ไม่สามารถทำได้อีกต่อไป
Kevin Cruijssen

ขี้เกียจเกินไปที่จะรบกวนการแก้ไข แต่มีการบันทึกเพื่อประหยัด
Jack Ammo

1

PHP> = 7.1, 88 ไบต์ (ไม่ใช่การแข่งขัน)

for([,$s,$t]=$argv;$t;)$s=$t<0?substr($s,1).$s[!$t++]:$s[-1].substr($s,!$t--,-1);echo$s;

Testcases


ทำไม 'ไม่แข่งขัน'
Spikatrix

@CoolGuy เวอร์ชัน PHP ที่ใช้คือสร้างหลังจากเริ่มคำถาม
JörgHülsermann


1

Casio Basic, 27 ไบต์

StrRotate s,s,-n:Print s

ตามที่ปรากฏมีในตัวสำหรับ Casio ClassPad นี้! -nแต่การทำงานในสิ่งที่ตรงกันข้ามจึง

24 ไบต์สำหรับโค้ด 3 ไบต์เพื่อระบุว่าs,nเป็นอาร์กิวเมนต์


1

05AB1E , 6 ไบต์

DgI+FÁ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

D         # Duplicate the text input
 g        # Take it's length
          #  i.e. "Testing..." → 10
  I       # Take the integer input
   +      # Add them together
          #  i.e. 10 and -3 → 7
    F     # Loop that many times
     Á    #  And rotate once towards the right during every iteration

ตั้งแต่ 05AB1E มีเพียง buildins สำหรับหมุนหนึ่งครั้งไปทางขวา / ซ้ายและไม่หมุนNจำนวนไปทางขวา / ซ้ายฉันวนซ้ำlength + inputจำนวนครั้งและหมุนไปทางขวาหลายครั้ง

ตัวอย่างเช่น:

  • "การทดสอบ ..." และ -3 จะหมุนครั้งไปทางขวาส่งผลให้ใน10 + -3 = 7ting...Tes
  • "สวัสดีชาวโลก" และ 5 จะหมุนครั้งไปทางขวาส่งผลให้ใน11 + 5 = 16worldHello



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