StringgnirtSStringgnirtSStringgnirtS


42

Ось для вас порівняно простий виклик.

Давши рядок довжиною N , виведіть рядок вперед, потім назад, потім вперед, потім назад ... і т.д. N разів. Наприклад, якщо ваш вхід був

Hello!

Вам слід вивести:

Hello!!olleHHello!!olleHHello!!olleH

Ви також можете вивести один зворотний рядок.

Ваше повідомлення може бути або повною програмою, або функцією, і ви можете брати введення та вихід у будь-якому розумному форматі . Наприклад, ви можете взяти IO з STDIN / STDOUT, аргументи функцій та повернути значення, з файлу тощо. Ви можете сміливо припускати, що рядок введення не буде порожньою і міститиме лише ASCII для друку. Ви повинні вивести новий рядок в одному рядку. Так, наприклад, якщо був вихід на останній приклад

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

Це не було б правильним рішенням!

Ось ще кілька тестових випадків:

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

Табло лідерів

Оскільки це проблема з , стандартні лазівки заборонені, а найкоротша відповідь у байтах виграє! Однак це також змагання за найкоротший відповідь у будь-якому конкретному мові. Хоча навряд чи відповідь на Java переможе відповідь на перлі або на якійсь мові для гольфу, все ще дуже вражає найкоротший відповідь на Java. Отже, ви можете використовувати цей таблицю лідерів, щоб побачити обидва

  1. Найкоротша відповідь з усіх мов, і

  2. Найкоротша відповідь у кожній окремій мові.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:

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

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

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

У вашому прикладі, не слід , що бути olleH, чи не elloH?
Арно

2
@Downgoat Ні, ви повинні приймати і вводити в такому форматі, як описано в специфікації.
DJMcMayhem

4
Чи не повинен заголовок бути StringgnirtSStringgnirtSStringgnirtS ?
Луїс Мендо

2
@carusocomputing Це не буде: "Ви можете сміливо припускати, що рядок введення не буде порожньою, і буде містити лише ASCII для друку."
Мартін Ендер

1
en.wikipedia.org/wiki/ASCII#Printable_characters Ах, не знав, що це чітко визначений підмножина ASCII. Я уявляв, що для друку включатимуть \ t, \ n тощо ...
Чарівний восьминіг Урна

Відповіді:


22

Вім, 39 , 34 натискання клавіш

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

5 байт збережено завдяки @Lynn!

Ось подарунок, який відбувається в прямому ефірі: (Зауважте, що цей gif є попередньою версією, оскільки я ще не встиг його повторно записати).

введіть тут опис зображення

Ось пояснення, як це працює:

: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

Зі сторони Yзаписує додатковий новий рядок, який зазвичай є неприємною особливістю. Це, мабуть, перший раз, коли він фактично врятував кілька байтів!


2
Замість цього :%s/\n<cr>можна зробити, v{gJщоб зберегти три байти.
Лінн

2
Відповідь VIM ?! Це стильний хід з вашого боку.
Magic Octopus Urn

@Lynn Дякую за пораду! Я в кінцевому підсумку робив щось трохи інше і замість цього взяв 5.
DJMcMayhem

Це передбачає, що @qна початку пусте, правда? або @qпопереднє припинення запису зробило б щось довільне. (Це призводить мене до мого улюбленого тривію vim, який я придумав: всі знають, що вийти з vim так само просто :q<CR>, але як закрити та зберегти всі файли? Легко: просто qqqqqZZ@qq@q!)
wchargin

@wchargin Так, для цього потрібно @qбути порожнім. Чому б просто не зробити :wqaнатомість? Також хочете знати, як генерувати фрактал у vim? qqqqq<C-w>v<C-w>n@qq@q: D
DJMcMayhem

18

Пітон, 40 байт

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

Рекурсивна функція. Попереджує введення рядка sдо функції реверсу, поки лічильник не iперевищить довжину s.


Ого. Я щойно збирався надіслати відповідь
пітоном

@DJMcMayhem він також б'є lambda s:(len(s)*(s+s[::-1]))[:len(s)**2]на один байт.
Джонатан Аллан

Я отримав це, 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))])але це 136 байт відповідно sys.sizeof, що цікаво, він такого ж розміру якf = lambda s : ''.join([s[::1] if i%2 else s for i in range(len(s))])
Carel

12

Мозг-Флак , 418 378 228 байт

Це мій шедевр Brain-Flak. Це може бути не так добре гольф, але виклик - це найскладніше, з чим я коли-небудь стикався.

Спробуйте в Інтернеті!

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

Пояснення

Це пояснення зараз трохи застаріло, але воно все ще робить досить непогану роботу з пояснення програми.

Це пояснення буде трохи відрізнятися від мого звичайного процесу пояснення. Я збираюся пояснити, як я прийшов до цього результату, а не пояснював його по порядку. Ось це іде:

Ролик

Після роботи над проблемою я трохи придумав цей код:

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

Цей код (де n є буквальним для деякого числа. Наприклад ()()) візьме елемент у верхній частині стека і перемістить його по n кроків. З n як висота стека, це виконає "рулон" стека. тобто перемістіть верхній елемент у нижній частині стека. Ось як це працює:

Поміщаємо місце, яке ми хочемо перемістити, на мінус одне на стек. Чому мінус один? Я не знаю, що це працює саме так.

(n[()])

Потім ми петлюємо, поки це число не досягне нуля, відслідковуючи цикл з a ().

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

Кожен раз, коли ми робимо цикл, ми підбираємо верхній елемент і переміщуємо предмет під ним до іншого стека. Це ставить цифру зверху на своє місце.

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

Все, що нам потрібно зробити зараз, - це поставити номери, які ми перенесли назад. Переходимо на вимикається стек і проштовхуємо кількість виконаних циклів.

(...<>)

Ми петлю декрементуємо щойно натиснене число, поки воно не досягне нуля. Кожен раз, коли ми переміщаємо одне число назад.

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

Зворотний

Наступним чином я змінив рулон, щоб зробити повний зворотний стек:

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

Ще раз n позначає глибину реверсу. Тобто перші n елементів у стеці будуть перетворені. Як це працює:

Реверс - це просто химерно загорнутий валик. Ми просто згортаємо верхню частину стека n разів, зменшуючи глибину рулону по одному на кожен раз.

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

Дублікат

На місці дублювання важко. Дійсно важко. Після того, як я зрозумів, як повернути стек, для створення алгоритму дублювання потрібно було докласти багато зусиль.

Ось:

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

Це трохи великий, але ось як це працює:

Почніть з натискання n. n - глибина дубліката. Також ми відкриваємо дві дужки. Вони дозволяють нам зберігати значення n в області, поки воно знову не буде потрібно.

(((n)<

Далі обводимо цикл n разів кожного разу, двічі висуваючи верхнє значення стека на вимкнений стек. Це робить початкові дублікати для кожного числа в стеку.

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

Тепер ми маємо дві копії кожного номера на офшпаку. Нам потрібно розділити їх на дві групи.

Тож ми переходимо на офсет і згадуємо одну з нс, яку ми зберегли на початку.

<>>)

Обв'язуємо n разів.

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

Кожен раз, коли ми переміщуємо одну копію на основний стек.

({}<>)<>

І розгорніть одну копію до нижньої частини стека. (Це передбачає, що офстак був порожнім для початку, коли цей дублікат не буде стеком чистим)

([][()])ROLLER

Після цього ми розділили оригінал на дві групи "оригінал" і копію на офсетному стеці (копія насправді зворотна). Таким чином, ми просто переміщуємо копію до основного стеку і ми можемо зробити це з нею.

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

Програма скелету

Тепер, коли я зробив усі фрагменти програми, мені просто потрібно вставити їх у кадр.

Кадр подвоює текст на один менше, ніж висота стека, використовуючи дублікат.

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

А потім повертає стек із зменшенням кроку початкової висоти стека від n ^ 2-n до 0.

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

5
Дивовижний. Ти завжди дуєш мені про те, що може зробити ця мова! : D
DJMcMayhem

10

Желе , 4 3 байти

,Ṛṁ

Спробуйте в Інтернеті! або Перевірте всі тестові випадки.

Збережено байт завдяки @ Maltysen .

Пояснення

,Ṛṁ  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
цвіль не потрібнаL
Мальтісен

@Maltysen, дякую, чи знали ви, що з вихідного коду чи з досвіду
миль

з досвіду, я не знаю, Jelly, але я напевно здогадався, що це буде робити цвіль на номер, оскільки Jelly насправді не перевантажує, також цвіль начебто нагадувала мені змінити форму J
Maltysen

цвіль насправді бере лише ітерабелі, але вона кидає цілі числа, щоб перейти в першу чергу.
Денніс

1
Так, я розглядав цвіль як переформатування, тому я просто звично дав їй номер. У Jelly так багато акуратних частувань, як те, як масив струн просто автоматично виводиться у вигляді з'єднаної струни
миль

9

PHP, 54 52 байти

(49 байт, але не працює, якщо рядок містить '0')

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

(52 байти)

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

(54 байти)

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

Я повністю забув str_pad. хороший!
Тит


6

Рубін, 39 байт

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

Я смоктав Рубі. Допомога в гольфі вдячна.

Рубі - це справді приємна мова для цього через .reverse!

Пояснення

Я сподівався, що це буде щось на зразок простого:

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

але через обмеження котла / виклику це довше.

Що s.reverse!дуже корисно. s.reverse!в основному s = s.reverse!, тобто він також мутує s.


Що робиться в кожному розділі програми, описано нижче:

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

Справа в тому, s.reverse!що це чудово - це те, що кожного разу, коли він оцінюється, гортання рядка перевертається. Так як він замінює рядок. sзмінено!


За допомогою -pпрапора ви можете зберегти 4 байти:$_.reverse!;gsub(/./){$_.reverse!}
Йорданія,

@Jordan мені не знадобиться, .chompхоча на $_? Начебто, на даний момент входить новий рядок
Downgoat

Ні, якщо ви робите щось на кшталт ruby -pe '$_.reverse!;gsub(/./){$_.reverse!}' < file.txtде file.txtє рядок без зворотного нового рядка: V У будь-якому випадку, якщо ви вирішите цього не робити, вам не потрібні пароні на лямбда, так ->sпрацює
Value Ink

@ValueInk, ви можете забезпечити введення нового рядка без файлу, якщо ви передасте його. Або ви навіть можете ввести це вручну, просто не натискайте Enter: i.stack.imgur.com/6luxM.png
manatwork

1
Круглі дужки навколо аргументу лямбда не потрібні. Крім того, я думаю, ви можете поголити один зі s.gsub(/./){s.reverse!.reverse}
знаків

6

Perl, 24 байти

Включає +2 для -lp

Введіть дані про STDIN:

rev.pl <<< Hello!

rev.pl:

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

Дивно, але для цього не використовується вбудований reverseоператор. Ця назва просто така довга, всі рішення, про які я міг би придумати reverse, принаймні на 1 байт довше.


Запропоновано знайти рішення, яке займає менше байтів, ніж вбудований
MilkyWay90,

6

J, 13 8 байт

Збережено 5 байт за милі!

#;@$];|.

Це 5-поїзд із наступними дієсловами:

# ;@$ ] ; |.

Внутрішня вилка складається з ](тотожність), ;(посилання) та |.(зворотний). Дотримуйтесь:

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

Зовнішні два дієслова складають решту поїзда. #це в цьому випадку розмір аргументу, тобто довжина. Дієслово, яке пов'язує ці, є ;@$або ravelзакінчилось reshape. Дотримуйтесь:

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

Старе рішення.

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

Досить просто. |.є зворотним, і ^:це силова сполука, яка повторює це ліве дієслово (права рука) # разів. Коли правильний аргумент є дієсловом, це дієслово викликається аргументом. Правослово в цьому випадку діапазон від нуля ( i.) до довжини ( #). При підвищенні до масиву проміжні результати зберігаються. Все, що потрібно зробити, це згладити масив ,.

Проміжні результати

   (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

Ви можете зберегти байт, поклавши бокс в довжину<@#
милі

#;@$];|.Акуратне 8-байтне рішення - це поле, в якому поля початкових і зворотних, переробляє рядок у коробці і розширює їх разом
миль

@miles whoa, це дуже акуратно.
Conor O'Brien

5

JavaScript (ES 6), 59 50 байт

9 байт завдяки Хеди та Хантро.

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

рекурсивна функція.

Обернення рядка займає майже половину розміру ( 25 22 байти!) ...
Чому для цього не існує рідного способу?


1
Ви можете використовувати s[n]?...intead зn<s.length?...
Хеді,

1
Ви також можете зберегти 3 байти, використовуючи [...s]замістьs.split``
Huntro

так, 36 байтів в ідеаліf=(s,n=1)=>n==1?s:s+s.reverse(),n-1)
кабіна

нерекурсивний, f=(s,n=1)=>Array.from({length:n},(_,i)=>i%2?s.reverse():s).join``)який теж був би кращим з деякою кращою функцією для діапазону
кабіна

@caub: SyntaxError: Unexpected token )JS не має нативної реверсії струни. SyntaxError: Invalid or unexpected tokenдля вашої другої пропозиції. У якому браузері це працює?
Тит

4

Міколанг , 17 байт:

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

Спробуйте тут!

Пояснення

$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 Асамблея, IBM PC DOS, 29 28 байт

Зібраний, xxdзвалище:

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

Нерозбірний список:

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

Автономна виконувана програма ПК DOS. Рядок введення через командний рядок, вихід - консольний.

введіть тут опис зображення



3

Haskell, 40 36 32 байт

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

Приклад:

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

Ще коротше (кредит Деміену):

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

s >> [s, зворотний s] циклів ["abc", "cba", ...], які блискавки до правильного розміру та concatMap'ped з fst


2
q s=zip(s>>[s,reverse s])s>>=fst
Демієн

3
Або Pointfree з однаковим розміром:(>>=fst).(iterate reverse>>=zip)
Демієн

3

Perl 6 ,  31  30 байт

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

Збережіть один байт шляхом неправильного використання .ords, який повертає список порядків, а потім неявно перетворите його на число, для якого створіть діапазон.

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

Пояснення:

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

Використання:

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 натискання клавіш

Ніколи не можеш мати занадто багато відповідей на Vim.

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

Пояснення

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
З Coreutils? Це обман! : P
Крістіан Рондо

3

MATL, 13 12 8 байт

Проштовхує всі елементи, поєднується в кінці.

td"tP]&h

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

Спробуйте в Інтернеті!


Старі версії:

Зовсім інший підхід, заснований на 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

Версія, заснована на оберненні рядка шаблону

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

Мені подобається розумне використання td!
DJMcMayhem

@DJMcMayhem Дякую! Я мав очевидний tnq:"перший, але tn:"це трохи кодовий запах (див. Цей гольф для гольфу Matlab), тож я зрозумів, що tnq:може бути і більш компактним.
Санчіз

3

Scala, 73 72 71 байт

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

Це моя перша спроба кодування в гольф, тому я впевнений, що незліченна кількість вдосконалень.

Оновлення:

Зібравши дужки на 1 байт, знявши дужки.

Завдяки зруйнованому кавуну за пропозицію, поголений байт.


Я не знаю , Скала, але ви можете змінити , i%2==1щоб i%2>0?
Зруйнований лимон

@DestructibleWatermelon Не думав про це, так, я можу
сам12794,

3

Cubix , 52 байти

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

На кубі:

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

Цей був веселим; Є ще байти, які з цього ще потрібно буде гольфувати, але це обов'язково спрацює.

Спробуйте в Інтернеті!

пояснення:

Введення ABC

  • /A: піти на північ і прочитати у всіх введеннях як символи; -1буде внизу
  • p\;.: видаліть -1зі стека
  • u# : натисніть на довжину рядка (кількість елементів у стеку)
  • \:\:qq : двічі скопіюйте довжину рядка, натисніть дві копії до нижньої частини стека
  • петля:

    • soq(?/<u : поміняйте верхню частину стека, опутуйте верхню частину стека як ASCII, натисніть на верхню частину (літеру) донизу, верхню частину стека, поверніть праворуч, якщо не зроблено, а потім перемістіть IP в потрібне місце.
    • в кінці циклу буде виглядати стека C B A 3 3 0
  • ;u : поп-вершина стека C B A 3 3

  • B : зворотний стек 3 3 A B C
  • p( : переміщення знизу вгору та зменшення 3 A B C 2
  • ?якщо вершина дорівнює нулю, перейдіть до @і закінчіть
  • ще
    • psq:uq : перемістити знизу вгору, поміняти верхню частину і перемістити верхню частину вниз, а також перемістити зверху вниз 3 2 A B C 3
    • $u : пропустити u
    • < повертає нас назад у цикл.

Перекладач


Ось 24 байти . Та ж загальна логіка просто трохи стисла.
MickyT

@MickyT Мені було б погано брати кредит на 28 байт гольфу. Опублікуйте самі!
Джузеппе

3

C (gcc) , 88 87 85 83 68 66 83 82 78 байт

-1 завдяки стельовій кішці

Стара версія

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

Спробуйте в Інтернеті!

Коротша версія (трохи зламана)

Визначаючи 76-байтний підхід, виконаний лише ASCII в коментарях, і -1 байт від його налаштування.

Редагувати: Ця версія трохи зламана тим, що передбачає, що перед кожним рядком передує байт NULL, що не завжди відповідає дійсності. (Див. Останній тестовий випадок за посиланням). Повернення до 83-байтної версії наразі.

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

Спробуйте в Інтернеті!



@ ASCII-тільки 68 можливо за допомогою певного налаштування.
гастропнер

: P зараз 67 lol @gastropner
лише для ASCII

@ ASCII-тільки 66 :-P
gastropner

@ ASCII тільки На жаль, коротка версія, як виявляється, не працює в певних випадках.
гастропнер

2

Java, 127 111 88 байт

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

Програма тестування без вогків

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

Це можна пограти ще трохи: (s,r)->{for(int i=0;i++<s.length();)r+=i%2<1?s:new StringBuffer(s).reverse();return r;};( 88 байт ). Також я зазначив би, що це Java 8.
Кевін Круїйсен

Так, гарно вважати, що він використовує останню версію Java.
Shaun Wild

@KevinCruijssen Java 7 більше не підтримується (за винятком великих $$$). Нам не потрібно було вказувати версію Java. Крім того, якщо ви пишете як Java 7, більшість відповідей можна записати на Java 1.1 або 1.2. Тож чи не слід писати найнижчу версію, з якою вона працює? Якби код у цій відповіді відповідав Java 7, він би відповідав Java 1.2, і ... все одно працював би на Java 8.
Олів'є Грегоар

2

R, 53 байти

Передбачається, що вхід розділено пробілом або новою лінією для кожного символу.

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

Деякі тестові випадки:

> 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 байт

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

Немає справжнього чистого способу отримати довжину рядків або повернути їх назад, тому це досить довго.

Бере введення $a, цикли від 1до $a.length(зберігається $xдля використання пізніше). Кожну ітерацію ми використовуємо псевдотерміналом для індексації до масиву $aабо $a[$x..0](тобто зворотного), виходячи з того, чи є наш вхідний номер непарним / парним [$_%2]. Усі вони інкапсульовані в паренах і -joinразом з єдиним рядком. Це залишилося на конвеєрі, і вихід неявний.

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

2

Java, 151 байт

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

}

Безголівки:

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
Привіт, Ласкаво просимо до PPCG! Перш за все, я хотів би порекомендувати прочитати поради щодо гольфу на Java . Що стосується вашого коду, є кілька речей, які все ще можна пограти в гольф: Ви можете видалити public staticметод раніше. Ви можете видалити пробіли між ними t=new StringBuffer. Можна видалити непотрібні дужки та дужки. І ви можете поміняти перевірку модуля з " ==1на" <1(що еквівалентно ==0негативним числам). Крім того, ви можете перемістити i++до останнього використання всередині for-loop.
Кевін Круїйсен

6
Таким чином, це стає: void r(String s){for(int i=0;i<s.length();)System.out.print(i++%2<1?s:new StringBuffer(s).reverse()+"");}( 105 байт )
Кевін Кройсейсен,

2

C #, 94 байти

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

76 байт для методу + 18 байт для імпорту LINQ.

Як це працює:

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

Октава, 39 35 байт

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

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

Пояснення:

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

Збережено 4 байти завдяки Луїсу. ~xзамість 0*xзбереженого одного байта (працює тому, що всі елементи х є нульовими. flipзамість flipudзбережених ще два байти (я не знав, що flipіснують).


2

bash + util-linux, 68 58 53 байт

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

Пояснення

Дві речі з forциклом:

  • Існує, очевидно, незадокументований спосіб написання forциклів, коли один замінює doі doneключові слова фігурними дужками {та }. Пробіл після першого дужки необхідний, і крапка з комою в кінці також необхідна.
  • Виявляється, в forциклі "С-стиль" ви можете просто ініціалізувати, i;а не використовувати i=0;.
  • ${#1}Частина умови i < ${#1}відноситься до довжини нашого входу (перший параметр $1). Загалом, ви можете використовувати ${#foo}для отримання розміру рядка $foo.

Додатково:

  • rev - це інструмент util-linux, який обертає рядок.
  • Нам потрібно передати -nпрапор, щоб echoпозбутися нових рядків.
  • Вираз rev<<<$yназивається тут-рядком (див. Цю відповідну сторінку tldp.org ), який передає змінну $yстандартному вводу rev.

Будь ласка, поясніть деякі свої знання. Крім того, можливо, простір перед відлунням може бути знімним, але я не знаю, наскільки це баш
Rohan Jhunjhunwala

@RohanJhunjhunwala Додав трохи пояснень у відповідь, можливо, допоможе з’ясувати деякі речі. Крім того : коли опускаючи doі doneключові слова в forциклі, ви на самому справі дійсно потрібно це простір!
кадри

+1 зараз добре виглядає. Я цілком прокоментував це, оскільки ваш код намалював автоматичний прапор низької якості. Відповіді, що
стосуються

y=$1;for((;i<${#1};i++)){ printf $y;y=`rev<<<$y`;}... врятували пару байтів
roblogic

2

Japt , 11 байт

ê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.

Спробуйте в Інтернеті!



@Shaggy Я спробував це використати, але на все життя я не можу зв'язати його. : P Дякую за приклад, хоча!
Ніт

Вибачте, розмістив неправильне посилання, це насправді 6 байт .
Кудлатий


1
@Shaggy Я б не заперечував, і він досить інший, ніж відповідь Ніта. Іди за цим чоловіком.
Олівер

2

05AB1E , 7 байт

vDR}v}J

Спробуйте в Інтернеті!

Буде продовжувати працювати над цим. Мені не дуже подобається "v}" її частина, можливо, там можна зберегти байт.

Пояснення

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 байт - це те саме, що і ваш код, але з вбудованими файлами, які ви шукали. :)Â- це роздвоєне (коротке для "Дублікат і зворотний", що саме ви робите). \ видаляє верхній елемент у стеку.
Kevin Cruijssen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.