Bir dizeyi topaklarla ters çevir


34

Göreviniz, bir sayı ve bir dize verilen dizeyi bu boyuttaki parçalara bölen ve tersine çeviren bir program yazmaktır.

kurallar

Programınız pozitif bir tamsayı nve sen az biri yalnızca yazdırılabilir ASCII (boşluklar dahil değil) içeren uzunluğa sahip bir dize alır . Daha sonra ipin uzunluğu artıklara bölünmelidir n, eğer ipin uzunluğu nartık herhangi bir kalıntı tarafından bölünemezse , kendi parçası olarak düşünülmelidir. Ardından, parçaların sırasını ters çevirin ve tekrar birleştirin.

Test Kılıfları

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

Bu , bu yüzden mümkün olduğunca az bayt hedeflemelisiniz.


Yanıtlar:


29

Jöle , 2 bayt

sṚ

Sonucu basan tam bir program.

Çevrimiçi deneyin!

Nasıl?

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

28
İki baytın 4 satırlı açıklama oluşturmasını seviyorum.
Pavel



8

JavaScript (ES6), 37 bayt

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

Körleyerek girdi alır: önce sayı, sonra string, like f(2)("abcdefgh").


7

Perl 6 ,  28  20 bayt

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

Dene

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

Dene

Expanded:

{  # 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)
}




4

Röda , 36 bayt

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

Çevrimiçi deneyin!

Bir argüman alan bir işlev. Dizenin karakterleri akışta olmalıdır.

tryheadişlevin n-1değerleri okuyamaması durumunda hataları silmek için kullanılır .

Açıklama:

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

Genelde olduğu kadar şaşkın değil. Bence çok güzel. :)


5
Bir programı jöle çözeltisinden daha az okunabilir hale getirdin.
Pavel

Neden [[try head n]]yerine çalışmıyor [[_]..[try head n-1]]?
Kritixi Lithos

@KritixiLithos Çünkü _ifadeyi döngüler. [[try head n]]n değerini bir kez[[_]..[try head n-1]] alır , ancak kalan değerler olduğu sürece n değerini alır.
fergusq

4

CJam , 5 bayt

q~/W%

Giriş, boşlukla ayrılmış, çift tırnak içine alınmış bir sayı ve bir dizedir.

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

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

4

Toplu iş, 74 bayt

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

Oldukça can sıkıcı bir şekilde bu özyinelemeli kuyruk özyinelemeden özyinelemeli olur.


4

V , 13 10 bayt

òÀ|lDÏpòÍî

Çevrimiçi deneyin!

ò      ò    ' 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

Eylemde:

abcdefghijkl

dönüşür

efghijkl
abcd

hangisi olur

ijkl
efgh
abcd

tüm yeni satırlar kaldırılmadan önce


4

brainfuck , 78 bayt

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

Girişin ilk baytı, bayt değeri ile verilen yığın büyüklüğüdür. Baytların geri kalanı dize olarak kabul edilir.

Çevrimiçi deneyin!

Genişletildi ve yorumlandı

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
 <<<
]

4

PowerShell, 56 49 bayt

Mazzy sayesinde -7 bayt

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

Çevrimiçi deneyin!


1) 49 bayt 2) Lütfen bir kod parçası değil tam bir program gönderin. Nasıl kontrol edilir? Kodunuzu, uzantıya sahip ayrı bir dosyaya çıkarın .ps1ve bu betiği kodunuz yerine çağırmayı deneyin. Çalışırsa, test başarılı oldu.
Mazaz

3

Mathematica, 46 bayt

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

Anonim işlev Girilen sayıyı ve dizgiyi alır ve çıktı olarak dizge döndürür. Burada görülecek çok şey yok.


3

Javascript - 54 47 46 bayt

remade:

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

Olarak kullanıldı

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

Bazı RegEx bağlantı elemanları için @ETHproductions'e teşekkür ederiz. Değerlendirmede fazladan bir bayt için @Shaggy'ye teşekkür ederiz!

Orijinal:

(s,n)=>s.match(new RegExp('.{1,'+n+'}','g')).reverse()

1
Güzel cevap! Ben bir regex oluşturarak bir kaç bayt kurtarabilir inanıyorumeval('/.{1,'+n+'}/g')
ETHproductions

@ETHproductions Ah evet. Yapmaya çalıştığım şey buydu. Gerçi yapmak için regex ile yeterince tanıdık değildi!
Blue Okiris

Sanırım bir bayt'ı kurutma ile kurtarabilirsin,s=>n=> ...
Pavel

eval("/.{1,${n}}/g")Tırnak işaretlerinin yerine geri basamağı kullanarak bir baytla kaydedin .
Shaggy,


3

Retina , 38 bayt

@LeakyNun sayesinde 1 bayt kurtarıldı

^

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

(İkinci satırdaki boşluğa ve sondaki boşluğa dikkat edin)

Bu program girdiyi ilk satırdaki unary, ikincisi ise dize olarak alır.

Çevrimiçi deneyin!

Test odası! (biraz değiştirilmiş)

açıklama

İlk adım, bir boşluk hazırlamaktır (daha sonra önem kazanacaktır).

^
 

Şimdi geri döndük. Bu, .NET'in dengeleme gruplarını kullanır. Buradaki grupların yığın olarak hareket ettiğini not etmek önemlidir, bu nedenle her maç esasen yığının üzerine itilir. Burada, tek sayıdaki her basamağı grup 2'ye kaydederiz. Şimdi dizgede bir karakter bulunduğunda, grup 2'den bir eşleşme çıkar. Bu, karakter sayısının tek sayıdaki sayıyı aşmamasını sağlar.

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

Ve nihayet unary numarasını ve yeni satırı kaldırın.

 1+¶


Numarayı unary olarak almanın kabul edilebilir olduğunu düşünüyorum.
Leaky Nun

Her neyse, sen yerini alabilir \dtarafından .bir byte kaydedin.
Leaky Nun

İkincisi ^de gereksiz.
Leaky Nun

@LeakyNun Program şimdi unary girdi alır, bu yüzden artık gerek \dyok. Ve caret uzakta golf için teşekkürler :)
Kritixi Lithos

Tembel (açgözlü olmayan) maç kullanarak 33 bayt .
Leaky Nun

3

Java, 147 138 Bayt

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

Kevin Cruijssen sayesinde 9 bayt kaydedildi!

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

Genişletilmiş biçimde:

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

Bu aslında benim şimdiye kadarki kodlama ilk denemem, bu yüzden herhangi bir geri bildirim bekliyoruz!


PPCG'ye Hoşgeldiniz!
Pavel

1
Merhaba, PPCG'ye hoş geldiniz! Bu zaten oldukça iyi, ama yine de biraz daha golf oynamak için hala birkaç şey var: int l=s.length();for(int i=l/n*n;bu int l=s.length(),i=l/n*n;for(;yüzden sadece bir int kez sahip olabilirsiniz . Ve if(!(i>=l))olabilir if(l<i). Ve r+=(i+n)>=l?parantez olmadan olabilir: r+=i+n>=l?. Ayrıca, henüz görmediyseniz, kullanması gereken harika golf ipuçlarını öğrenmek için Java'da Golf için İpuçları kısmına bakmanızı tavsiye ederim . :) Bir kez daha hoş geldiniz.
Kevin Cruijssen

3

Perl 5 , 25 bayt

-lnM5.010Bayrakları kullanır .

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

Çevrimiçi deneyin!

Bana bahsettiği için Grinnz'e bağırıyor =~ m/.{1,$n}/g

-M5.010sayAmaçlarımız için daha kısa bir adla basılan fonksiyonun kullanılmasını sağlar .

-ngiriş satırının ilk satırını yerleştirir $_ve-l arka yeni satır kapalı Chomps.

Sonra ikinci girdi satırını kullanarak elde ederiz <>ve bunu regex'e uygularız .{1,$_}: herhangi bir karakter, 1 ile $ _ (ilk girdi) arasında. Bu, varsayılan olarak açgözlü olduğundan, her zaman $ _ karakteriyle eşleşmeye çalışır. 1,Sonunda olası artık yığın için gereklidir.

/gDeğiştirici bize veren her ardından ters ve yazdırılır listesi olarak girdi dizesindeki bu regex arasında eşleme. Perl’de bir listeyesay varsayılan olarak sınırlayıcı olmadan .



2

Python, 62 bayt

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

Çevrimiçi deneyin!


Python3'ün cevabı daha kısa ve aynı zamanda python 2.7 için de çalışıyor:f=lambda n,s:s and f(n,s[n:])+s[:n]
F1Rumors


2

QBIC , 24 bayt

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

Bu, yakın zamanda QBIC’e eklediğim yeni alt işlev işlevini mükemmel şekilde kullanıyor:

:;          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$



2

C, 69 bayt

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

Sonuç standart çıktıya yazdırılır.


2

Scala, 57 55 bayt

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

Teşekkürler Jacob! Burada dene .

Not: foldLeft ("/:") sembol formunu kullanarak birkaç bayt daha daha çıkarmayı başardım.


isimsiz bir işlev yapıp mkStringyerine kullanın reduceLeftve 7 bayt'ı tıraş edin:(n:Int,s:String)=>s.grouped(n).toSeq.reverse.mkString("")
Jacob

2

Ohm , 5 bayt

σ]QWJ

Çevrimiçi deneyin!

açıklama

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.