StringgnirtSStringgnirtSStringgnirtS


42

Inilah tantangan yang relatif sederhana untuk Anda.

Diberikan string dengan panjang N , output string ke depan, lalu ke belakang, lalu ke depan, lalu ke belakang ... dll. N kali. Misalnya, jika input Anda

Hello!

Anda harus menampilkan:

Hello!!olleHHello!!olleHHello!!olleH

Anda juga dapat secara opsional menampilkan satu baris baru.

Kiriman Anda dapat berupa program lengkap atau fungsi, dan Anda dapat mengambil input dan output dalam format yang masuk akal . Misalnya, Anda dapat mengambil IO dari STDIN / STDOUT, argumen fungsi dan nilai balik, dari file, dll. Anda dapat dengan aman berasumsi bahwa string input tidak akan kosong, dan hanya akan berisi ASCII yang dapat dicetak. Anda harus mengeluarkan string baru pada satu baris. Jadi, misalnya, jika output ke contoh terakhir adalah

Hello!
!olleH
Hello!
!olleH
Hello!
!olleH

Ini bukan solusi yang valid!

Berikut adalah beberapa kasus uji lagi:

Input:
a
Output:
a

Input:
abcd
Output:
abcddcbaabcddcba

Input:
OK!
Output:
OK!!KOOK!

Input:
4815162342
Output:
4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184

Input:
PPCG
Output:
PPCGGCPPPPCGGCPP

Input:
42
Output:
4224

Papan peringkat

Karena ini adalah tantangan , celah standar dilarang, dan jawaban terpendek dalam byte akan menang! Namun , ini juga merupakan kompetisi untuk mendapatkan jawaban terpendek dalam bahasa tertentu. Meskipun tidak mungkin bahwa jawaban Java akan mengalahkan jawaban dalam perl, atau bahasa golf, masih sangat mengesankan untuk memiliki jawaban Java terpendek. Jadi, Anda bisa menggunakan leaderboard ini untuk melihat keduanya

  1. Jawaban terpendek dari semua bahasa, dan

  2. Jawaban terpendek dalam masing-masing bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

# Perl, 43 + 2 (-p flag) = 45 bytes

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

code-golf  string  code-golf  math  geometry  data-structures  repeated-transformation  code-golf  number  random  code-golf  math  rational-numbers  code-golf  ascii-art  animation  code-golf  ascii-art  number  code-golf  math  number  code-golf  data-structures  code-golf  string  parsing  code-golf  array-manipulation  random  permutations  code-golf  string  code-golf  parsing  code-golf  string  quine  code-golf  string  parsing  comment  code-golf  string  counting  natural-language  code-golf  string  decision-problem  code-golf  math  code-challenge  metagolf  test-battery  code-golf  string  code-golf  math  number  arithmetic  source-layout  code-golf  number  primes  decision-problem  code-golf  math  arithmetic  code-golf  date  code-golf  string  cryptography  code-golf  code-golf  chess  board-game  code-golf  geometry  grid  puzzle-solver  set-partitions  code-golf  number  natural-language  code-golf  ascii-art  code-golf  math  code-golf  string  ascii-art  kolmogorov-complexity  code-golf  string  natural-language  code-golf  game  board-game  tic-tac-toe  code-golf  ascii-art  hexagonal-grid  code-golf  string  comment  code-golf  internet  code-golf  sorting  code-golf  kolmogorov-complexity  unicode  code-golf  tips  code-golf  string  natural-language  code-golf  string  kolmogorov-complexity  source-layout  hello-world  code-golf  string  kolmogorov-complexity  counting  natural-language  code-golf  random  quine  code-golf  string  math  bitwise  code-golf  permutations  code-golf  string  code-golf  arithmetic 

Dalam contoh Anda, bukankah seharusnya begitu olleH, bukan elloH?
Arnaud

2
@Downgoat Tidak, Anda harus mengambil input dan output dalam format yang sama dengan spesifikasi yang dijelaskan.
DJMcMayhem

4
Bukankah seharusnya judulnya StringgnirtSStringgnirtSStringgnirtS ?
Luis Mendo

2
@carusocomputing Tidak akan: "Anda dapat dengan aman mengasumsikan bahwa string input tidak akan kosong, dan hanya akan berisi ASCII yang dapat dicetak."
Martin Ender

1
en.wikipedia.org/wiki/ASCII#Printable_characters Ah, tidak tahu itu adalah subset ASCII yang didefinisikan dengan baik. Saya membayangkan bisa dicetak untuk memasukkan \ t, \ n, dll ...
Magic Octopus Gn

Jawaban:


22

Vim, 39 , 34 penekanan tombol

:se ri
Y:s/./<C-r>"/g
<C-o>qqgJC<C-r>"<esc>gJ@qq@q

5 byte disimpan berkat @Lynn!

Berikut adalah gif dari itu terjadi secara langsung: (Perhatikan bahwa gif ini adalah versi sebelumnya karena saya belum punya waktu untuk merekamnya kembali).

masukkan deskripsi gambar di sini

Dan inilah penjelasan cara kerjanya:

:se ri                  "Turn 'reverse indent' on.
Y                       "Yank this line
:s/./<C-r>"/g           "Replace every character on this line with the register
                        "We just yanked followed by a newline
<C-o>                   "Jump to our previous location
     qq                 "Start recording in register 'q'
       gJ               "Join these two lines
         C              "Delete this line, and enter insert mode
          <C-r>"<esc>   "Paste the line we just deleted backwards 
gJ                      "Join these two lines
  @q                    "Call macro 'q'. This will run until we hit the bottom of the buffer.
    q                   "Stop recording.
     @q                 "Start our recursive macro

Di samping catatan, Yambil baris baru ekstra, yang biasanya merupakan fitur yang menjengkelkan. Ini mungkin yang pertama kalinya ia benar-benar menyelamatkan beberapa byte!


2
Alih-alih :%s/\n<cr>, Anda bisa melakukannya v{gJuntuk menghemat tiga byte.
Lynn

2
Jawaban VIM ?! Itu langkah berkelas di pihak Anda.
Magic Octopus Mm

@ Lynn Terima kasih atas tipnya! Saya akhirnya melakukan sesuatu yang sedikit berbeda dan malah melepas 5.
DJMcMayhem

Ini mengasumsikan bahwa @qkosong pada awalnya, kan? atau @qrekaman sebelum berhenti akan melakukan sesuatu yang sewenang-wenang. (Ini membawa saya ke vivi trivium favorit saya yang saya buat: semua orang tahu bahwa berhenti vim semudah :q<CR>, tetapi bagaimana Anda menutup dan menyimpan semua file Anda? qqqqqZZ@qq@q
Easy

@wchargin Ya, ini memang @qharus kosong. Kenapa tidak lakukan :wqasaja? Juga ingin tahu cara menghasilkan fraktal di vim? qqqqq<C-w>v<C-w>n@qq@q: D
DJMcMayhem

18

Python, 40 byte

f=lambda s,i=0:s[i:]and s+f(s[::-1],i+1)

Fungsi rekursif. Tambahkan string input ske fungsi kebalikan hingga penghitung imelebihi panjang s.


Wow. Saya baru saja akan mengirimkan jawaban python 56 byte, haha
DJMcMayhem

@DJMcMayhem juga berdetak lambda s:(len(s)*(s+s[::-1]))[:len(s)**2]satu byte.
Jonathan Allan

Saya mendapatkan ini f = lambda s : ''.join([s[((-1)**(i//len(s)) <= 0)*(len(s)-1)+(-1)**(i//len(s))*(i%len(s))] for i in range(len(s)*len(s))])tetapi menurut 136 byte sys.sizeof, menariknya ukurannya samaf = lambda s : ''.join([s[::1] if i%2 else s for i in range(len(s))])
Carel

12

Brain-Flak , 418 378 228 byte

Ini adalah karya Brain-Flak saya. Mungkin tidak bermain golf dengan baik tetapi tantangannya adalah yang paling sulit yang pernah saya temui.

Cobalah online!

(([])[()]){({}[()]<(({}(<()>))<{({}[()]<(({}()<(({}<>))>)<({()<({}[()]<({}<({}<>)<>>)>)>}{}<>){({}[()]<({}<>)<>>)}{}>)>)}{}{}<>([]){{}({}<>)<>([])}{}<>>)>)}{}([(({}))]{({})({}[()])}{}){(({}[({}<>)<>])<<>({}<><{(({}[()])<{({}[()]<({}<({}<>)<>>)>)}{}<>([]){{}({}<>)<>([])}{}<>>)}{}>)>)}

Penjelasan

Penjelasan ini sekarang agak ketinggalan jaman tetapi masih cukup baik untuk menjelaskan program.

Penjelasan ini akan sedikit berbeda dari proses penjelasan reguler saya. Saya akan menjelaskan bagaimana saya mencapai hasil ini daripada menjelaskan hasilnya secara berurutan. Ini dia:

Rol

Setelah menyelesaikan masalah ini sedikit saya menemukan kode ini:

(n[()])({()<({}[()]<({}<({}<>)<>>)>)>}{}<>){({}[()]<({}<>)<>>)}{}<>

Kode ini (di mana n adalah literal untuk beberapa angka. Mis. ()()) Akan mengambil item di atas tumpukan dan memindahkannya ke bawah n langkah. Dengan n sebagai tinggi tumpukan, ini akan melakukan tumpukan "roll". yaitu memindahkan item atas ke bagian bawah tumpukan. Begini cara kerjanya:

Kami menempatkan tempat kami ingin memindahkan item ke minus satu di tumpukan. Kenapa minus satu? Saya tidak tahu itu hanya bekerja seperti itu.

(n[()])

Kami kemudian loop sampai angka ini mencapai nol melacak loop dengan a ().

{()<({}[()]<...>)>)>}{}

Setiap kali kami mengulang, kami mengambil item teratas dan memindahkan item di bawahnya ke tumpukan lain. Ini menempatkan nomor di atas di tempatnya.

({}<({}<>)<>>)

Yang perlu kita lakukan sekarang adalah memasukkan angka yang kita pindahkan kembali. Kami beralih ke tumpukan off dan mendorong jumlah menjalankan loop dibuat.

(...<>)

Kami mengulangi decrementing angka yang baru ditekan hingga mencapai nol. Setiap kali kami memindahkan satu nomor kembali.

{({}[()]<({}<>)<>>)}{}<>

Membalikkan

Saya selanjutnya memodifikasi gulungan untuk membuat tumpukan penuh terbalik:

(n){(({}[()])<{({}[()]<({}<({}<>)<>>)>)}{}<>([]){{}({}<>)<>([])}{}<>>)}{}

Sekali lagi n mewakili kedalaman kebalikannya. Itu adalah n item teratas di stack yang akan dibalik. Bagaimana itu bekerja:

Kebalikannya hanyalah roller yang dibungkus dengan fantastis. Kami hanya menggulung bagian atas tumpukan dan kali mengurangi kedalaman gulungan dengan satu setiap kali.

(n){(({}[()])<ROLLER>)}{}

Duplikat

Duplikasi di tempat sulit. Sangat sulit. Setelah saya menemukan cara untuk membalikkan tumpukan itu masih butuh banyak upaya untuk menghasilkan algoritma duplikasi.

Ini dia:

(((n)<{({}[()]<(({}<>))<>>)}{}<>>)<{({}[()]<({}<>)<>([][()])({()<({}[()]<({}<({}<>)<>>)>)>}{}<>){({}[()]<({}<>)<>>)}{}<>>)}{}<>([]){{}({}<>)<>([])}{}<>([]){(({}[()])<{({}[()]<({}<({}<>)<>>)>)}{}<>([]){{}({}<>)<>([])}{}<>>)}{}>)

Ini agak besar tapi inilah cara kerjanya:

Mulailah dengan mendorong n. n adalah kedalaman duplikat. Kami juga membuka dua tanda kurung. Ini memungkinkan kita untuk menyimpan nilai n dalam cakupan sampai dibutuhkan lagi.

(((n)<

Selanjutnya kita mengulangi n kali setiap kali mendorong nilai teratas tumpukan ke tumpukan tidak aktif dua kali. Ini membuat duplikat awal untuk setiap nomor di tumpukan.

{({}[()]<(({}<>))<>>)}{}

Sekarang kami memiliki dua salinan dari masing-masing nomor di offstack. Kita perlu memisahkan ini menjadi dua kelompok.

Jadi kami beralih ke offstack dan mengingat salah satu ns yang kami simpan di awal.

<>>)

Kami mengulangi n kali.

{({}[()]<...>)}{}

Setiap kali kami memindahkan satu salinan ke mainstack.

({}<>)<>

Dan gulung satu salinan ke bagian bawah tumpukan. (Ini mengasumsikan offstack kosong untuk memulai dengan membuat duplikat ini tidak menumpuk bersih)

([][()])ROLLER

Setelah selesai, kami telah membagi dokumen asli menjadi dua kelompok "asli" dan salinan di offstack (salinan sebenarnya terbalik). Jadi kita hanya memindahkan salinan ke tumpukan utama dan kita bisa menyelesaikannya.

([]){{}({}<>)<>([])}{}<>

Program kerangka

Sekarang saya telah membuat semua bagian dari program, saya hanya perlu memasukkannya ke dalam bingkai.

Bingkai menggandakan teks satu kurang dari waktu tinggi tumpukan Menggunakan duplikat.

(([])[()])
{
 ({}[()]<
  DUPLICATE 
 >)
>)}{}

Dan kemudian membalikkan tumpukan dengan mengurangi kenaikan ketinggian tumpukan awal dari n ^ 2-n ke 0.

(({}))
{
 (({}[()])<
  ({}<>)<>(({}))({<({}[()])><>({})<>}{})<>{}<>
  ({}<({}<>)<>>)<>({}<>)
  ({}<
   REVERSE
  >)
 >)
}{}{}

5
Luar biasa. Anda selalu meledakkan pikiran saya dengan apa yang bisa dilakukan bahasa ini! : D
DJMcMayhem

10

Jelly , 4 3 byte

,Ṛṁ

Cobalah online! atau Verifikasi semua kasus uji.

Menyimpan satu byte berkat @ Maltysen .

Penjelasan

,Ṛṁ  Input: string S
 Ṛ    Reverse S
,     Join S with reverse of S. Makes a list [S, rev(S)]
  ṁ   Mold [S, rev(S)] to len(S) by repeating elements cyclically
      Return and print implicitly as a string

1
cetakan tidak perluL
Maltysen

@Maltysen wow terima kasih, apakah Anda tahu itu dari kode sumber atau dari pengalaman
mil

dari pengalaman, saya tidak tahu Jelly, tapi saya agak menduga itulah yang akan dilakukan cetakan pada non-number, karena Jelly tidak benar-benar kelebihan beban, juga cetakan agak mengingatkan saya pada pembentukan kembali dari J
Maltysen

cetakan benar-benar hanya mengambil iterables, tetapi ia melemparkan bilangan bulat ke jangkauan pertama.
Dennis

1
Ya saya memperlakukan cetakan sebagai membentuk kembali jadi saya hanya terbiasa memberinya nomor. Ada begitu banyak suguhan kecil yang apik di Jelly, seperti bagaimana serangkaian string hanya secara otomatis dihasilkan sebagai string yang digabungkan
mil

9

PHP, 54 52 byte

(49 byte, tetapi tidak berfungsi jika string berisi '0')

for(;($a=$argv[1])[$i++];)echo$i%2?$a:strrev($a);

(52 byte)

<?=str_pad('',strlen($a=$argv[1])**2,$a.strrev($a));

(54 byte)

for(;$i++<strlen($a=$argv[1]);)echo$i%2?$a:strrev($a);

Saya benar-benar lupa str_pad. bagus
Titus

8

2sable , 3 byte

Kode:

gGÂ

Penjelasan:

g   # Get the length of the input
 G  # Do the following n - 1 times:
  Â # Bifurcate, which duplicates a and reverses the duplicate

Menggunakan pengkodean CP-1252 . Cobalah online!


6

Ruby, 39 byte

->(s){s.reverse!.gsub(/./){s.reverse!}}

Saya payah di Ruby. Bantuan bermain golf sangat dihargai.

Ruby adalah bahasa yang sangat bagus untuk ini karena .reverse!

Penjelasan

Saya berharap itu akan menjadi sesuatu yang sederhana seperti:

s.gsub(/./){s.reverse!}

tetapi karena pembatasan boilerplate / tantangan itu lebih lama.

Apa s.reverse!yang sangat bermanfaat. s.reverse!pada dasarnya s = s.reverse!, artinya juga bermutasi s.


Apa yang dilakukan masing-masing bagian dari program dijelaskan di bawah ini:

->(s){             # Lambda with argument s
      s.reverse!   # Reverse `s` see above for details
      .gsub(/./)   # Replace every character with...
      {s.reverse!} # the input reversed!

Hal s.reverse!yang hebat adalah bahwa setiap kali dievaluasi stringnya terbalik. Jadi saat itu menggantikan string. sdimodifikasi!


Dengan -pbendera, Anda dapat menyimpan 4 byte:$_.reverse!;gsub(/./){$_.reverse!}
Jordan

@ Jordan, bukankah aku butuh .chompperhatian $_? tampaknya termasuk baris baru saat ini
Downgoat

Tidak jika Anda melakukan sesuatu seperti di ruby -pe '$_.reverse!;gsub(/./){$_.reverse!}' < file.txtmana file.txtbaris tanpa baris baru: V Ngomong-ngomong, jika Anda memutuskan untuk tidak melakukannya, Anda tidak perlu parens pada lambda begitu ->sberfungsi
Value Ink

@ ValueInk, Anda dapat memberikan input tanpa baris baru tanpa file jika Anda mem-pipe-nya. Atau Anda bahkan dapat mengetiknya secara manual, tidak cukup tekan Enter: i.stack.imgur.com/6luxM.png
manatwork

1
Anda tidak perlu tanda kurung di sekitar argumen lambda. Juga, saya pikir Anda dapat mencukur salah satu dari tanda seru:s.gsub(/./){s.reverse!.reverse}
m-chrzan

6

Perl, 24 byte

Termasuk +2 untuk -lp

Berikan masukan pada STDIN:

rev.pl <<< Hello!

rev.pl:

#!/usr/bin/perl -lp
s%.%s/.?/chop/eg;$`%eg

Anehnya ini tidak menggunakan reverseoperator builtin . Nama itu panjang sekali, semua solusi yang bisa saya pikirkan reverseadalah setidaknya 1 byte lebih lama.


Terpilih untuk mencari solusi yang membutuhkan byte lebih sedikit daripada built-in
MilkyWay90

6

J, 13 8 byte

Disimpan 5 byte berkat mil!

#;@$];|.

Ini adalah kereta 5 dengan kata kerja berikut:

# ;@$ ] ; |.

Garpu dalam terdiri dari ](identitas), ;(tautan), dan |.(terbalik). Mengamati:

   (| ; |.) 'Hello!'
+------+------+
|Hello!|!olleH|
+------+------+

Dua kata kerja terluar membuat sisa dari kereta. #adalah, dalam hal ini, ukuran argumen, yaitu panjangnya. Kata kerja yang menghubungkan ini adalah ;@$, atau ravellebih reshape. Mengamati:

   # 'Hello!'
6
   6 $ (] ; |.) 'Hello!'
+------+------+------+------+------+------+
|Hello!|!olleH|Hello!|!olleH|Hello!|!olleH|
+------+------+------+------+------+------+
   ; 6 $ (] ; |.) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH
   6 ;@$ (] ; |.) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH
   (# ;@$ (] ; |.)) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH
   (# ;@$ ] ; |.) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH
   (#;@$];|.) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH

Solusi lama.

[:,|.^:(i.@#)

Cukup sederhana. |.terbalik, dan ^:merupakan konjungsi daya, yang berulang kali menggunakan kata kerja kiri (kanan) # kali. Ketika argumen yang benar adalah kata kerja, kata kerja itu disebut pada argumen. Kata kerja yang tepat dalam hal ini berkisar dari nol ( i.) hingga panjang ( #). Ketika dinaikkan ke array, hasil antara disimpan. Yang perlu dilakukan adalah meratakan array ,.

Hasil antara

   (i.@#) 'Hello!'
0 1 2 3 4 5
   |.^:0 1 2 3 4 5 'Hello!'
Hello!
!olleH
Hello!
!olleH
Hello!
!olleH
   |.^:(i.@#) 'Hello!'
Hello!
!olleH
Hello!
!olleH
Hello!
!olleH
   ([:,|.^:(i.@#)) 'Hello!'
Hello!!olleHHello!!olleHHello!!olleH

Anda dapat menyimpan byte dengan meninju panjang<@#
mil

Solusi 8 byte yang rapi adalah #;@$];|.mengemas inisial dan mundur, membentuk kembali string kotak dan meratakannya bersama
mil

@miles whoa, itu cukup rapi.
Conor O'Brien

5

JavaScript (ES 6), 59 50 byte

9 Bytes berkat Hedi dan Huntro.

f=(s,n=1)=>s[n]?s+f([...s].reverse().join``,n+1):s

fungsi rekursif.

Membalik string membutuhkan hampir setengah dari ukuran ( 25 22 byte!) ...
Mengapa tidak ada cara asli untuk itu?


1
Anda dapat menggunakan s[n]?...Intead darin<s.length?...
Hedi

1
Anda juga dapat menyimpan 3 byte dengan menggunakan [...s]alih-alihs.split``
Huntro

ya 36 byte idealnyaf=(s,n=1)=>n==1?s:s+s.reverse(),n-1)
caub

yang tidak rekursif f=(s,n=1)=>Array.from({length:n},(_,i)=>i%2?s.reverse():s).join``)yang juga akan lebih baik dengan beberapa fungsi yang lebih baik untuk jangkauan
caub

@caub: SyntaxError: Unexpected token )JS tidak memiliki pengembalian string asli. SyntaxError: Invalid or unexpected tokenuntuk saran kedua Anda. Browser apa yang berfungsi?
Titus

4

Minkolang , 17 byte:

$oId$z$Dz[rz[O]].

Coba di sini!

Penjelasan

$o                   Read in whole input as characters
  Id                 Push the length of stack and duplicate
    $z               Pop top of stack and store in register (z)
      $D             Pop top of stack (n) and duplicate whole stack n-1 times
        z[     ]     z times, do the following:
          r          Reverse the stack
           z[O]      z times, pop the top of stack and output as character
                .    Stop.

4

8088 Majelis, IBM PC DOS, 29 28 byte

Dirakit, xxddump:

00000000: d1ee ac48 938a cbfc 518a cbf7 da78 01fd  ...H....Q....x..
00000010: acac b40e cd10 e2f9 59e2 ecc3            ........Y...

Daftar yang belum dirakit:

D1 EE       SHR  SI, 1          ; point SI to DOS PSP (080H) 
AC          LODSB               ; load input string length into AL 
48          DEC  AX             ; remove leading space from length counter 
93          XCHG BX, AX         ; save input length to BL 
8A FB       MOV  BH, BL         ; string output counter in BH 
        S_LOOP: 
FC          CLD                 ; set direction forward 
8A CB       MOV  CL, BL         ; reset char counter in CL 
F7 DA       NEG  DX             ; flip DX to toggle fwd/back output 
78 01       JS   C_START        ; if positive, go forward 
FD          STD                 ; otherwise go backwards 
        C_START: 
AC          LODSB               ; adjust SI to first/last char
        C_LOOP: 
AC          LODSB               ; load next char into AL
B4 0E       MOV  AH, 0EH        ; PC BIOS tty output function
CD 10       INT  10H            ; write char to console
E2 F9       LOOP C_LOOP         ; continue looping through chars
FE CF       DEC  BH             ; decrement string count loop
75 EC       JNZ  S_LOOP         ; if not zero, continue loop
C3          RET                 ; exit to DOS

Standableone PC DOS program yang dapat dieksekusi. Input string melalui baris perintah, output adalah konsol.

masukkan deskripsi gambar di sini


3

Pip , 11 10 byte

L#aORVRV:a

Cobalah online!

Penjelasan:

            a is first cmdline argument (implicit)
L#a         Loop len(a) times:
      RV:a   Reverse a and assign back to a
   ORV       Output the reverse of a (since it needs to go forward first then backward)

3

Haskell, 40 36 32 Bytes

m s=take(length s^2)$cycle$s++reverse s

Contoh:

*Main> m "Hello!"
"Hello!!olleHHello!!olleHHello!!olleH"

Bahkan lebih pendek (kredit ke Damien):

q s=zip(s>>[s,reverse s])s>>=fst

s >> [s, mundur s] siklus ["abc", "cba", ...] yang di-zip untuk mengoreksi ukuran dan menyesuaikannya dengan fst


2
q s=zip(s>>[s,reverse s])s>>=fst
Damien

3
Atau Pointfree satu dengan ukuran yang sama:(>>=fst).(iterate reverse>>=zip)
Damien

3

Perl 6 ,  31  30 byte

{[~] (|($_,.flip)xx*)[^.chars]}

Simpan satu byte dengan menyalahgunakan .ords, yang mengembalikan daftar tata cara, lalu secara implisit mengubahnya menjadi angka untuk membuat rentang.

{[~] (|($_,.flip)xx*)[^.ords]}

Penjelasan:

# bare block lambda with implicit parameter 「$_」
{
  # reduce using string concatenation operator 「~」
  [~]

  (
    # create a Slip
    |(
      # of the input, and its string reverse
      $_, .flip

    # list repeated infinitely
    ) xx *

  # get the values in the range from 0 up-to and excluding
  # the number of characters 「0 ..^ +$_.ords」
  )[ ^.ords ]
}

Pemakaian:

my &code = {[~] (|($_,.flip)xx*)[^.ords]}

say code 'a'; # a
say code 'abcd'; # abcddcbaabcddcba
say code 'OK!'; # OK!!KOOK!
say code 4815162342; # 4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184

3

Vim + coreutils, 32 penekanan tombol

Anda tidak akan pernah memiliki terlalu banyak jawaban Vim.

qqYv:!rev
Pjq@=len(@")
@q2dkv{gJ

Penjelasan

qq               " Start recording macro
Y                " Yank (copy) line
v:!rev<CR>       " Reverse line with coreutils rev command
Pj               " Paste yanked line above this line
q                " Stop recording
@=len(@")<CR>@q  " Playback macro once for each character
2dk              " Delete last 3 lines
v{gJ             " Join lines

1
Dengan coreutils? Itu curang! : P
Christian Rondeau

3

MATL, 13 12 8 byte

Mendorong semua elemen, menggabungkan pada akhirnya.

td"tP]&h

td"  ]     %For loop over string length - 1 due to diff
   tP      %Push copy of string, reverse
      &h   %Concatenate entire stack horizontally

Cobalah online!


Versi lama:

Pendekatan yang sama sekali berbeda, berdasarkan pada fprintf:

t"t1$0#YDP]x

t"        ]   % For loop over string
  t           % Duplicate string for printing:
   1$0#YD     % `fprintf` with 1 input, 0 output (i.e., to screen).
         P    % Reverse
           x  % Empty stack to prevent implicit output

Versi berdasarkan pembalikan string template

ttd"wPtbYc]Dx

t                 %Duplicate input, to create 'accumulator' string 
                  % (alongside the input string which will serve as 'template'
 td               %Duplicate input, diff to get an stringof size input-1
   "       ]      %For loop over size n-1 string (consumes diff'd string)
     wP           %Get 'template' string on top of stack, and reverse
       tb         %Duplicate template string, and switch with 'accumulator' string
         Yc       %Concatenate template string with accumulator. 
            Dx   %Display top element, delete template string to prevent implicit disp

Saya suka penggunaan pintar td!
DJMcMayhem

@DJMcMayhem Terima kasih! Saya punya yang jelas tnq:"pertama, tetapi tn:"sedikit bau kode (lihat tip golf Matlab ini ) jadi saya pikir itu tnq:bisa lebih kompak juga.
Sanchises

3

Scala, 73 72 71 byte

def f(s:String)=for(i<-1 to s.length){print(if(i%2>0)s else s.reverse)}

Ini adalah upaya pertama saya di kode golf, jadi saya yakin ada banyak peningkatan.

Memperbarui:

Golf 1 byte dengan menghapus tanda kurung.

Berkat Destructible Semangka untuk saran, mencukur satu byte.


Saya tidak tahu scala, tetapi bisa Anda ubah i%2==1ke i%2>0?
Lemon Destructible

@DestructibleWatermelon Tidak memikirkan hal itu, ya saya bisa
Himself12794

3

Cubix , 52 byte

Ap\:\;.#u/\:qqsoq(?;u.q..$u<../pB@u:\.....\(?q..s..p

Di sebuah kubus:

      A p \
      : \ ;
      . # u
/ \ : q q s o q ( ? ; u
. q . . $ u < . . / p B
@ u : \ . . . . . \ ( ?
      q . .
      s . .
      p . .

Yang ini menyenangkan; masih ada byte yang harus di-golf-kan, tetapi ini pasti akan berhasil.

Cobalah online!

penjelasan:

Input dari ABC

  • /A: pergi ke utara dan membaca semua input sebagai karakter; -1akan di bagian bawah
  • p\;.: hapus -1dari tumpukan
  • u# : dorong panjang string (jumlah item pada tumpukan)
  • \:\:qq : dup panjang string dua kali, tekan dua salinan ke bagian bawah tumpukan
  • lingkaran:

    • soq(?/<u : bertukar top stack, ouptut atas stack sebagai ASCII, tekan top (letter) ke bawah, decrement top stack, belok kanan jika tidak dilakukan, kemudian pindahkan IP ke tempat yang tepat.
    • pada akhir loop, tumpukan akan terlihat seperti C B A 3 3 0
  • ;u : pop top of stack C B A 3 3

  • B : tumpukan terbalik 3 3 A B C
  • p( : pindah ke bawah ke atas dan mengurangi 3 A B C 2
  • ?jika top adalah nol, langsung ke @dan hentikan
  • lain
    • psq:uq : pindah dari bawah ke atas, bertukar atas dan pindah ke atas dup ke bawah, dan pindah ke atas ke bawah 3 2 A B C 3
    • $u : lewati u
    • < menempatkan kita kembali ke loop.

Penerjemah


Berikut ini 24 byte satu. Logika umum yang sama hanya dikompresi sedikit.
MickyT

@MickyT Saya merasa tidak enak tentang mengambil kredit untuk 28 byte golf. Posting sendiri!
Giuseppe

3

C (gcc) , 88 87 85 83 68 66 83 82 78 byte

-1 terima kasih kepada ceilingcat

Versi lama

p,q;f(char*s){p=q=1;for(char*m=s--;*m;s[p+=q]*p?:(m++,p+=q=-q))putchar(s[p]);}

Cobalah online!

Versi lebih pendek (sedikit rusak)

Riffing pada pendekatan 76 byte oleh ASCII-hanya di komentar, dan -1 byte dari tweak tweak saya.

Sunting: Versi ini sedikit rusak karena mengasumsikan bahwa setiap string didahului oleh byte NULL, yang tidak selalu benar. (Lihat test case terakhir di tautan). Mengembalikan ke versi 83 byte untuk saat ini.

f(char*s){for(char*n=s-1,k=1;*s++;k=-k)for(;*(n+=k);)putchar(*n);}

Cobalah online!



@ ASCII-only 68 dimungkinkan dengan beberapa penyesuaian.
gastropner

: P sekarang 67 sekarang lol @gastropner
ASCII

@ ASCII-satunya 66 :-P
gastropner

@ ASCII-only Sedihnya, versi singkatnya ternyata tidak berfungsi dalam kasus-kasus tertentu.
gastropner

2

Java, 127 111 88 byte

(s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?new StringBuffer(s).reverse():s;return r;};

Program tes tidak digabungkan

    public static void main(String[] args) {
    BiFunction<String, String, String> func = (s, r) -> {
        for (int i = 0; i++ < s.length();) {
            r += i % 2 < 1 ? new StringBuffer(s).reverse() : s;
        }
        return r;
    };
    System.out.println(func.apply("Hello!", ""));
}

Ini dapat di-golf lagi: (s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?s:new StringBuffer(s).reverse();return r;};( 88 byte ). Juga, saya akan menentukan bahwa ini adalah Java 8.
Kevin Cruijssen

Na, tidak apa-apa untuk menganggap bahwa dia menggunakan versi terbaru Java.
Shaun Wild

@KevinCruijssen Java 7 tidak didukung lagi (kecuali dengan $$$ besar). Kita tidak harus menentukan versi Java. Juga, jika Anda menulis sebagai Java 7, sebagian besar jawabannya dapat ditulis dalam Java 1.1 atau 1.2. Jadi bukankah seharusnya Anda menulis versi terendah yang berfungsi? Jika kode dalam jawaban ini adalah Java 7 compliant, itu akan menjadi Java 1.2 compliant, dan ... akan tetap berfungsi di Java 8.
Olivier Grégoire

2

R, 53 byte

Asumsikan bahwa input dipisahkan oleh spasi atau baris untuk setiap karakter.

cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")

Beberapa test case:

> cat(rep(c(i<-scan(,""),rev(i)),len=length(i)^2),sep="")
1: h e l l o !
7: 
Read 6 items
hello!!ollehhello!!ollehhello!!olleh

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: a
2: 
Read 1 item
a

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: a b c d
5: 
Read 4 items
abcddcbaabcddcba

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: O K !
4: 
Read 3 items
OK!!KOOK!

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: 4 8 1 5 1 6 2 3 4 2
11: 
Read 10 items
4815162342243261518448151623422432615184481516234224326151844815162342243261518448151623422432615184

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: P P C G
5:    
Read 4 items
PPCGGCPPPPCGGCPP

> cat(rep(c(i<-scan(,""),rev(i)),l=length(i)^2),sep="")
1: 4 2
3: 
Read 2 items
4224

2

PowerShell v2 +, 57 byte

param($a)-join(1..($x=$a.length)|%{($a[$x..0],$a)[$_%2]})

Tidak ada cara nyata bersih untuk mendapatkan panjang tali atau membalikkannya, jadi ini cukup panjang.

Mengambil input $a, loop dari 1ke $a.length(disimpan $xuntuk digunakan nanti). Setiap iterasi, kami menggunakan pseudo-ternary untuk mengindeks ke dalam array salah satu $aatau $a[$x..0](yaitu, dibalik), berdasarkan apakah nomor input kami ganjil / genap [$_%2]. Ini semua diringkas dalam parens dan diedit -joinbersama untuk membentuk string tunggal. Itu tertinggal di pipeline, dan output tersirat.

PS C:\Tools\Scripts\golfing> .\stringgnirts.ps1 'TimmyD'
TimmyDDymmiTTimmyDDymmiTTimmyDDymmiT

2

Java, 151 byte

public static void r(String s){String t = new StringBuffer(s).reverse().toString();for(int i=0;i<s.length();i++){System.out.print(((i%2==1)?t:s));}}

}

Tidak Disatukan:

public static void r(String s) {
    String t = new StringBuffer(s).reverse().toString();
    for(int i = 0; i < s.length();i++) {
        System.out.print(((i % 2 == 1) ? t : s));
    }
}


1
Hai, selamat datang di PPCG! Pertama-tama saya ingin merekomendasikan membaca Tip untuk bermain golf di Jawa . Adapun kode Anda, ada beberapa hal yang masih bisa di-golf: Anda dapat menghapus public staticsebelum metode Anda. Anda dapat menghapus spasi di antara t=new StringBuffer. Anda dapat menghapus kurung dan kurung yang tidak perlu. Dan Anda dapat menukar cek modul dari ==1ke <1(yang setara dengan ==0untuk angka non-negatif). Anda juga dapat memindahkan i++ke penggunaan terakhir di dalam for-loop.
Kevin Cruijssen

6
Jadi secara total menjadi: void r(String s){for(int i=0;i<s.length();)System.out.print(i++%2<1?s:new StringBuffer(s).reverse()+"");}( 105 byte )
Kevin Cruijssen

2

C #, 94 byte

using System.Linq;string R(string n)=>string.Concat(n.SelectMany((c,i)=>1>i%2?n:n.Reverse()));

76 byte untuk metode + 18 byte untuk impor LINQ.

Bagaimana itu bekerja:

using System.Linq; // Required for LINQ extension methods.

string R(string n) => 
    string.Concat( // Concatenate the following chars into a single string
        n.SelectMany( // Enumerate each char in n, flattening the returned IEnumerable<char>'s into a single IEnumerable<char>
            /*IEnumerable<char> Lambda*/(/*char*/ c, /*int*/ i) => // i = index in n
                1 > i % 2 // Check if i is even or odd
                    ? n // if i is even, add n to the concat
                    : n.Reverse() // else reverse n and concat that
        )
    )
;

2

CJam , 10 byte

l_,({_W%}*

Cobalah online!

Penjelasan

l            e# Read line
 _           e# Duplicate
  ,(         e# Length minus 1
    {   }*   e# Run code block that many times
     _       e# Duplicate
      W%     e# Reverse
             e# Implicitly display

2

Oktaf, 39 35 byte

@(x)[x'+~x;flip(x'+~x),''](1:end/2)

f('Hello!')
ans = Hello!!olleHHello!!olleHHello!!olleH

Penjelasan:

@(x)            % Take x as input, inside apostrophes 'Hello!'
x'+~x           % Create a mesh of the ASCII-code of the input letters
                % For input `bcd` this will be:
                %    98    98    98
                %    99    99    99
                %   100   100   100
;flip(x'+~x)   % Concatenate vertically to create:
                %    98    98    98
                %    99    99    99
                %   100   100   100
                %   100   100   100
                %    99    99    99
                %    98    98    98
___,'']         % Short cut to convert ASCII-code to characters
(1:end/2)       % Display the first half of this array of letters, as a
                % horizontal string

Disimpan 4 byte berkat Luis. ~xbukannya 0*xdisimpan satu byte (berfungsi karena semua elemen x tidak nol. flipAlih-alih flipudmenyimpan dua byte lainnya (saya tidak tahu flipada).


2

bash + util-linux, 68 58 53 byte

y=$1;for((i;i<${#1};i++)){ echo -n $y;y=`rev<<<$y`;}

Penjelasan

Dua hal dengan forloop:

  • Ada cara penulisan forloop yang tampaknya tidak berdokumen di mana seseorang mengganti dodan donekata kunci dengan kurung kurawal {dan }. Ruang setelah braket pertama diperlukan, dan titik koma di akhir juga diperlukan.
  • Ternyata dalam forloop "C-style" , Anda bisa menginisialisasi dengan i;alih - alih menggunakan i=0;.
  • Bagian ${#1}dari kondisi i < ${#1}mengacu pada panjang input kami (parameter pertama $1). Secara umum, Anda dapat menggunakan ${#foo}untuk mengambil ukuran string $foo.

Selain itu:

  • rev adalah alat di util-linux yang membalik string.
  • Kita harus melewati -nbendera untuk echomenyingkirkan baris baru.
  • Ekspresi rev<<<$ydisebut string di sini (lihat halaman tldp.org yang relevan ), yang meneruskan variabel $yke input standar rev.

Tolong jelaskan beberapa pengetahuan Anda. Juga mungkin ruang sebelum gema dapat dilepas, saya tidak tahu apa-apa tentang bash
Rohan Jhunjhunwala

@RohanJhunjhunwala Menambahkan sedikit penjelasan pada jawaban untuk mungkin membantu memperjelas beberapa hal. Juga: saat menghilangkan dodan donekata kunci dalam satu forlingkaran, Anda benar - benar melakukannya membutuhkan ruang itu!
frame

+1 terlihat bagus sekarang. Saya hanya berkomentar karena kode Anda menggambar bendera kualitas rendah otomatis. Hanya jawaban kode yang ditandai secara otomatis
Rohan Jhunjhunwala

y=$1;for((;i<${#1};i++)){ printf $y;y=`rev<<<$y`;}... menyimpan beberapa byte
roblogic

2

Japt , 11 byte

ê1 pUÊ ¯Uʲ
ê1          // Append the reverse of the input to the input,
   pUÊ      // then repeat it input length times
       ¯Uʲ // and finally trim to length input length squared.

Cobalah online!



@ Shaggy saya mencoba menggunakannya, tetapi untuk kehidupan saya, saya tidak bisa menguasainya. : P Terima kasih banyak untuk contohnya!
Nit

Maaf, memposting tautan yang salah, sebenarnya 6 byte .
Shaggy


1
@ Shaggy aku tidak keberatan, dan itu cukup berbeda dari jawaban Nit. Go for it man.
Oliver

2

05AB1E , 7 byte

vDR}v}J

Cobalah online!

Akan terus bekerja di sana. Saya tidak terlalu suka bagian "v}", mungkin bisa menyimpan byte di sana.

Penjelasan

vDR}v}J

v         ; Iterates through each character
 D        ; Duplicate top of stack
  R       ; Push top of stack reversed
   }      ; end for loop
   v}     ; same as other v, effectively pops top of stack off
     J    ; Join everything together

1
vÂ}\J 5 byte sama dengan kode Anda, tetapi dengan builtin yang Anda cari. :)Âadalah Bifurcate (kependekan dari Duplicate & Reverse, yang persis seperti yang Anda lakukan). \ menghapus item teratas di stack.
Kevin Cruijssen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.