Dizeyi kare şeklinde sarın!


12

Bir dize verildiğinde, ilk önce aşağıdaki gibi kare yapın:

Önce dizeyi yazın.

abcde

Ardından, sola döndürülmüş dizeyi yazın.

abcde
bcdea

Len (string) satırları yazana kadar bunu yapmaya devam edin .

abcde
bcdea
cdeab
deabc
eabcd

Şimdi, dizeden şöyle okuyun:

----+
+--+|
|+>||
|+-+|
+---+

Hangi verir:

abcdeabcdcbaedcbcdeabaede

Bu dizeyi yazdırın.

Test senaryoları

abcdef -> abcdefabcdedcbafedcbcdefabcbafedefaf
cena! -> cena!cenanec!anena!cec!a!
ppcg -> ppcgppcppgcpcgpg
abc -> abcabacbc
ab -> abab
a -> a
 -> 

Bir test durumu yanlışsa lütfen yorum yapın.

Unutmayın, bu , bu nedenle en az bayt içeren kod kazanır.


2
cena!Hata. Her abcdeikisi de 5 harf olduğundan örneğinizle eşleşmelidir :cena!cenanec!anena!cec!a!
Linus

@Linus Teşekkür ederim, düzelttim.
Oliver Ni

Yanıtlar:


7

JavaScript (ES7), 83 80 78 77 bayt

s=>s.repeat(l=s.length).replace(/./g,_=>s[(c-=--i**.5-l&1||-1)%l],c=-1,i=l*l)

Bonus ES3 uyumlu program:

for(s=prompt(r=""),c=-1,l=s.length,i=l*l;i;)r+=s[(c-=l-Math.sqrt(i--)&1||-1)%l];alert(r)

açıklama

Bu, örneğin bir uzunluk 5 dizesi için çıktının şu şekilde temsil edilebildiği gerçeğinden yararlanır:

abcdeabcd cbaedcb cdeab aed e
012345678 7654321 23456 543 4

burada her basamak dizgideki bir dizini temsil eder (0'dan başlayarak), dizenin uzunluğunu modulo. Başka bir deyişle, n dizenin uzunluğu ise, dizini 2n - 1 kat arttırır , sonra 2 (n - 1) - 1 kez azaltır , sonra 2 (n - 2) - 1 kez vb. Bu, aşağıdaki algoritma ile basitleştirilebilir:

  • İ dizinini -1 ile başlatın .
  • [N 2 ..1] aralığındaki her x tamsayısı için :
    • Eğer kat (sqrt (x)) ile aynı paritesine (tek / çift) ait n , artırmak i .
    • Aksi takdirde, azaltma i .
    • İ mod n dizinindeki karakteri çıktıya ekleyin .

Bu çalışmalar için kat (sqrt (x)) sonra paritelerin geçer 1 - 2n yineleme, daha sonra 2, (n - 1) - 1 tekrarlamalar, vs.


Saçma. Aferin!
MayorMonty

1

Pyth , 15 bayt

.Wp.(H0_CZ.<LQU

A girişini alan "quoted string"ve sonucu basan bir program .

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın (çoklu giriş için değiştirildi).

Nasıl çalışır

.Wp.(H0_CZ.<LQU  Program. Input: Q
            L U  Map over [0, 1, 2, 3, ..., Q-1] (implicit input):
          .< Q     Q left-shifted by that many characters
                 Call this X
.W               While
   .(H0          popping the first element of X (mutates X in-place)
  p              and printing it with no trailing newline is truthy:
         Z           X = 
        C            X transposed
       _             reversed

1

Python 2.7 (CMD.EXE içinde), 91 bayt

Bu, çalışma alanı ( \b) olan bir terminal gerektirir ve repl.it veya ideone.com üzerinde çalışmaz . Virgülle biten bir print deyimi, daha fazla çıktıyı satırsonu veya satır başı yerine boşlukla ayırır. Geri tuşu, ayırma alanının üzerine yazmamızı sağlar.

s=input();r=s[::-1];n=len(s)-1;i=0
while i<=n:print'\b'+s[i:]+s[:n-i]+r[i+2:]+r[:n-i],;i+=2

Python 2.7, 96 bayt

İdeone.com veya repl.it adresinde deneyin (Oliver sayesinde). Giriş bir python dizesi olmalıdır, ör 'cena!'.

s=input();r=s[::-1];n=len(s)-1;i=0;S=''
while i<=n:S+=s[i:]+s[:n-i]+r[i+2:]+r[:n-i];i+=2
print S

Döngü tarafından ekli dört dilim ( s[i:], s[:n-i], r[i+2:], r[:n-i]) spiral dört kenarlarından alınır. Örneğin 01234kare ile:

01234
12340
23401
34012
40123

Attığımız Yani 01234, 0123, 210, 4321. Değişken i, işlemin her adımında sol üst değerin dizinidir. Son sarmalda dilimlerin birkaçı boş olabilir.


Muhtemelen kazandırabileceği gibi Python 3'e değiştirerek, kurtuluyor sadece S='', print Sve S+=, ve sarma her şey önce i+=2bir de print()sahip açıklamada sep='', size 2 bayt kaydedebilirsiniz.
Kade

@Shebang Hemen takip etmiyorum. Kendiniz bir python 3 yanıtı eklemek için çekinmeyin.
Linus

Değişebilirsin i<=niçinn>i
Oliver Ni

Bayt tasarrufu sağlar.
Oliver Ni

@Oliver, Teşekkürler ... ama işe yaramaz"a string of odd length."
Linus

1

Jöle , 11 10 bayt

ẋ2µṖȮṖUµÐL

TryItOnline! veya tüm testler

Nasıl?

Spirallenmemiş kare bir dizi "üst kenar artı sağ kenar" ve "alt kenar artı sol kenar" çalışma serisidir, bunların her biri ilk ve son harf olmadan önceki çalışmanın tersidir ve ilki giriş artı son harf içermeyen giriştir (örneğin girişin "abcde"bir çıkışı vardır "abcdeabcd" + "cbaedcb" + "cdeab" + "aed" + "e").

ẋ2µṖȮṖUµÐL - Main link: s                            e.g. abcde
ẋ2         - repeat s twice                          e.g. abcdeabcde
  µ    µ   - monadic chain separation
        ÐL - repeat until results are no longer unique:
   Ṗ       -     remove the last character                abcdeabcd / cbaedcb / cdeab / aed / e   / ""
    Ȯ      -     print z (with no linefeed) and return z
     Ṗ     -     remove the last character                abcdeabc  / cbaedc  / cdea  / ae  / ""  / ""
      U    -     reverse                                  cbaedcba  / cdeabc  / aedc  / ea  / ""  / "" <- no longer unique.

1

05AB1E, 12 bayt

2×[DõQ#¨D?¨R

Çevrimiçi deneyin!

Açıklama:

 2×[DõQ#¨D?¨R
               # Implicit input
 2×            # Repeat twice
   [           # Begin infinite loop
┏>  DõQ#       # If empty string, break
┃       ¨      # Remove last character
┃        D     # Duplicate
┃         ?    # Print with no newline and pop
┃          ¨   # Remove last character
┃           R  # Reverse
┗━━━━━━━━━━━━┛ # Implicit end infinite loop


0

C, 95 94 Bayt

i,j,k,l;f(char*s){for(k=-1,l=i=strlen(s);i--;)for(j=i*2;~j--;putchar(s[(k+=(l-i)%2*2-1)%l]));}

@ETHproductions yanıtından esinlenmiştir.


0

Perl, 99 bayt

$_=<>;
chop;
@a=split//;
print(@a[$%,(@f=1-($b=@a-$%)..$b-3),$b-1?$b-2:(),reverse@f]),$%+=2 until$%>@a

Boşluk, programın bir parçası değildir ve okunabilirlik için sağlanmıştır.

Son derece verimli kod değil. İlk üç çizgiyi bir şekilde kısaltabilmeliydim, ama yapmaya çalıştığım her şey başarısız oldu. Bu üçlü operatörün de bir şekilde düzeltilmesi gerekiyor, ancak bu şekilde sahip olmak, kodumu 10 bayt gibi kısaltmayı mümkün kıldı çünkü çok fazla kesebildim.

Kod, çekilecek dizenin yer değerlerini temsil eden çift sayılarla ayrılmış bir palindromlar listesi derleyerek çalışır.


Sen kullanabilirsiniz -F hattı 1 yerini alacak ve birlikte girdi verin 3. hangi echo -nkaldırmak için chop. (bu sizi 81 bayt civarında almalıdır)
Dada

0

Aslında , 21 13 bayt

Bu algoritma büyük ölçüde Jonathan Allan'ın Jelly cevabına dayanmaktadır . Sonucu bir dize olarak yazdırmanın iki yolu vardır. Burada kullanılan yaklaşım, bir ara adımı çoğaltır ve daha sonra bunu kayıt 1'de (varsayılan olarak boş bir dize) çalışan bir toplama ekler; ;╕işlevde, sonra sonunda. Diğer yaklaşım, bir ara adımı çoğaltmak, bu yinelenen adımları yığın üzerinde bırakmak ve sonunda bir dizede toplamaktır; ;işlevde, sonra sonunda.

Golf önerileri hoş geldiniz. Çevrimiçi deneyin!

2*`dX;╕dXR`Y╛

Ungolfing

         Implicit input s.
2*       Push a string that repeats s two times.
`...`Y   Call the following function until there is no change from the last call
  dX       Discard the last element. Call this new string m.
  ;╕       Duplicate m and add it to the running total in register 1.
  dXR      Discard the last element again and reverse the string.
╛        Push the unspiralled string from register 1 to the stack.
         Implicit return.

0

Python 3, 59 bayt

x=input()*2
while x:x=x[:-1];print(x,end='');x=x[:-1][::-1]

repl.it

Jelly cevabımın doğrudan limanı ; yalnızca tam bir program girdi alır (bir işlev yerine).
Bu print(x,end=''), varsayılan yeni satırı yazdırmayacak bir print deyimidir.


-1

Python 3, 93 bayt

s=input();r,n,i=s[::-1],len(s)-1,0
while n-i:print(s[i:]+s[:n-i]+r[i+2:]+r[:n-i],end='');i+=2

Çevrimiçi deneyin!


Aksine print(...,end=''), yapmakprint(end=s[i:]+s[:n-i]+r[i+2:]+r[:n-i]
FlipTack

1
Her neyse, bu çözüm işe yaramıyor , sonunda abcdebir eksik e.
FlipTack

Durumunuz i<=nyerine deneyin n-i.
Linus
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.