Thay đổi ký tự trong một chuỗi


12

Trong thử thách này, bạn được yêu cầu dịch chuyển các ký tự trong chuỗi nhập vào n số lần và xuất chuỗi đã dịch chuyển

Đầu vào

Đầu vào sẽ chứa một chuỗi. Trong dòng tiếp theo, một số nguyên, biểu thị nsẽ có mặt.

Đầu ra

  • Nếu nlà số dương, hãy dịch các ký tự trong chuỗi sang đúng nthời điểm.
  • Nếu nlà âm, dịch chuyển các ký tự trong chuỗi sang nthời gian bên trái .
  • Nếu nbằng 0, đừng dịch chuyển các ký tự trong chuỗi.

Sau khi dịch chuyển (trừ khi nbằng 0), hãy in chuỗi đã dịch.

Ghi chú

  • Chuỗi sẽ không trống hoặc null.
  • Chuỗi sẽ không dài hơn 100 ký tự và sẽ chỉ chứa các ký tự ASCII trong phạm vi (khoảng trắng) đến ~(dấu ngã) (mã ký tự 0x20 đến 0x7E, đã bao gồm). Xem bảng ASCII để tham khảo.
  • Sự thay đổi là theo chu kỳ.
  • Số ncó thể là dương, âm hoặc bằng không.
  • n sẽ luôn luôn lớn hơn hoặc bằng -1000 và nhỏ hơn hoặc bằng 1000
  • Bạn có thể nhận đầu vào thông qua stdinhoặc từ các đối số dòng lệnh
  • Chuỗi dịch chuyển phải được xuất ra trong stdout(hoặc tương đương gần nhất)
  • Bạn có thể viết một chương trình đầy đủ hoặc một hàm lấy đầu vào và đầu ra chuỗi trong stdouthoặc tương đương gần nhất

Các trường hợp thử nghiệm

1)

Hello world!
5             -->orld!Hello w

2)

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

3)

~~~
1000          -->~~~

4)

12345
0             -->12345

5)

ABA
17            -->BAA

Chấm điểm

Đây là , vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng.

Câu trả lời:


5

Bình thường, 4 byte

.>zQ

Điều này gần như tương tự với phiên bản 5 byte CJam của tôi , ngoại trừ Pyth là toán tử nhập tự động Q.

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

Dùng thử trực tuyến tại đây


Chính xác là giải pháp tương tự như sau :-)
Spikatrix

@CoolGuy Nó khá thẳng về phía trước. Mặc dù vậy, tôi không thấy điều này trong hộp cát ..
Trình tối ưu hóa

Có vẻ như không còn làm việc vì một số lý do. Đây là một thay thế hoạt động, cũng có 4 byte.
hakr14

3

Javascript ( ES5 ), 55 52 byte

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

Đã bình luận:

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 byte

llim>

Việc này thật thẳng thắn.

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

Dùng thử trực tuyến tại đây


1
Điều này sẽ thuộc các chức năng tích hợp?
LegionMammal978

@ LegionMammal978 Đây một chức năng được xây dựng. Nhưng OP không hạn chế việc sử dụng nội dung được xây dựng
Trình tối ưu hóa

1
Các hàm tích hợp là các lỗ hổng tiêu chuẩn .
LegionMammal978

4
@ LegionMammal978 bạn chỉ ra một câu trả lời có gần 50-50 phiếu tăng / giảm. Đó không phải là một quyết định của cộng đồng.
Trình tối ưu hóa

2

C, 93 byte

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]);}

Rõ ràng hơn là phiên bản đối số chức năng đã được sửa đổi để tạo phiên bản đối số dòng lệnh

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

Cái này chỉ có 68 byte, nó chỉ cho thấy mức độ bất lợi của C khi xử lý các đối số dòng lệnh.

Nếu thay đổi, nlà dương thì strlen(s)-n%strlen(s)là bù và nếu nâm thì bù là -n%strlen(s). Các printfbản in từ offset, cđến cuối chuỗi, và sau đó là các cký tự cuối cùng từ đầu.

Ví dụ:

$ ./rotstr "Xin chào thế giới!" 5
orld! Xin chào
$ ./rotstr "Đang kiểm tra ..." -3
... Tes
$ ./rotstr "~~~" 1000
~~~
$ ./rotstr "12345" 0
12345
$ ./rotstr "ABA" 17
BAA
$ ./rotstr "Xin chào thế giới!" -16
thế giới ơi!

Nó không hoạt động như mong đợi đối với tôi. Khi v[2]"1", mã đơn giản kết quả đầu ra chuỗi mà không cần bất kỳ sửa đổi. Và chỉ "~~~""12345"hoạt động. Phần còn lại của họ cho đầu ra sai. Nếu tất cả chúng quay thêm một lần nữa, nó sẽ bị sửa.
Spikatrix

Tôi đã thử nghiệm nó với cả gcc và (với một sửa đổi nhỏ main(a,v,n)-> n;main(a,v)) kêu vang trên linux và nó hoạt động như mong đợi. Đối với gcc tôi đang sử dụng phiên bản 5.1.0 và biên dịch với gcc -o rotstr rotstr.c. Trình biên dịch nào bạn đang sử dụng?
CL-

Đã thử làm ntoàn cầu quá. Cùng một vấn đề. Tôi biên dịch bằng cách sử dụng gcc file.c -o file. Tôi đang sử dụng GCC 4.8.1 trên windows. Có bất kỳ hành vi không xác định trong mã của bạn?
Spikatrix

Thay thế v[2]-v[1]-1bằng strlen(v[1])có thể tạo ra sự khác biệt, đó là nơi duy nhất tôi có thể nghĩ về điều gì đó tinh tế đang diễn ra. Thật không may, tôi không có quyền truy cập vào một máy Windows để kiểm tra.
CL-

Đúng. Mã làm việc khi tôi thay đổi điều đó.
Spikatrix

2

Python 3, 45 byte

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

Cốt lõi của chương trình là

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

Tất cả phần còn lại chỉ là công việc vụng về với I / O.


2
Điều này không thành công cho ABA 17trường hợp thử nghiệm cuối cùng và nói chung là nếu|n| > length of string
Sp3000

nếu bạn dùng n=int(input())%len(s); , nó sẽ hoạt động cho các số nguyên lớn hơn độ dài chuỗi, nhưng yêu cầu thêm 7 ký tự
JPMC

2

K, 8 7 byte

{|x!|y}

Đã có một "xoay" ( !) nguyên thủy thực hiện tổng quát hóa thao tác này cho các danh sách. Chuỗi K là danh sách các ký tự, vì vậy nó được áp dụng. Mặc dù vậy, thông số kỹ thuật ủng hộ CJam và Pyth một chút, bởi vì xoay của K xảy ra theo hướng ngược lại với những gì mong muốn. Bao bọc !trong một hàm và phủ định đối số ngầm xsẽ làm những gì chúng ta muốn:

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

Một cách tiếp cận ngắn hơn một chút, được đề xuất bởi kirbyfan64sos, là loại bỏ dấu ngoặc đơn và phủ định có lợi cho việc đảo ngược chuỗi ( |) trước và sau khi xoay.

Nếu không có sự không phù hợp trở kháng này, giải pháp sẽ chỉ đơn giản là

!

Được gọi là giống hệt nhau:

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

1
Việc đảo ngược chuỗi với |, xoay chuỗi đó và đảo ngược lại chuỗi có mang lại kết quả tương tự không? Nếu vậy, bạn có thể cắt bỏ một nhân vật.
kirbyfan64sos

Điểm tốt! Rằng sẽ làm việc.
JohnE

1

Pip, 10 byte

Điều này hoàn toàn có thể được cải thiện hơn nữa. Tuy nhiên, đối với một ngôn ngữ không có toán tử thay đổi, 10 byte không phải là xấu.

a@_M-b+,#a

Giải trình:

            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)

Nó hoạt động vì lập chỉ mục chuỗi và danh sách trong Pip theo chu kỳ : "Hello"@9 == "Hello"@4 == "o".


1

rs , 180 ký tự

^(-\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/

Bản thử trực tiếp .

Hầu hết điều này là đảo ngược chuỗi nếu số đầu vào là âm. Tôi đã lợi dụng thực tế là chỉ có một số ký tự ASCII là đầu vào hợp lệ và sử dụng tab làm lợi thế của tôi.

Lưu ý rằng tôi đã phải gian lận một chút: vì rs là công cụ sửa đổi văn bản một dòng, tôi phải sử dụng <number> <text>làm định dạng đầu vào.


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));}}

Đưa đầu vào thông qua dòng lệnh.

đủ buồn cười, ban đầu tôi đã vô tình đảo ngược làm thế nào chuỗi được cho là được dịch chuyển. Nhưng việc sửa lỗi đó đã ngắn hơn khi chỉ nhân n với -1 sau đó để viết logic đúng.

mở rộng:

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));
    }
}

Tại sao bạn có enum S{; ... }?
Spikatrix

1
Tôi đã chọn viết chương trình đầy đủ vì 9 byte thực sự sẽ không tạo ra sự khác biệt lớn. Ngoài ra, đó là một lời nhắc khi tôi nhìn lại để thích enum S {; ...} hơn lớp S {...} bởi vì (mặc dù chúng chiếm cùng số byte trong ví dụ này) nếu tôi cần phải có một ví dụ của lớp, phải mất thêm một byte với phiên bản enum: enum S {X; ...}. Điều này giúp nếu tôi muốn khai báo một phương thức hoặc biến trong lớp mà không phải sử dụng từ khóa tĩnh hoặc khởi tạo một cách rõ ràng một đối tượng mới của lớp.
Jack Ammo

Ồ Đẹp. Không bao giờ biết rằng enums có thể được sử dụng như thế này!
Spikatrix

Tôi biết đã gần hai năm kể từ khi bạn đăng bài này, nhưng bạn có thể chơi gôn một vài thứ. Integer.parseIntcó thể là new Integer(-5 byte); và n%=l;có thể được loại bỏ nếu bạn thay đổi r[0].substring(n)+thành r[0].substring(n%=l)+(-2 byte). Ngoài ra, bạn có thể muốn chỉ định đây là Java 6, vì trong Java 7 hoặc cao hơn, một enum với main-method không thể thực hiện được nữa.
Kevin Cruijssen

quá lười để bận tâm chỉnh sửa, nhưng lưu ý để tiết kiệm.
Jack Ammo

1

PHP> = 7.1, 88 byte (Không cạnh tranh)

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

Tủ thử


Tại sao "không cạnh tranh"?
Spikatrix

@CoolGuy Phiên bản PHP được sử dụng được xây dựng sau khi bắt đầu câu hỏi
Jörg Hülsermann


1

Casio cơ bản, 27 byte

StrRotate s,s,-n:Print s

Hóa ra, có một tích hợp sẵn cho điều này trên Casio ClassPad! Nhưng nó hoạt động ngược lại, do đó -n.

24 byte cho mã, 3 byte để chỉ định s,nlàm đối số.


1

05AB1E , 6 byte

DgI+FÁ

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Vì 05AB1E chỉ có các nội dung cho Xoay một lần về phía bên phải / bên trái và không Xoay Nsố lượng về phía bên phải / bên trái , tôi lặplength + input số lần và xoay nhiều lần về phía bên phải.

Ví dụ:

  • "Kiểm tra ..." và -3 sẽ xoay 10 + -3 = 7thời gian sang phải, dẫn đếnting...Tes .
  • "Xin chào thế giới" và 5 sẽ quay 11 + 5 = 16lần về phía bên phải, dẫn đến worldHello.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.