Membalikkan string dengan potongan

34

Tugas Anda adalah menulis sebuah program yang, diberi nomor dan string, membagi string menjadi potongan-potongan seukuran itu dan membalikkannya.

Aturan

Program Anda akan menerima bilangan bulat positif n, serta string sdengan panjang setidaknya satu yang terdiri dari hanya ASCII yang dapat dicetak (tidak termasuk spasi). Tali kemudian harus dipecah menjadi potongan-potongan panjang n, jika panjang tali tidak habis dibagi oleh nsisa di akhir harus dianggap potongannya sendiri. Kemudian, balik urutan bongkahannya dan satukan kembali.

Uji Kasus

n   s           Output

2   abcdefgh    ghefcdab
3   foobarbaz   bazbarfoo
3   abcdefgh    ghdefabc
2   a           a
1   abcdefgh    hgfedcba
2   aaaaaa      aaaaaa
2   baaaab      abaaba
50  abcdefgh    abcdefgh
6   abcdefghi   ghiabcdef

Ini adalah , jadi Anda harus membidik sesedikit mungkin byte.

Pavel
sumber
Terkait .
AdmBorkBork

Jawaban:

29

Jelly , 2 byte

sṚ

Program lengkap yang mencetak hasilnya.

Cobalah online!

Bagaimana?

sṚ - Main link: string, number                                   e.g. 'abcdefg', 3
s  - split string into chunks of length number (keeping any overflow) ["abc","def","g"]
 Ṛ - reverse the resulting list                                       ["g","def","abc"]
   - implicit print                                                   gdefabc
Jonathan Allan
sumber
28
Saya suka bagaimana dua byte menghasilkan 4 baris penjelasan.
Pavel
16

Python 3 , 35 byte

f=lambda s,n:s and f(s[n:],n)+s[:n]

Cobalah online!

Dennis
sumber
Bagaimana cara andkerja kata kunci di sini? @Dennis
ShinMigami13
2
@ ShinMigami13 string kosong tidak benar jadi ini mengakhiri rekursi
Michael Klein
9

05AB1E , 5 4 3 byte

-1 berkat Dennis
-1 berkat carusocomputing

ôRJ

Cobalah online!

     # Implicit: push input
 ô   # Split in pieces of length b
  RJ # Reverse and join
Riley
sumber
¹tidak dibutuhkan.
Guci Gurita Ajaib
8

JavaScript (ES6), 37 byte

n=>F=s=>s&&F(s.slice(n))+s.slice(0,n)

Mengambil input dengan mencari: angka pertama, lalu string, seperti f(2)("abcdefgh").

Produksi ETH
sumber
7

Perl 6 ,  28  20 byte

{$^b.comb($^a).reverse.join}

Cobalah

{[R~] $^b.comb($^a)}

Cobalah

Diperluas:

{  # bare block lambda with placeholder parameters 「$a」 and 「$b」
  [R[~]] # reduce the following using the reverse meta operator `R`
         # combined with the string concatenation operator

    # `comb` with a number splits the invocant into chunks of that size
    $^b.comb($^a)
}
Brad Gilbert b2gills
sumber
7

Bash + coreutils, 22

fold -$1|tac|tr -d \\n

Cobalah online .

Trauma Digital
sumber
1
Saya telah mempelajari 4 perintah linux baru minggu ini di lipatan PPCG adalah salah satunya, terima kasih!
Wossname
7

Haskell , 32 byte

n#""=""
n#s=n#drop n s++take n s

Cobalah online!

Tidak
sumber
1
Cantik. Sangat menyenangkan ketika presedensi bekerja di golf
Michael Klein
4

PHP, 53 Bytes

<?=join(array_reverse(str_split($argv[2],$argv[1])));
Jörg Hülsermann
sumber
4

Röda , 36 byte

f n{[[_]..[try head n-1]]|reverse|_}

Cobalah online!

Ini adalah fungsi yang membutuhkan satu argumen. Karakter string harus dalam arus.

trydigunakan untuk membuang kesalahan jika headfungsi tidak dapat membaca n-1nilai.

Penjelasan:

f n{[[_]..[try head n-1]]|reverse|_}
f n{                               } /* Function declaration */
                                     /* In a loop: */
      _                              /*   Pull one value */
           try head n-1              /*   Pull n-1 values (or less) */
     [ ]..[            ]             /*   Make an array */
    [                   ]            /*   Push it to the stream */
                         |reverse    /* Reverse all values in the stream */
                                 |_  /* Flat all arrays in the stream */
                                     /* Characters in the stream are printed */

Tidak sesulit biasanya. Saya pikir itu cukup indah. :)

fergusq
sumber
5
Anda berhasil membuat program lebih mudah dibaca daripada solusi jelly.
Pavel
Kenapa tidak [[try head n]]bekerja [[_]..[try head n-1]]?
Kritixi Lithos
@KritixiLithos Karena _loop ekspresi. [[try head n]]akan mengambil nilai n satu kali , tetapi [[_]..[try head n-1]]mengambil nilai n selama ada nilai yang tersisa.
fergusq
4

CJam , 5 byte

q~/W%

Input adalah angka dan string yang dilampirkan dalam tanda kutip ganda, dipisahkan oleh spasi putih.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

q~   e# Read all input and evaluate: pushes a number and a string
/    e# Split string into chunks of that size. Last chunk may be
     e# smaller. Gives an array of strings
W%   e# Reverse the array. Implicitly display
Luis Mendo
sumber
4

Batch, 74 byte

@if %2=="" (echo %~3)else set s=%~2&call %0 %1 "%%s:~%1%%" "%%s:~,%1%%%~3"

Agak mengganggu ini akhirnya menjadi rekursif daripada ekor rekursif.

Neil
sumber
4

V , 13 10 byte

òÀ|lDÏpòÍî

Cobalah online!

ò      ò    ' Recursively
 À|         ' Go to the "nth" column
   l        ' Move one character right (breaks loop when no more chunks)
    D       ' Delete from here to the end of the line
     Ï      ' Add a line above the current line (now contains one chunk)
      p     ' Paste the remainder of the line that was deleted
        Íî  ' Remove all newlines

Dalam Aksi:

abcdefghijkl

berubah menjadi

efghijkl
abcd

yang menjadi

ijkl
efgh
abcd

sebelum semua baris baru dihapus

nmjcman101
sumber
4

brainfuck , 78 byte

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

Byte pertama dari input adalah ukuran chunk, diberikan oleh nilai byte. Sisa dari byte dianggap sebagai string.

Cobalah online!

Diperluas dan dikomentari

Read the chunk size byte
This cell will become a counter cell
,

Move left a few cells an increment; 
this is to make the starting position 
line up with the relative positioning
needed to fit in with the loop
<<<+

While the current cell is nonzero:
[

 Move right to the first zero cell
 [>]

 Move right once and increment and then move right to the counter cell
 The increment is required because of "move to zero cell" loops
 >+>

 This loop will store one chunk of the input in consecutive memory cells
 [
  [>]   Move right until a zero cell is hit
  ,     Store 1 byte of input there
  <[<]  Move back left until a zero cell (other than the current one) is hit
  >+>-  Increment the temporary cell by 1 and decrement the counter
 ] (end loop once the counter hits zero)

 Decrement the temp cell (because we needed to have 1 there initially to make the cell location work)
 <-

 Move the temp cell to three cells after the end of the chunk
 This is the new counter cell for the next chunk
 [->>[>]>>+<<<[<]<]

 Move two cells right from where the temp cell was
 This is the first cell of the chunk; if it's 0
 then the input is finished and the loop should end
 >>
]

Due to the way the counter is kept track of the tape head
will always be four cells to the right of the last input cell
when the loops breaks
<<<<

Now the chunks are printed one by one
At the start of an iteration the tape head is at the end of a chunk
[
 Locate the start of the last chunk
 [<]>

 Print the chunk:
 [
  Print the byte held in the current cell if it isn't 1
  This is necessary because we left a stray 1 in a cell at
  the start which shouldn't be printed
  -[+.[-]]+

  Move to the next cell
  >
 ]

 Move to just left of the chunk
 <[<]

 Move three cells over to the end of the next chunk
 <<<
]
Kucing Bisnis
sumber
4

PowerShell, 56 49 byte

-7 byte berkat mazzy

param($n,$s)$s-split"(.{$n})"-ne''|%{$r=$_+$r};$r

Cobalah online!

Andrei Odegov
sumber
1) 49 byte 2) Tolong, memposting program lengkap, bukan kodenippet. Bagaimana cara mengeceknya? Ekstrak kode Anda dalam file terpisah dengan ekstensi .ps1dan coba panggil skrip ini alih-alih kode Anda. Jika berhasil, maka tes itu berhasil.
mazzy
3

Mathematica, 46 byte

""<>Reverse@Partition[Characters@#2,#,#,1,{}]&

Fungsi anonim. Mengambil angka dan string sebagai input dan mengembalikan string sebagai output. Tidak banyak yang bisa dilihat di sini.

LegionMammal978
sumber
3

Javascript - 54 47 46 byte

Dibuat ulang:

(s,n)=>s.match(eval(`/.{1,${n}}/g`)).reverse()

Digunakan sebagai

f=(s,n)=>s.match(eval(`/.{1,${n}}/g`)).reverse()
alert(f("abcdefgh",2));

Terima kasih kepada @ETHproductions untuk beberapa percepatan RegEx Terima kasih kepada @Shaggy untuk byte tambahan dalam eval!

Asli:

(s,n)=>s.match(new RegExp('.{1,'+n+'}','g')).reverse()
Blue Okiris
sumber
1
Jawaban bagus! Saya percaya Anda dapat menyimpan beberapa byte dengan membuat regex denganeval('/.{1,'+n+'}/g')
ETHproduksi
@ ETHproductions Ah ya. Itulah yang saya coba lakukan. Saya tidak cukup akrab dengan regex untuk melakukannya!
Blue Okiris
Saya pikir Anda dapat menyimpan byte dengan kari,s=>n=> ...
Pavel
Simpan byte dengan eval("/.{1,${n}}/g"), menggunakan backticks alih-alih tanda kutip.
Shaggy
3

Pyth, 5 byte

s_c.*

Cobalah online .

Penjelasan

   .*  splat implicit input
  c    split into chunks length n
 _     reverse
s      join
Trauma Digital
sumber
3

Retina , 38 byte

1 byte disimpan berkat @LeakyNun

^

+`(.* (1)+¶)((?<-2>.)+)
$3$1
 1+¶

(Perhatikan spasi di baris kedua, dan spasi tambahan)

Program ini mengambil input sebagai unary pada baris pertama, dan string pada baris kedua.

Cobalah online!

Test Suite! (sedikit dimodifikasi)

Penjelasan

Langkah pertama adalah menambahkan spasi (akan menjadi penting nanti).

^
 

Sekarang kita mundur. Ini menggunakan grup penyeimbang .NET. Penting untuk dicatat bahwa grup di sini bertindak sebagai tumpukan, sehingga setiap pertandingan pada dasarnya didorong ke tumpukan. Di sini kita menangkap setiap digit dalam nomor unary ke dalam grup 2. Sekarang setiap kali karakter dalam string ditemukan, kecocokan muncul dari grup 2. Ini memastikan jumlah karakter tidak melebihi jumlah dari angka unary.

+`(.* (1)+¶)                       Capture the unary number in group 2
             ((?<-2>.)+)           Balancing group for substrings
$3$1                               Reverse

Dan akhirnya menghapus nomor unary dan baris baru.

 1+¶

Kritixi Lithos
sumber
Saya pikir dapat diterima untuk mengambil nomor di unary.
Leaky Nun
Bagaimanapun, Anda dapat menggantinya \ddengan .menyimpan byte.
Leaky Nun
Yang kedua ^juga mubazir.
Leaky Nun
@ LeakyNun Program sekarang mengambil input di unary, jadi saya tidak perlu \dlagi. Dan terima kasih telah bermain golf tanda sisipan :)
Kritixi Lithos
33 byte dengan menggunakan pertandingan lazy (non-greedy).
Leaky Nun
3

Java, 147 138 Bytes

String r(String s,int n){String r="";int l=s.length();for(int i=l/n*n;i>=0;i-=n)if(!(i>=l))r+=(i+n)>=l?s.substring(i):s.substring(i,i+n);return r;}

Disimpan 9 Bytes berkat Kevin Cruijssen!

String r(String s,int n){String r="";int l=s.length(),i=l/n*n;for(;i>=0;i-=n)if(i<l)r+=i+n>=l?s.substring(i):s.substring(i,i+n);return r;}

Dalam bentuk yang diperluas:

String r(String s,int n){
    String r="";
    int l=s.length(),i=l/n*n;
    for(;i>=0;i-=n)
        if(i<l)
            r+=i+n>=l?s.substring(i):s.substring(i,i+n);
    return r;
}

Ini sebenarnya adalah percobaan pertama saya untuk codegolf, jadi umpan baliknya diterima!

bruderjakob17
sumber
Selamat datang di PPCG!
Pavel
1
Hai, selamat datang di PPCG! Ini sudah cukup bagus, tetapi masih ada beberapa hal untuk bermain golf lagi: int l=s.length();for(int i=l/n*n;bisa int l=s.length(),i=l/n*n;for(;jadi Anda hanya punya int satu kali. Dan if(!(i>=l))bisa jadi if(l<i). Dan r+=(i+n)>=l?bisa tanpa kurung: r+=i+n>=l?. Juga, jika Anda belum melihatnya, saya dapat merekomendasikan mencari tips untuk bermain golf di Jawa untuk beberapa tips bermain golf yang keren untuk digunakan. :) Sekali lagi, selamat datang.
Kevin Cruijssen
3

Perl 5 , 25 byte

Menggunakan -lnM5.010bendera.

say reverse<>=~/.{1,$_}/g

Cobalah online!

Berteriaklah pada Grinnz karena memberitahuku tentang =~ m/.{1,$n}/g

-M5.010 memungkinkan penggunaan say fungsi, yang untuk keperluan kita dicetak dengan nama yang lebih pendek.

-n menempatkan baris input pertama ke dalam $_ , dan -lmematikan baris baru yang tertinggal.

Kami kemudian mendapatkan input baris kedua menggunakan <>, dan menerapkannya pada regex.{1,$_} : karakter apa saja, antara 1 dan $ _ (input pertama) kali. Karena ini serakah secara default, ia mencoba untuk selalu cocok dengan $ _ karakter. The 1,diperlukan untuk memungkinkan potongan sisa di akhir.

The /gpengubah memberi kita setiap pertandingan itu regex dalam string masukan sebagai daftar, yang kemudian dibalik dan dicetak. Di Perl, meneruskan daftar untuk saybergabung tanpa pembatas secara default.

Pavel
sumber
3

APL Dyalog Diperpanjang , 16 15 byte

{∊⌽⍵⊂⍨(≢⍵)⍴=⍳⍺}

Cobalah online!

dzaima
sumber
Anda tidak perluf←
Pavel
Why, ,/
Adm
@ Adám Oh hei itu berlaku untuk jawaban saya juga, terima kasih
Pavel
Pavel: ya, jelas .. @ Adám terima kasih!
dzaima
14:∊∘⌽⊢⊂⍨≢⍤⊢⍴1↑⍨⊣
Ven
2

Python, 62 byte

lambda n,s:''.join([s[i:i+n]for i in range(0,len(s),n)][::-1])

Cobalah online!

ovs
sumber
Jawaban Python3 lebih pendek & juga berfungsi untuk python 2.7:f=lambda n,s:s and f(n,s[n:])+s[:n]
F1Rumors
2

Ditumpuk , 9 byte

#<rev''#`

Cobalah online!

#<potongan, revmembalikkan, dan ''#`bergabung dengan string kosong. Cukup sederhana.

Conor O'Brien
sumber
2

QBIC , 24 byte

:;[1,_lA|,a|Z=_sA,b,a|+Z

Ini memanfaatkan fungsi substring baru yang baru saja saya tambahkan ke QBIC:

:;          Read in the cmd line params a (number) and A$ (text)
[1,_lA|,a|  Set up a FOR loop: FOR b = 1; b <= A$.length; b += a
Z=          Modify Z$; Z$ is autoprinted at the end of QBIC code
_sA,b,a|    SUBSTRING: _s is the function followed by the string 
               to take from, the starting pos and the # of chars
+Z          Take chunks from further into A$, put them before Z$
steenbergh
sumber
2

C, 69 byte

i;f(s,n)char*s;{i=strlen(s);for(i-=i%n;printf("%.*s",n,s+i),i;i-=n);}

Hasilnya dicetak ke output standar.

2501
sumber
2

Scala, 57 55 byte

(n:Int,s:String)=>(""/:s.grouped(n).toSeq.reverse)(_+_)

Yakub terima kasih! Cobalah sini .

Catatan: Dengan menggunakan bentuk simbol foldLeft ("/:"), saya dapat melepas beberapa byte lagi.

jkeatley
sumber
menjadikannya fungsi anonim, dan gunakan mkStringsebagai gantinya reduceLeft, dan mencukur 7 byte:(n:Int,s:String)=>s.grouped(n).toSeq.reverse.mkString("")
Yakub
2

Ohm , 5 byte

σ]QWJ

Cobalah online!

Penjelasan

σ]QWJ
σ         # Split input1 into input2 pieces
 ]        # Flatten array
  Q       # Reverses stack
   W      # Wraps stack to array
    J     # Joins stack
          # Implicit print
Datboi
sumber
2

R , 69 60 byte

function(s,n)cat(substring(s,(x=nchar(s):0*n)+1,x+n),sep="")

Cobalah online!

Terima kasih kepada Kirill L. untuk saran untuk menghapus seq.

Giuseppe
sumber
Sepertinya ini bekerja juga untuk 66.
Kirill L.
@ KirillL. kita bisa pergi ke 60 byte jika kita membalik urutan argumen :dan beberapa manipulasi memungkinkan kita menyingkirkan trailing -1.
Giuseppe
Cerdas, sangat bagus!
Kirill L.