Kuadrat-kosongkan string!

12

Diberikan string, kuadratkan pertama sebagai berikut:

Pertama, tulis string.

abcde

Selanjutnya, tulis string diputar satu kiri.

abcde
bcdea

Terus lakukan ini sampai Anda menulis baris len (string) .

abcde
bcdea
cdeab
deabc
eabcd

Sekarang, baca dari string seperti ini:

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

Pemberian yang mana:

abcdeabcdcbaedcbcdeabaede

Cetak string ini.

Uji kasus

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

Berikan komentar jika test case salah.

Ingat, ini adalah , jadi kode dengan jumlah byte terkecil menang.

Oliver Ni
sumber
2
cena!salah. Ini harus sesuai dengan contoh Anda abcdekarena keduanya 5 huruf:cena!cenanec!anena!cec!a!
Linus
@Linus Terima kasih, saya sudah memperbaikinya.
Oliver Ni

Jawaban:

7

JavaScript (ES7), 83 80 78 77 byte

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

Program yang sesuai dengan bonus ES3:

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)

Penjelasan

Ini mengambil keuntungan dari fakta bahwa output untuk mis. String 5 panjang dapat direpresentasikan sebagai:

abcdeabcd cbaedcb cdeab aed e
012345678 7654321 23456 543 4

di mana setiap digit mewakili indeks dalam string (mulai dari 0), modulo panjang string. Dengan kata lain, jika n adalah panjang string, kami menambah indeks 2n - 1 kali, lalu mengurangi 2 (n - 1) - 1 kali, lalu menambahkannya 2 (n - 2) - 1 kali, dll. Ini dapat disederhanakan dengan algoritma berikut:

  • Mulai indeks i di -1 .
  • Untuk setiap bilangan bulat x dalam rentang [n 2 ..1] :
    • Jika lantai (sqrt (x)) memiliki paritas yang sama (genap / ganjil) dengan n , selisih i .
    • Kalau tidak, pengurangan i .
    • Tambahkan karakter di indeks i mod n ke output.

Ini berfungsi karena lantai (sqrt (x)) beralih paritas setelah iterasi 2n - 1 , kemudian iterasi 2 (n - 1) - 1 , dll.

Produksi ETH
sumber
Beraneka ragam. Kerja bagus!
MayorMonty
1

Pyth , 15 byte

.Wp.(H0_CZ.<LQU

Program yang mengambil input dari "quoted string"dan mencetak hasilnya.

Cobalah online! atau verifikasi semua kasus uji (dimodifikasi untuk input ganda).

Bagaimana itu bekerja

.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
TheBikingViking
sumber
1

Python 2.7 (dalam CMD.EXE), 91 byte

Ini memerlukan terminal dengan backspace kerja ( \b), dan tidak akan bekerja pada repl.it atau ideone.com . Pernyataan cetak yang diakhiri dengan koma memisahkan keluaran lebih lanjut dengan ruang alih-alih dengan baris baru atau kembali. Backspace memungkinkan kita untuk menimpa ruang pemisah.

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 byte

Cobalah ideone.com atau repl.it (terima kasih kepada Oliver). Input harus berupa string python, mis '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

Empat potong ditambahkan oleh loop ( s[i:], s[:n-i], r[i+2:], r[:n-i]) diambil dari empat tepi spiral. Misalnya dengan 01234kotak adalah:

01234
12340
23401
34012
40123

Jadi kita ambil 01234, 0123, 210, 4321. Variabelnya iadalah indeks nilai kiri atas di setiap langkah proses. Dalam spiral terakhir, beberapa irisan mungkin kosong.

Linus
sumber
Ini mungkin bukan hanya menghemat, tapi dengan mengubah ke Python 3, menyingkirkan S='', print Sdan S+=, dan pembungkus segala sesuatu sebelum i+=2dalam print()pernyataan dengan sep='', Anda dapat menyimpan 2 bytes.
Kade
@ Shebang saya tidak langsung ikuti. Silakan tambahkan python 3 jawab sendiri.
Linus
Anda dapat mengubah i<=nken>i
Oliver Ni
Menghemat satu byte.
Oliver Ni
@Liver, Terima kasih ... tetapi tidak berhasil"a string of odd length."
Linus
1

Jelly , 11 10 byte

ẋ2µṖȮṖUµÐL

TryItOnline! , atau semua tes

Bagaimana?

Kotak yang tidak terpisahkan adalah serangkaian deretan "tepi atas ditambah tepi kanan" dan "tepi bawah plus tepi kiri", yang masing-masing merupakan kebalikan dari putaran sebelumnya tanpa huruf pertama dan terakhir, dan yang pertama adalah input ditambah input tanpa huruf terakhir (mis. input "abcde"memiliki output "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.
Jonathan Allan
sumber
1

05AB1E, 12 byte

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

Cobalah online!

Penjelasan:

 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
Oliver Ni
sumber
0

C, 95 94 Bytes

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

Terinspirasi oleh jawaban @ETHproductions.

Cleblanc
sumber
0

Perl, 99 byte

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

Spasi bukan bagian dari program dan disediakan untuk keterbacaan.

Bukan kode yang sangat efisien. Saya seharusnya bisa memperpendek tiga baris pertama, tetapi semua yang saya coba gagal. Operator ternary itu juga perlu diperbaiki, tetapi dengan cara ini memungkinkan untuk memperpendek kode saya dengan, 10 byte karena saya dapat memotong begitu banyak.

Kode bekerja dengan menyusun daftar palindrom, dipisahkan oleh angka genap, yang mewakili nilai tempat dari string yang akan ditarik.

Gabriel Benamy
sumber
Anda dapat menggunakan -F yang akan menggantikan baris 1 dan 3. Berikan input dengan echo -nuntuk menghapus chop. (yang seharusnya membuat Anda sekitar 81 byte)
Dada
0

Sebenarnya , 21 13 byte

Algoritma ini sebagian besar didasarkan pada jawaban Jelly Jonathan Allan . Ada dua cara untuk mencetak hasil sebagai satu string. Pendekatan yang digunakan di sini menduplikasi langkah perantara dan kemudian menambahkannya ke total berjalan dalam register 1 (string kosong secara default); ;╕dalam fungsi, lalu di akhir. Pendekatan lain adalah menduplikasi langkah menengah, meninggalkan langkah-langkah duplikat pada tumpukan, dan menjumlahkannya menjadi satu string di akhir; ;dalam fungsi, lalu di akhir.

Saran bermain golf diterima. Cobalah online!

2*`dX;╕dXR`Y╛

Tidak melakukanolf

         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.
Sherlock9
sumber
0

Python 3, 59 byte

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

repl.it

Port langsung jawaban Jelly saya ; hanya program penuh yang mengambil input (bukan fungsi).
Ini print(x,end='')adalah pernyataan cetak yang tidak akan mencetak baris baru default.

Jonathan Allan
sumber
-1

Python 3, 93 byte

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

Cobalah online!

Oliver Ni
sumber
Daripada print(...,end=''), lakukanprint(end=s[i:]+s[:n-i]+r[i+2:]+r[:n-i]
FlipTack
1
Bagaimanapun, solusi ini tidak berhasil abcde, itu hilang epada akhirnya.
FlipTack
Coba i<=nalih-alih n-iuntuk kondisi Anda.
Linus