Kehren Sie eine Zeichenfolge in Stücken um

34

Ihre Aufgabe ist es, ein Programm zu schreiben, das die Zeichenkette anhand einer Zahl und einer Zeichenkette in Stücke dieser Größe aufteilt und sie umkehrt.

Regeln

Ihr Programm erhält eine positive Ganzzahl nsowie eine Zeichenfolge smit mindestens einer Länge, die nur aus druckbarem ASCII (ohne Leerzeichen) besteht. Die Zeichenfolge sollte dann in Abschnitte mit einer Länge aufgeteilt werden n, wenn die Länge der Zeichenfolge nicht durch nReste am Ende teilbar ist, und als eigener Abschnitt betrachtet werden soll. Kehren Sie dann die Reihenfolge der Stücke um und setzen Sie sie wieder zusammen.

Testfälle

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

Dies ist , daher sollten Sie so wenig Bytes wie möglich anstreben.

Pavel
quelle
Verwandte .
AdmBorkBork

Antworten:

29

Gelee , 2 Bytes

sṚ

Ein vollständiges Programm, das das Ergebnis druckt.

Probieren Sie es online!

Wie?

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
quelle
28
Mir gefällt, wie zwei Bytes 4 Erklärungszeilen generiert haben.
Pavel
16

Python 3 , 35 Bytes

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

Probieren Sie es online!

Dennis
quelle
Wie funktioniert das andKeyword hier? @ Tennis
ShinMigami13
2
@ ShinMigami13 leere Zeichenfolge ist nicht wahr, damit endet die Rekursion
Michael Klein
9

05AB1E , 5 4 3 Bytes

-1 dank Dennis
-1 dank carusocomputing

ôRJ

Probieren Sie es online!

     # Implicit: push input
 ô   # Split in pieces of length b
  RJ # Reverse and join
Riley
quelle
¹wird nicht benötigt.
Magic Octopus Urn
8

JavaScript (ES6), 37 Byte

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

Nimmt die Eingabe durch Curry vor: Nummer zuerst, dann Zeichenfolge, wie f(2)("abcdefgh").

ETHproductions
quelle
7

Perl 6 ,  28  20 Bytes

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

Versuch es

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

Versuch es

Erweitert:

{  # 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
quelle
7

Bash + Coreutils, 22

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

Probieren Sie es online aus .

Digitales Trauma
quelle
1
Ich habe diese Woche 4 neue Linux-Befehle auf PPCG gelernt. Fold ist einer von ihnen, danke!
Wossname
4

PHP, 53 Bytes

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

Röda , 36 Bytes

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

Probieren Sie es online!

Es ist eine Funktion, die ein Argument akzeptiert. Die Zeichen der Zeichenfolge müssen im Stream enthalten sein.

trywird verwendet, um Fehler zu verwerfen, falls die headFunktion keine n-1Werte lesen kann .

Erläuterung:

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 */

Nicht so verschleiert wie sonst. Ich finde es ziemlich schön. :)

fergusq
quelle
5
Sie haben es geschafft, ein Programm weniger lesbar zu machen als die Jelly-Lösung.
Pavel
Warum funktioniert nicht [[try head n]]statt [[_]..[try head n-1]]?
Kritixi Lithos
@KritixiLithos Weil _der Ausdruck in einer Schleife ausgeführt wird. [[try head n]]würde n Werte einmal annehmen , aber es [[_]..[try head n-1]]dauert n Werte, solange noch Werte übrig sind.
Fergusq
4

CJam , 5 Bytes

q~/W%

Die Eingabe ist eine Zahl und eine Zeichenfolge in doppelten Anführungszeichen, die durch Leerzeichen getrennt sind.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

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
quelle
4

Batch, 74 Bytes

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

Es ist eher ärgerlich, dass dies eher rekursiv als rekursiv endet.

Neil
quelle
4

V , 13-10 Bytes

òÀ|lDÏpòÍî

Probieren Sie es 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

In Aktion:

abcdefghijkl

verwandelt sich in

efghijkl
abcd

was wird

ijkl
efgh
abcd

bevor alle Zeilenumbrüche entfernt werden

nmjcman101
quelle
4

Brainfuck , 78 Bytes

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

Das erste Byte der Eingabe ist die Blockgröße, angegeben durch den Bytewert. Die restlichen Bytes werden als Zeichenfolge betrachtet.

Probieren Sie es online!

Erweitert und kommentiert

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
 <<<
]
Geschäfts-Katze
quelle
4

PowerShell, 56 49 Byte

-7 Bytes dank mazzy

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

Probieren Sie es online!

Andrei Odegov
quelle
1) 49 Bytes 2) Bitte senden Sie ein vollständiges Programm, kein Codesnippet. Wie zu überprüfen? Extrahieren Sie Ihren Code in eine separate Datei mit der Erweiterung .ps1und versuchen Sie, dieses Skript anstelle Ihres Codes aufzurufen. Wenn es funktioniert, war der Test erfolgreich.
mazzy
3

Mathematica, 46 Bytes

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

Anonyme Funktion. Nimmt eine Zahl und eine Zeichenfolge als Eingabe und gibt eine Zeichenfolge als Ausgabe zurück. Hier gibt es nicht viel zu sehen.

LegionMammal978
quelle
3

Javascript - 54 47 46 Bytes

Neu gemacht:

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

Benutzt als

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

Vielen Dank an @ETHproductions für einige RegEx-Verbesserungen. Vielen Dank an @Shaggy für ein zusätzliches Byte in der Auswertung!

Original:

(s,n)=>s.match(new RegExp('.{1,'+n+'}','g')).reverse()
Blaue Okiris
quelle
1
Gute Antwort! Ich glaube, Sie können ein paar Bytes sparen, indem Sie den eval('/.{1,'+n+'}/g')
regulären Ausdruck
@ETHproductions Ah ja. Das habe ich versucht. Ich war nicht gut genug mit Regex vertraut, um das zu tun!
Blue Okiris
Ich denke, Sie können ein Byte mit Curry retten,s=>n=> ...
Pavel
Speichern Sie ein Byte mit eval("/.{1,${n}}/g"), indem Sie Backticks anstelle von Anführungszeichen verwenden.
Shaggy
3

Retina , 38 Bytes

1 Byte gespart dank @LeakyNun

^

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

(Beachten Sie das Leerzeichen in der zweiten Zeile und das nachfolgende Leerzeichen)

Dieses Programm nimmt die Eingabe in der ersten Zeile als unär und die Eingabe in der zweiten Zeile als unär an.

Probieren Sie es online!

Test Suite! (leicht verändert)

Erläuterung

Der erste Schritt ist das Voranstellen eines Leerzeichens (wird später wichtig).

^
 

Jetzt kehren wir um. Hierbei werden die Bilanzkreise von .NET verwendet. Es ist wichtig zu beachten, dass Gruppen hier als Stapel fungieren, sodass jedes Match im Wesentlichen auf den Stapel geschoben wird. Hier erfassen wir jede Ziffer in der unären Zahl in Gruppe 2. Jedes Mal, wenn ein Zeichen in der Zeichenfolge gefunden wird, wird eine Übereinstimmung aus Gruppe 2 gezogen. Dadurch wird sichergestellt, dass die Anzahl der Zeichen die der unären Zahl nicht überschreitet.

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

Und schließlich entfernen Sie die unäre Nummer und die neue Zeile.

 1+¶

Kritixi Lithos
quelle
Ich halte es für akzeptabel, die Nummer unär zu nehmen.
Undichte Nonne
Wie auch immer, können Sie ersetzen \ddurch .ein Byte zu speichern.
Undichte Nonne
Der zweite ^ist ebenfalls überflüssig.
Undichte Nonne
@LeakyNun Das Programm nimmt jetzt Eingaben in unary entgegen, daher brauche ich die nicht \dmehr. Und danke, dass
du
33 Bytes mit Lazy Match (nicht gierig).
Undichte Nonne
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;}

Dank Kevin Cruijssen 9 Bytes gespart!

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

In erweiterter Form:

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

Dies ist eigentlich mein erster Versuch, überhaupt Codegolf zu spielen, daher ist jedes Feedback willkommen!

bruderjakob17
quelle
Willkommen bei PPCG!
Pavel
1
Hallo, willkommen bei PPCG! Das ist schon ziemlich gut, aber es gibt noch ein paar Dinge zum Golfen, int l=s.length();for(int i=l/n*n;die man int l=s.length(),i=l/n*n;for(;so nur int einmal haben kann. Und if(!(i>=l))kann sein if(l<i). Und r+=(i+n)>=l?ohne die Klammer sein: r+=i+n>=l?. Wenn Sie es noch nicht gesehen haben, kann ich Ihnen empfehlen, die Tipps zum Golfen in Java zu lesen, um einige ziemlich coole Golftipps zu finden. :) Nochmals herzlich willkommen.
Kevin Cruijssen
3

Perl 5 , 25 Bytes

Verwendet die -lnM5.010Fahnen.

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

Probieren Sie es online!

Grüße Grinnz, dass er mir davon erzählt hat =~ m/.{1,$n}/g

-M5.010ermöglicht die Verwendung der sayFunktion, die für unsere Zwecke mit einem kürzeren Namen gedruckt wird.

-nFügt die erste Eingabezeile in die Zeile ein $_und -lschneidet die nachfolgende neue Zeile ab.

Wir erhalten dann die zweite Eingabezeile mit <>und wenden sie auf den regulären Ausdruck an .{1,$_}: ein beliebiges Zeichen, das zwischen 1 und $ _ (der ersten Eingabe) liegt. Da dies standardmäßig gierig ist, wird versucht, immer mit $ _ -Zeichen übereinzustimmen. Die 1,wird für den eventuell am Ende verbleibenden Brocken benötigt.

Der /gModifikator gibt uns jede Übereinstimmung dieses regulären Ausdrucks in der Eingabezeichenfolge als Liste an, die dann umgekehrt und gedruckt wird. In Perl saywird standardmäßig eine Liste ohne Begrenzer übergeben, um der Liste beizutreten.

Pavel
quelle
3

Dyalog APL Gesamt , 16 15 Bytes

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

Probieren Sie es online!

dzaima
quelle
Sie brauchen nicht dief←
Pavel
Warum, ,/
Adám
@ Adám Oh hey das gilt auch für meine Antwort, danke
Pavel
Pavel: yep, offensichtlich .. @ Adám danke!
Dzaima
14:∊∘⌽⊢⊂⍨≢⍤⊢⍴1↑⍨⊣
Ven
2

Python, 62 Bytes

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

Probieren Sie es online!

ovs
quelle
Python3 Antwort ist kürzer und funktioniert auch für Python 2.7:f=lambda n,s:s and f(n,s[n:])+s[:n]
F1Rumors
2

QBIC , 24 Bytes

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

Dies nutzt die neue Teilzeichenfolge-Funktion, die ich kürzlich zu QBIC hinzugefügt habe, hervorragend aus:

:;          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
quelle
2

C 69 Bytes

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

Das Ergebnis wird in der Standardausgabe ausgedruckt.

2501
quelle
2

Scala, 57-55 Bytes

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

Danke Jacob! Probieren Sie es hier aus .

Hinweis: Mit der Symbolform foldLeft ("/:") konnte ich noch ein paar Bytes entfernen.

jkeatley
quelle
machen Sie es anonyme Funktion und verwenden Sie mkStringstattdessen reduceLeftund rasieren Sie 7 Bytes ab:(n:Int,s:String)=>s.grouped(n).toSeq.reverse.mkString("")
Jacob
2

Ohm , 5 Bytes

σ]QWJ

Probieren Sie es online!

Erläuterung

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

R , 69 60 Bytes

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

Probieren Sie es online!

Vielen Dank an Kirill L. für den Vorschlag, ihn zu entfernen seq.

Giuseppe
quelle
Sieht so aus, als ob dies auch für 66 funktioniert .
Kirill L.
@KirillL. Wir können bis zu 60 Bytes erreichen, wenn wir die Reihenfolge der Argumente umkehren :und durch einige Manipulationen das Nachstellen beseitigen -1.
Giuseppe
Klug, sehr schön!
Kirill L.