Menggeser karakter dalam sebuah string

12

Dalam tantangan ini, Anda diharuskan untuk menggeser karakter dalam string yang dimasukkan n beberapa kali dan menghasilkan string yang digeser

Memasukkan

Input pertama akan berisi string. Di baris berikutnya, bilangan bulat, yang menunjukkan nakan ada.

Keluaran

  • Jika npositif, pindahkan karakter dalam string ke waktu yang tepat n.
  • Jika nnegatif, pindahkan karakter dalam string ke waktu kiri n.
  • Jika nnol, jangan menggeser karakter dalam string.

Setelah bergeser (kecuali bila nnol), cetak string yang digeser.

Catatan

  • String tidak akan kosong atau null.
  • String tidak akan lebih dari 100 karakter dan hanya akan berisi karakter ASCII dalam rentang (spasi) hingga ~(tilde) (kode karakter 0x20 hingga 0x7E, inklusif). Lihat tabel ASCII untuk referensi.
  • Pergeserannya adalah siklik.
  • Jumlahnya nbisa positif, negatif, atau nol.
  • n akan selalu lebih besar dari atau sama dengan -1000 dan lebih rendah dari atau sama dengan 1000
  • Anda dapat mengambil input melalui stdinatau dari argumen baris perintah
  • String yang digeser harus dihasilkan dalam stdout(atau setara terdekat)
  • Anda dapat menulis program lengkap atau fungsi yang mengambil input dan output string stdoutatau setara terdekat

Uji Kasus

1)

Hello world!
5             -->orld!Hello w

2)

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

3)

~~~
1000          -->~~~

4)

12345
0             -->12345

5)

ABA
17            -->BAA

Mencetak gol

Ini adalah , jadi pengiriman terpendek (dalam byte) menang.

Spikatrix
sumber

Jawaban:

5

Pyth, 4 byte

.>zQ

Ini hampir mirip dengan versi 5 byte CJam saya , kecuali bahwa Pyth sebagai operator input auto-eval Q.

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

Cobalah online di sini

Pengoptimal
sumber
Solusi yang persis sama dengan ini :-)
Spikatrix
@ CoolGuy Cukup lurus ke depan. Padahal, saya tidak melihat ini di sandbox ..
Pengoptimal
Tampaknya tidak lagi berfungsi karena suatu alasan. Berikut alternatif yang berfungsi, juga 4 byte.
hakr14
3

Javascript ( ES5 ), 55 52 byte

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

Berkomentar:

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
    )
nderscore
sumber
2

CJam, 5 byte

llim>

Ini cukup lurus ke depan.

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

Cobalah online di sini

Pengoptimal
sumber
1
Apakah ini termasuk dalam fungsi bawaan?
LegionMammal978
@ LegionMammal978 Ini adalah fungsi bawaan . Tetapi OP tidak membatasi penggunaan built
Pengoptimal
1
Fungsi bawaan adalah celah standar .
LegionMammal978
4
@ LegionMammal978 Anda mengarahkan ke jawaban yang memiliki suara hampir 50-50 naik / turun. Itu bukan keputusan komunitas.
Pengoptimal
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]);}

Lebih jelas adalah versi argumen fungsi yang dimodifikasi untuk membuat versi argumen baris perintah

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

Yang ini hanya 68 byte, yang hanya menunjukkan betapa dirugikannya C ketika berhadapan dengan argumen baris perintah.

Jika shift,, npositif maka strlen(s)-n%strlen(s)offset dan jika nnegatif offset tersebut -n%strlen(s). The printfcetakan dari offset, c, sampai akhir string, dan kemudian final ckarakter dari awal.

Contoh:

$ ./rotstr "Halo dunia!" 5
orld! Hello w
$ ./rotstr "Pengujian ..." -3
ting ... Tes
$ ./rotstr "~~~" 1000
~~~
$ ./rotstr "12345" 0
12345
$ ./rotstr "ABA" 17
BAA
$ ./rotstr "Halo dunia!" -16
o dunia! Neraka
CL-
sumber
Itu tidak bekerja seperti yang diharapkan untuk saya. Ketika v[2]adalah "1", kode hanya output string tanpa modifikasi apapun. Dan hanya "~~~"dan "12345"karya. Sisanya memberikan output yang salah. Jika semuanya dirotasi sekali lagi, pasti sudah diperbaiki.
Spikatrix
Saya sudah mengujinya dengan gcc dan (dengan sedikit modifikasi main(a,v,n)-> n;main(a,v)) berdentang di linux dan berfungsi seperti yang diharapkan. Untuk gcc saya menggunakan versi 5.1.0 dan kompilasi dengan gcc -o rotstr rotstr.c. Kompiler apa yang Anda gunakan?
CL-
Sudah mencoba membuat nglobal juga. Masalah yang sama. Saya dikompilasi menggunakan gcc file.c -o file. Saya menggunakan GCC 4.8.1 di windows. Apakah ada perilaku yang tidak terdefinisi dalam kode Anda?
Spikatrix
Mengganti v[2]-v[1]-1dengan strlen(v[1])mungkin membuat perbedaan, itulah satu-satunya tempat saya bisa memikirkan sesuatu yang halus terjadi. Sayangnya saya tidak memiliki akses ke mesin windows untuk menguji.
CL-
Iya. Kode berfungsi ketika saya mengubahnya.
Spikatrix
2

Python 3, 45 byte

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

Inti dari program ini adalah

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

Semua yang lain hanyalah pekerjaan yang canggung dengan I / O.

Gagang pintu
sumber
2
Ini gagal untuk ABA 17kasus uji terakhir , dan akan secara umum jika|n| > length of string
Sp3000
jika Anda menggunakan n=int(input())%len(s);, itu akan bekerja untuk bilangan bulat lebih besar dari panjang string, tetapi membutuhkan 7 karakter lebih
JPMC
2

K, 8 7 byte

{|x!|y}

Sudah ada "putar" primitif ( !) yang melakukan generalisasi operasi ini untuk daftar. String K adalah daftar karakter, jadi itu berlaku. Namun, spec lebih menyukai CJam dan Pyth, karena rotate K kebetulan bergerak berlawanan arah dengan apa yang diinginkan. Membungkus !fungsi dan meniadakan argumen implisit xakan melakukan apa yang kita inginkan:

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

Pendekatan yang sedikit lebih pendek, yang disarankan oleh kirbyfan64sos, adalah menghilangkan tanda kurung dan negasi untuk membalikkan string ( |) sebelum dan sesudah rotasi.

Jika bukan karena ketidakcocokan impedansi ini, solusinya akan sederhana

!

Disebut secara identik:

  f:!
!
  f[5;"Hello, World!"]
", World!Hello"
  f[-5;"Hello, World!"]
"orld!Hello, W"
  f[0;"Hello, World!"]
"Hello, World!"
JohnE
sumber
1
Akankah membalik string dengan |, memutarnya, dan membalikkannya lagi menghasilkan hasil yang sama? Jika demikian, Anda dapat memotong satu karakter.
kirbyfan64sos
Poin bagus! Itu akan berhasil.
JohnE
1

Pip, 10 byte

Ini sangat mungkin ditingkatkan lebih lanjut. Namun, untuk bahasa tanpa operator shift, 10 byte tidak buruk.

a@_M-b+,#a

Penjelasan:

            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)

Ia bekerja karena tali dan daftar indeks di Pip adalah siklus: "Hello"@9 == "Hello"@4 == "o".

DLosc
sumber
1

rs , 180 chars

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

Demo langsung .

Sebagian besar dari ini membalikkan string jika angka input negatif. Saya mengambil keuntungan dari kenyataan bahwa hanya beberapa karakter ASCII yang inputnya valid dan menggunakan tab untuk keuntungan saya.

Perhatikan bahwa saya harus sedikit curang: karena rs adalah pengubah teks baris tunggal, saya harus menggunakan <number> <text>sebagai format input.

kirbyfan64sos
sumber
1

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

Mengambil input melalui baris perintah.

cukup lucu, awalnya saya tidak sengaja membalikkan bagaimana string seharusnya digeser. Tetapi memperbaiki kesalahan itu lebih pendek dengan hanya mengalikan n dengan -1 lalu menulis logika dengan benar.

diperluas:

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));
    }
}
Jack Ammo
sumber
Mengapa Anda memiliki enum S{; ... }?
Spikatrix
1
Saya memilih untuk menulis program lengkap karena 9 byte tidak benar-benar akan membuat perbedaan besar. Juga merupakan pengingat ketika saya melihat ke belakang untuk lebih memilih enum S {; ...} daripada kelas S {...} karena (meskipun mereka mengambil jumlah byte yang sama dalam contoh ini) jika saya perlu memiliki instance kelas, dibutuhkan satu byte lebih banyak dengan versi enum: enum S {X; ...}. Ini membantu jika saya ingin mendeklarasikan metode atau variabel di kelas tanpa harus menggunakan kata kunci statis atau secara eksplisit instantiating objek baru kelas.
Jack Ammo
Wow! Bagus. Tidak pernah tahu bahwa enums dapat digunakan seperti ini!
Spikatrix
Saya tahu sudah hampir dua tahun sejak Anda memposting ini, tetapi Anda dapat bermain golf beberapa hal. Integer.parseIntdapat berupa new Integer(-5 byte); dan n%=l;dapat dihapus jika Anda mengubah r[0].substring(n)+ke r[0].substring(n%=l)+(-2 byte). Juga, Anda mungkin ingin menentukan ini adalah Java 6, karena di Java 7 atau lebih tinggi enum dengan main-method tidak lagi mungkin.
Kevin Cruijssen
terlalu malas untuk repot mengedit, tetapi terkenal karena penghematan.
Jack Ammo
1

PHP> = 7.1, 88 Bytes (Tidak Bersaing)

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

Testcases

Jörg Hülsermann
sumber
Mengapa 'tidak bersaing'?
Spikatrix
@CoolGuy Versi PHP yang digunakan adalah build setelah pertanyaan dimulai
Jörg Hülsermann
1

Casio Basic, 27 byte

StrRotate s,s,-n:Print s

Ternyata, ada built-in untuk ini di Casio ClassPad! Tapi itu bekerja secara terbalik -n.

24 byte untuk kode, 3 byte untuk ditentukan s,nsebagai argumen.

numbermaniac
sumber
1

05AB1E , 6 byte

DgI+FÁ

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Karena 05AB1E hanya memiliki builtin untuk Rotate satu kali ke kanan / kiri , dan bukan Rotate Njumlah ke kanan / kiri , saya memutar length + inputjumlah kali dan memutar itu berkali-kali ke arah kanan.

Sebagai contoh:

  • "Pengujian ..." dan -3 akan berputar 10 + -3 = 7kali ke kanan, menghasilkan ting...Tes.
  • "Hello world" dan 5 akan berputar 11 + 5 = 16kali ke kanan, menghasilkan worldHello.
Kevin Cruijssen
sumber
0

Julia 0,6 , 31 byte

s|n=String(circshift([s...],n))

Cobalah online!

sundar - Pasang kembali Monica
sumber
0

Perl 5 + -palF, 26 byte

$_=substr$_.$_,@F-<>%@F,@F

Cobalah online!

Dom Hastings
sumber