StringgnirtSStringgnirtSStringgnirtS


42

Đây là một thử thách tương đối đơn giản cho bạn.

Cho một chuỗi có độ dài N , xuất chuỗi về phía trước, sau đó ngược lại, sau đó chuyển tiếp, sau đó ngược lại ... vv N lần. Ví dụ: nếu đầu vào của bạn là

Hello!

Bạn nên xuất:

Hello!!olleHHello!!olleHHello!!olleH

Bạn cũng có thể tùy ý xuất một dòng mới.

Nội dung gửi của bạn có thể là một chương trình đầy đủ hoặc một chức năng và bạn có thể nhận đầu vào và đầu ra ở bất kỳ định dạng hợp lý nào . Ví dụ: bạn có thể lấy IO từ STDIN / STDOUT, đối số hàm và giá trị trả về, từ một tệp, v.v. Bạn có thể giả định rằng chuỗi đầu vào sẽ không trống và sẽ chỉ chứa ASCII có thể in được. Bạn phải xuất chuỗi mới trên một dòng. Vì vậy, ví dụ, nếu đầu ra cho ví dụ cuối cùng là

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

Đây sẽ không phải là một giải pháp hợp lệ!

Dưới đây là một số trường hợp thử nghiệm:

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

Bảng xếp hạng

Vì đây là một thử thách , nên các lỗ hổng tiêu chuẩn bị cấm và câu trả lời ngắn nhất bằng byte sẽ thắng! Tuy nhiên , đây cũng là một cuộc thi để có câu trả lời ngắn nhất trong bất kỳ ngôn ngữ cụ thể nào. Mặc dù không chắc rằng câu trả lời Java sẽ đánh bại câu trả lời bằng perl hoặc một số ngôn ngữ chơi gôn, nhưng vẫn rất ấn tượng khi có câu trả lời Java ngắn nhất. Vì vậy, bạn có thể sử dụng bảng xếp hạng này để xem cả hai

  1. Câu trả lời ngắn nhất trong số tất cả các ngôn ngữ và

  2. Câu trả lời ngắn nhất trong mỗi ngôn ngữ cá nhân.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

# [><>](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 

Trong ví dụ của bạn, không nên như vậy olleH, phải không elloH?
Arnaud

2
@Downgoat Không, bạn phải lấy đầu vào và đầu ra ở cùng định dạng như thông số kỹ thuật mô tả.
DJMcMayhem

4
Không phải tiêu đề là StringgnirtSStringgnirtSStringgnirtS ?
Luis Mendo

2
@carusocomputing Nó sẽ không: "Bạn có thể giả định rằng chuỗi đầu vào sẽ không trống và sẽ chỉ chứa ASCII có thể in được."
Martin Ender

1
vi.wikipedia.org/wiki/ASCII#Printable_char character Ah, không biết đó là một tập hợp con được xác định rõ của ASCII. Tôi tưởng tượng có thể in được để bao gồm \ t, \ n, v.v ...
Bạch tuộc ma thuật Urn

Câu trả lời:


22

Vim, 39 , 34 tổ hợp phím

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

5 byte được lưu nhờ @Lynn!

Đây là một gif của nó đang diễn ra trực tiếp: (Lưu ý rằng gif này là phiên bản trước vì tôi chưa có thời gian để ghi lại nó).

nhập mô tả hình ảnh ở đây

Và đây là một lời giải thích về cách thức hoạt động của nó:

: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

Bên cạnh đó, Ylấy thêm một dòng mới, thường là một tính năng đáng ghét. Đây có lẽ là lần đầu tiên nó thực sự đã lưu một vài byte!


2
Thay vì :%s/\n<cr>, bạn có thể làm v{gJđể lưu ba byte.
Lynn

2
Câu trả lời VIM?! Đó là một động thái sang trọng về phía bạn.
Bạch tuộc ma thuật Urn

@Lynn Cảm ơn vì tiền boa! Cuối cùng tôi đã làm một cái gì đó hơi khác và thay vào đó là 5.
DJMcMayhem

Điều này giả định @qlà trống khi bắt đầu, phải không? hoặc @qtrước khi dừng ghi sẽ làm một cái gì đó tùy ý. (Điều này dẫn tôi đến viv trivium yêu thích của tôi mà tôi đã nghĩ ra: mọi người đều biết rằng việc thoát vim cũng dễ như vậy :q<CR>, nhưng làm thế nào để bạn đóng và lưu tất cả các tệp của mình? Dễ dàng: chỉ qqqqqZZ@qq@q!)
wchargein

@wchargein Có, cái này không cần @qphải trống. Tại sao không chỉ làm :wqathay thế? Cũng muốn biết làm thế nào để tạo ra một fractal trong 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)

Một hàm đệ quy. Chuẩn bị chuỗi đầu vào scho chức năng đảo ngược cho đến khi bộ đếm ivượt quá độ dài s.


Ồ Tôi vừa mới gửi câu trả lời python 56 byte, haha
DJMcMayhem

@DJMcMayhem nó cũng đập lambda s:(len(s)*(s+s[::-1]))[:len(s)**2]một byte.
Jonathan Allan

Tôi đã nhận được cái này 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))])nhưng nó có 136 byte sys.sizeof, thật thú vị, nó có cùng kích thước vớif = lambda s : ''.join([s[::1] if i%2 else s for i in range(len(s))])
Carel

12

Brain-Flak , 418 378 228 byte

Đây là kiệt tác Brain-Flak của tôi. Nó có thể không được chơi golf tốt nhưng thử thách là khó khăn nhất tôi từng gặp phải.

Hãy thử trực tuyến!

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

Giải trình

Giải thích này bây giờ hơi lỗi thời nhưng nó vẫn làm rất tốt công việc giải thích chương trình.

Giải thích này sẽ khác đi một chút so với quy trình giải thích thông thường của tôi. Tôi sẽ giải thích làm thế nào tôi đến về kết quả này hơn là giải thích kết quả theo thứ tự. Nó đi từ đây:

Trục lăn

Sau khi giải quyết vấn đề một chút, tôi nghĩ ra mã này:

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

Mã này (trong đó n là chữ của một số. Ví dụ ()()) sẽ lấy mục trên đầu ngăn xếp và di chuyển nó xuống n bước. Với n là chiều cao ngăn xếp, điều này sẽ thực hiện một "cuộn" ngăn xếp. tức là di chuyển mục trên cùng xuống dưới cùng của ngăn xếp. Đây là cách nó hoạt động:

Chúng tôi đặt vị trí chúng tôi muốn di chuyển vật phẩm để trừ đi một thứ trên ngăn xếp. Tại sao lại trừ đi một? Tôi không biết nó chỉ hoạt động theo cách đó.

(n[()])

Sau đó, chúng tôi lặp cho đến khi con số này đạt đến 0 theo dõi vòng lặp với a ().

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

Mỗi lần lặp, chúng tôi lấy vật phẩm trên cùng và di chuyển vật phẩm bên dưới nó sang ngăn xếp khác. Điều này đặt số trên đầu ở vị trí của nó.

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

Tất cả những gì chúng ta cần làm bây giờ là đặt những con số chúng ta đã di chuyển trở lại. Chúng tôi chuyển sang ngăn xếp tắt và đẩy số lần chạy vòng lặp được thực hiện.

(...<>)

Chúng tôi lặp lại giảm số lượng mới được đẩy cho đến khi nó bằng không. Mỗi lần chúng tôi di chuyển một số trở lại.

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

Đảo ngược

Tiếp theo tôi đã sửa đổi cuộn để tạo một ngăn xếp đầy đủ đảo ngược:

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

Một lần nữa n đại diện cho độ sâu của đảo ngược. Đó là n mục hàng đầu trên ngăn xếp sẽ được đảo ngược. Làm thế nào nó hoạt động:

Đảo ngược chỉ là một con lăn bọc huyền ảo. Chúng tôi chỉ đơn giản là cuộn đỉnh của ngăn xếp n lần giảm độ sâu của cuộn mỗi lần.

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

Bản sao

Nhân đôi tại chỗ là khó. Thực sự khó khăn. Sau khi tôi tìm ra cách đảo ngược ngăn xếp, nó vẫn mất rất nhiều nỗ lực để đưa ra thuật toán sao chép.

Đây là:

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

Đó là một chút của một lớn nhưng đây là cách nó hoạt động:

Bắt đầu bằng cách đẩy n. n là độ sâu của bản sao. Chúng tôi cũng mở hai dấu ngoặc đơn. Điều này cho phép chúng ta lưu trữ giá trị của n trong phạm vi cho đến khi cần lại.

(((n)<

Tiếp theo, chúng tôi lặp n lần mỗi lần đẩy giá trị trên cùng của ngăn xếp sang ngăn xếp tắt hai lần. Điều này làm cho các bản sao ban đầu cho mỗi số trên ngăn xếp.

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

Bây giờ chúng tôi có hai bản sao của mỗi số trên offstack. Chúng ta cần tách chúng thành hai nhóm.

Vì vậy, chúng tôi chuyển sang offstack và nhớ lại một trong những ns chúng tôi đã lưu lúc đầu.

<>>)

Chúng tôi lặp n lần.

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

Mỗi lần chúng tôi di chuyển một bản sao vào mainstack.

({}<>)<>

Và cuộn một bản sao vào dưới cùng của ngăn xếp. (Điều này giả định rằng offstack trống để bắt đầu làm cho bản sao này không được dọn sạch)

([][()])ROLLER

Khi đã xong, chúng tôi đã chia bản gốc thành hai nhóm "bản gốc" và một bản sao trên offstack (bản sao thực sự ngược lại). Vì vậy, chúng tôi chỉ cần di chuyển bản sao vào ngăn xếp chính và chúng tôi có thể được thực hiện với nó.

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

Chương trình bộ xương

Bây giờ tôi đã thực hiện tất cả các phần của chương trình, tôi chỉ cần chèn chúng vào một khung.

Khung nhân đôi văn bản ít hơn một lần so với chiều cao của ngăn xếp Sử dụng trùng lặp.

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

Và sau đó đảo ngược ngăn xếp theo mức tăng giảm của chiều cao ngăn xếp ban đầu từ n ^ 2-n thành 0.

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

5
Kinh ngạc. Bạn luôn thổi vào tâm trí tôi những gì ngôn ngữ này có thể làm! : D
DJMcMayhem

10

Thạch , 4 3 byte

,Ṛṁ

Hãy thử trực tuyến! hoặc Xác minh tất cả các trường hợp thử nghiệm.

Đã lưu một byte nhờ @ Maltysen .

Giải trình

,Ṛṁ  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
nấm mốc không cầnL
Maltysen

@Maltysen wow cảm ơn, bạn có biết rằng từ mã nguồn hoặc từ kinh nghiệm
dặm

từ kinh nghiệm, tôi không biết Jelly, nhưng tôi đoán đó là những gì nấm mốc sẽ làm trên một con số không, vì Jelly không thực sự quá tải, cũng là khuôn mẫu nhắc nhở tôi về việc định hình lại từ J
Maltysen

khuôn thực sự chỉ mất iterables, nhưng nó đưa số nguyên vào phạm vi đầu tiên.
Dennis

1
Vâng, tôi đã coi nấm mốc là định hình lại nên tôi thường xuyên cho nó một con số. Có rất nhiều món nhỏ gọn trong Jelly, như thế nào một mảng của chuỗi chỉ là tự động đầu ra như là một chuỗi nối
dặm

9

PHP, 54 52 byte

(49 byte, nhưng không hoạt động nếu chuỗi chứa '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);

Tôi hoàn toàn quên mất str_pad. tốt đẹp
Tít

8

2sable , 3 byte

Mã số:

gGÂ

Giải trình:

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


6

Ruby, 39 byte

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

Tôi mút Ruby. Trợ giúp chơi gôn được đánh giá cao.

Ruby là một ngôn ngữ thực sự tốt cho việc này vì .reverse!

Giải trình

Tôi đã hy vọng nó sẽ đôi khi đơn giản như:

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

nhưng vì hạn chế nồi hơi / thách thức, nó dài hơn.

Điều gì s.reverse!là rất hữu ích. s.reverse!về cơ bản s = s.reverse!, có nghĩa là nó cũng đột biến s.


Những gì mỗi phần của chương trình làm được mô tả dưới đây:

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

Điều s.reverse!tuyệt vời là mọi lúc nó được đánh giá chuỗi được lật. Vì vậy, nó thay thế chuỗi. sđã được sửa đổi!


Với -pcờ bạn có thể lưu 4 byte:$_.reverse!;gsub(/./){$_.reverse!}
Jordan

@Jordan tôi sẽ không cần một cái .chompmặc dù $_? nó dường như bao gồm dòng mới vào lúc này
Downgoat

Không nếu bạn làm điều gì đó giống như ruby -pe '$_.reverse!;gsub(/./){$_.reverse!}' < file.txtnơi file.txtlà một dòng mà không có ký tự dòng mới: V Anyways, nếu bạn quyết định không làm điều đó, bạn không cần dấu ngoặc trên lambda để ->scông trình
Giá trị Ink

@ValueInk, bạn có thể cung cấp đầu vào không có dữ liệu mà không cần tệp nếu bạn đặt nó. Hoặc thậm chí bạn có thể nhập thủ công, chỉ cần không nhấn Enter: i.stack.imgur.com/6luxM.png
manatwork

1
Bạn không cần dấu ngoặc đơn xung quanh đối số của lambda. Ngoài ra, tôi nghĩ bạn có thể cạo sạch một trong những dấu chấm than:s.gsub(/./){s.reverse!.reverse}
m-chrzan

6

Perl, 24 byte

Bao gồm +2 cho -lp

Cung cấp đầu vào trên STDIN:

rev.pl <<< Hello!

rev.pl:

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

Đáng ngạc nhiên là điều này không sử dụng reversetoán tử dựng sẵn . Tên đó chỉ dài quá, tất cả các giải pháp tôi có thể nghĩ ra reverseđều dài hơn ít nhất 1 byte.


Được khuyến khích để tìm một giải pháp cần ít byte hơn so với tích hợp sẵn
MilkyWay90

6

J, 13 8 byte

Saved 5 byte nhờ dặm!

#;@$];|.

Đây là 5 chuyến tàu với các động từ sau:

# ;@$ ] ; |.

Ngã ba bên trong bao gồm ](danh tính), ;(liên kết) và |.(đảo ngược). Quan sát:

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

Hai động từ bên ngoài làm cho phần còn lại của tàu. #là, trong trường hợp này, kích thước của đối số, nghĩa là độ dài. Động từ liên kết những cái này là ;@$, hoặc ravelhơn reshape. Quan sát:

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

Giải pháp cũ.

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

Đủ đơn giản. |.là đảo ngược và ^:là sức mạnh kết hợp, nó lặp lại động từ bên trái (tay phải) # lần. Khi đối số đúng là một động từ, động từ đó được gọi trên đối số. Động từ bên phải trong trường hợp này là phạm vi từ zero ( i.) đến length ( #). Khi nâng lên một mảng, kết quả trung gian được giữ. Tất cả những gì cần phải làm là làm phẳng mảng với ,.

Kết quả trung gian

   (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

Bạn có thể tiết kiệm một byte bằng cách đấm bốc chiều dài<@#
dặm

Một giải pháp 8 byte gọn gàng là #;@$];|.mà hộp ban đầu và ngược lại, reshapes các dây đóng hộp và razes chúng lại với nhau
dặm

@miles whoa, thật là gọn gàng.
Conor O'Brien

5

JavaScript (ES 6), 59 50 byte

9 Byte nhờ Hedi và Huntro.

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

Hàm đệ quy.

Việc đảo ngược chuỗi chiếm gần một nửa kích thước ( 25 22 byte!) ...
Tại sao không phải là cách riêng cho việc đó?


1
Bạn có thể sử dụng thông tin s[n]?...củan<s.length?...
Hedi

1
Bạn cũng có thể lưu 3 byte bằng cách sử dụng [...s]thay vìs.split``
Huntro

phải 36 byte lý tưởngf=(s,n=1)=>n==1?s:s+s.reverse(),n-1)
caub

không đệ quy f=(s,n=1)=>Array.from({length:n},(_,i)=>i%2?s.reverse():s).join``)sẽ tốt hơn với một số chức năng tốt hơn cho phạm vi
caub

@caub: SyntaxError: Unexpected token )JS không có đảo ngược chuỗi gốc. SyntaxError: Invalid or unexpected tokencho đề nghị thứ hai của bạn. Trình duyệt nào hoạt động trong?
Tít

4

Chồn , 17 byte:

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

Hãy thử nó ở đây!

Giải trình

$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

Hội 8088, IBM PC DOS, 29 28 byte

Lắp ráp, xxdđổ:

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

Danh sách chưa được phân loại:

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

Chương trình thực thi PC DOS độc lập. Chuỗi đầu vào thông qua dòng lệnh, đầu ra là bàn điều khiển.

nhập mô tả hình ảnh ở đây


3

Pip , 11 10 byte

L#aORVRV:a

Hãy thử trực tuyến!

Giải trình:

            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 byte

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

Thí dụ:

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

Thậm chí ngắn hơn (tín dụng cho Damien):

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

s >> [s, đảo ngược s] chu kỳ ["abc", "cba", ...] được nén với kích thước chính xác và concatMap'ped với fst


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

3
Hoặc Pointfree one có cùng kích thước:(>>=fst).(iterate reverse>>=zip)
Damien

3

Perl 6 ,  31  30 byte

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

Lưu một byte bằng cách sử dụng sai .ords, sẽ trả về một danh sách các thứ tự, sau đó ngầm biến nó thành một số để tạo một phạm vi với.

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

Giải trình:

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

Sử dụng:

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 tổ hợp phím

Bạn không bao giờ có thể có quá nhiều câu trả lời Vim.

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

Giải trình

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
Với coreutils? Như thế là gian lận! : P
Christian Rondeau

3

MATL, 13 12 8 byte

Đẩy tất cả các yếu tố, kết hợp cuối cùng.

td"tP]&h

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

Hãy thử trực tuyến!


Phiên bản cũ:

Cách tiếp cận hoàn toàn khác nhau, dựa trên 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

Phiên bản dựa trên việc đảo ngược chuỗi mẫu

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

Tôi thích cách sử dụng thông minh của td!
DJMcMayhem

@DJMcMayhem Cảm ơn! Tôi đã có một điều rõ ràng tnq:"đầu tiên, nhưng tn:"là một chút mùi mã (xem mẹo chơi gôn Matlab này ) vì vậy tôi nghĩ rằng nó tnq:cũng có thể nhỏ gọn hơn.
Sanchise

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

Đây là nỗ lực đầu tiên của tôi trong việc chơi golf mã, vì vậy tôi chắc chắn có vô số cải tiến.

Cập nhật:

Bỏ đi 1 byte bằng cách loại bỏ dấu ngoặc.

Nhờ đề nghị Dưa hấu phá hủy, đã loại bỏ một byte.


Tôi không biết scala, nhưng bạn có thể đổi i%2==1thành i%2>0?
Lemon phá hủy

@DeststallibleWateriwi Chưa nghĩ đến điều đó, vâng tôi có thể
Chính mình12794

3

Khối , 52 byte

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

Trên một khối lập phương:

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

Điều này thật thú vị; vẫn còn những byte cần được xử lý nhưng điều này chắc chắn sẽ hoạt động.

Hãy thử trực tuyến!

giải trình:

Đầu vào của ABC

  • /A: đi về phía bắc và đọc trong tất cả các đầu vào dưới dạng ký tự; -1sẽ ở dưới cùng
  • p\;.: xóa -1khỏi ngăn xếp
  • u# : đẩy độ dài chuỗi (số mục trên ngăn xếp)
  • \:\:qq : nhân đôi độ dài chuỗi hai lần, đẩy hai bản sao xuống dưới cùng của ngăn xếp
  • vòng:

    • soq(?/<u : hoán đổi đỉnh của ngăn xếp, đỉnh đầu của ngăn xếp là ASCII, đẩy đỉnh (chữ cái) xuống dưới cùng, giảm đỉnh của ngăn xếp, rẽ phải nếu không được thực hiện, sau đó di chuyển IP đến đúng vị trí.
    • ở cuối vòng lặp, ngăn xếp sẽ trông như C B A 3 3 0
  • ;u : cửa sổ bật lên của ngăn xếp C B A 3 3

  • B : ngăn xếp ngược 3 3 A B C
  • p( : di chuyển từ dưới lên trên và giảm dần 3 A B C 2
  • ?nếu đỉnh bằng 0, đi thẳng @và chấm dứt
  • khác
    • psq:uq : di chuyển từ dưới lên trên, hoán đổi từ trên xuống và di chuyển từ trên xuống dưới cùng và di chuyển từ trên xuống dưới 3 2 A B C 3
    • $u : nhảy u
    • < đưa chúng ta trở lại vào vòng lặp.

Thông dịch viên


Đây là 24 byte một. Cùng logic chung chỉ nén một chút.
MickyT

@MickyT Tôi cảm thấy tồi tệ khi lấy tín dụng cho 28 byte chơi gôn. Đăng nó cho mình!
Giuseppe

3

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

-1 nhờ trần

Phiên bản cũ

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

Hãy thử trực tuyến!

Phiên bản ngắn hơn (hơi hỏng)

Riffing về cách tiếp cận 76 byte bằng ASCII - chỉ trong các bình luận và -1 byte từ tinh chỉnh của tôi về tinh chỉnh của tôi.

Chỉnh sửa: Phiên bản này hơi bị hỏng ở chỗ nó giả định rằng mọi chuỗi được đi trước bởi một byte NULL, điều này không phải lúc nào cũng đúng. (Xem trường hợp thử nghiệm cuối cùng trong liên kết). Bây giờ trở lại phiên bản 83 byte.

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

Hãy thử trực tuyến!



@ ASCII-chỉ 68 là có thể với một số điều chỉnh.
dạ dày

: P bây giờ là 67 rồi lol @gastropner
Chỉ có ASCII

@ ASCII-only 66 :-P
dạ dày

@ Chỉ ASCII Đáng buồn thay, phiên bản ngắn hóa ra không hoạt động trong một số trường hợp nhất định.
dạ dày

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

Chương trình thử nghiệm

    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!", ""));
}

Điều này có thể được đánh gôn thêm: (s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?s:new StringBuffer(s).reverse();return r;};( 88 byte ). Ngoài ra, tôi sẽ xác định rằng đây là Java 8.
Kevin Cruijssen

Na, thật tốt khi cho rằng anh ta đang sử dụng phiên bản Java mới nhất.
Shaun Wild

@KevinCruijssen Java 7 không được hỗ trợ nữa (ngoại trừ $$$ lớn). Chúng ta không nên chỉ định phiên bản Java. Ngoài ra, nếu bạn viết dưới dạng Java 7, hầu hết các câu trả lời có thể được viết bằng Java 1.1 hoặc 1.2. Vì vậy, bạn không nên viết phiên bản thấp nhất mà nó hoạt động? Nếu mã trong câu trả lời này là tuân thủ Java 7, thì đó là tuân thủ Java 1.2 và ... vẫn sẽ hoạt động trong Java 8.
Olivier Grégoire

2

R, 53 byte

Giả sử rằng đầu vào được phân tách bằng dấu cách hoặc dòng mới cho mỗi ký tự.

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

Một số trường hợp thử nghiệm:

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

Không có cách thực sự sạch nào để có được độ dài chuỗi hoặc đảo ngược chúng, vì vậy điều này khá dài.

Đưa đầu vào $a, vòng lặp từ 1đến $a.length(được lưu trữ $xđể sử dụng sau). Mỗi lần lặp, chúng tôi sử dụng một giả ba chiều để lập chỉ mục thành một mảng của một trong hai $ahoặc $a[$x..0](nghĩa là đảo ngược), dựa trên việc số đầu vào của chúng tôi là số lẻ / chẵn [$_%2]. Đây là tất cả được gói gọn trong parens và -joined với nhau để tạo thành một chuỗi duy nhất. Điều đó còn lại trên đường ống, và đầu ra là ẩn.

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

}

Ung dung:

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
Xin chào, chào mừng đến với PPCG! Trước hết tôi muốn giới thiệu để đọc qua Mẹo để chơi gôn trong Java . Đối với mã của bạn, có một vài điều vẫn có thể được đánh gôn: Bạn có thể xóa public statictrước khi phương thức của bạn. Bạn có thể loại bỏ khoảng cách giữa t=new StringBuffer. Bạn có thể loại bỏ dấu ngoặc đơn và dấu ngoặc không cần thiết. Và bạn có thể hoán đổi kiểm tra mô-đun từ ==1sang <1(tương đương với ==0các số không âm). Ngoài ra, bạn có thể chuyển việc i++sử dụng cuối cùng bên trong vòng lặp for.
Kevin Cruijssen

6
Vì vậy, tổng cộng nó trở thành: 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 cho phương thức + 18 byte cho nhập LINQ.

Làm thế nào nó hoạt động:

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

Octave, 39 35 byte

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

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

Giải trình:

@(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

Đã lưu 4 byte nhờ Luis. ~xthay vì 0*xlưu một byte (hoạt động vì tất cả các phần tử của x đều khác không. flipthay vì flipudlưu hai byte khác (tôi không biết flipđã tồn tại).


2

bash + produc-linux, 68 58 53 byte

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

Giải trình

Hai điều với forvòng lặp:

  • Có một cách viết rõ ràng không có giấy tờ trong forđó người ta thay thế các từ khóa dodonetừ khóa bằng dấu ngoặc nhọn {}. Không gian sau dấu ngoặc đầu tiên là cần thiết và dấu chấm phẩy ở cuối cũngcần thiết.
  • Nó chỉ ra rằng trong các forvòng lặp "kiểu C" , bạn chỉ có thể khởi tạo i;thay vì sử dụng i=0;.
  • Phần ${#1}của điều kiện i < ${#1}đề cập đến độ dài của đầu vào của chúng tôi (tham số đầu tiên $1). Nói chung, bạn có thể sử dụng ${#foo}để lấy kích thước của chuỗi $foo.

Ngoài ra:

  • rev là công cụ trong linux-linux đảo ngược một chuỗi.
  • Chúng ta cần phải vượt qua -ncờ để echothoát khỏi dòng mới.
  • Biểu thức rev<<<$yđược gọi là chuỗi ở đây (xem trang tldp.org có liên quan này ), chuyển biến này $ysang đầu vào tiêu chuẩn của rev.

Hãy giải thích một số kiến ​​thức của bạn. Ngoài ra, có lẽ không gian trước khi tiếng vang có thể bị xóa, tôi không hiểu biết về bash
Rohan Jhunjhunwala

@RohanJhunjhunwala Thêm một lời giải thích cho câu trả lời để có thể giúp làm rõ một số điều. Ngoài ra: khi bỏ qua dodonetừ khóa trong một forvòng lặp, bạn thực sự làm cần không gian!
khung

+1 có vẻ tốt bây giờ. Tôi đã bình luận vì mã của bạn đã vẽ một cờ chất lượng thấp tự động. Câu trả lời chỉ có mã được tự động gắn cờ
Rohan Jhunjhunwala

y=$1;for((;i<${#1};i++)){ printf $y;y=`rev<<<$y`;}... đã lưu một vài 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.

Hãy thử trực tuyến!



@Shaggy Tôi đã thử sử dụng nó, nhưng đối với cuộc sống của tôi, tôi không thể hiểu được. : P Cảm ơn rất nhiều cho ví dụ, mặc dù!
Nit

Xin lỗi, đã đăng sai liên kết, thực sự là 6 byte .
Xù xì


1
@Shaggy Tôi không phiền, và nó đủ khác với câu trả lời của Nit. Đi cho nó người đàn ông.
Oliver

2

05AB1E , 7 byte

vDR}v}J

Hãy thử trực tuyến!

Sẽ tiếp tục làm việc trên nó. Tôi không thực sự thích phần "v}" của nó, có thể lưu một byte ở đó.

Giải trình

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 giống như mã của bạn, nhưng với các nội dung bạn đang tìm kiếm. :)Âlà Bifurcate (viết tắt của trùng lặp và đảo ngược, đó chính xác là những gì bạn đang làm). \ xóa mục trên cùng trên ngăn xếp.
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.