StringgnirtSStringgnirtSStringgnirtS


42

これは比較的簡単なチャレンジです。

長さNの文字列が与えられると、文字列を前方に、次に後方に、次に前方に、次に後方に...などN回出力します。たとえば、入力が

Hello!

出力する必要があります:

Hello!!olleHHello!!olleHHello!!olleH

オプションで、末尾の改行を1つ出力することもできます。

あなたの提出物は、完全なプログラムまたは機能のいずれかである可能性があり、任意の合理的な形式で入力および出力を行うことができます。たとえば、STDIN / STDOUT、関数の引数と戻り値、ファイルなどからIOを取得できます。入力文字列は空ではなく、印刷可能なASCIIのみを含むと安全に想定できます。新しい文字列を1行で出力する必要あります。したがって、たとえば、最後の例の出力が

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の答えがperlや他のゴルフ言語の答えに勝る可能性は低いですが、Javaの最短の答えを持つことは依然として非常に印象的です。したがって、このリーダーボードを使用して両方を表示できます

  1. すべての言語の中で最も短い回答、および

  2. 個々の言語での最短回答。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# 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の明確に定義されたサブセットであることを知りませんでした。私は、\トンを含むように印刷可能な想像\ nは等...
マジックタコ壺

回答:


22

Vimは、39、34回のキーストローク

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

@Lynnのおかげで5バイト節約!

これがライブで発生するgifです:(この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{gJ3バイトを節約できます。
リン

2
VIMの回答?!それはあなたの上品な動きです。
魔法のタコUr

@Lynnヒントをありがとう!私はやや異なる何かをすることになり、代わりに5を取りました。
DJMcMayhem

これは@q、開始時に空であると仮定していますか?または、@q記録を停止する前に任意の処理を行います。(これは、私が思いついたお気に入りのvim triviumにつながります。vimを終了するのは簡単ですが:q<CR>、すべてのファイルを閉じて保存するにはどうすればいいですか?easy:just qqqqqZZ@qq@q!)
wchargin

@wcharginはい、これは@q空である必要があります。:wqa代わりに単にしないのはなぜですか?また、vimでフラクタルを生成する方法を知りたいですか?qqqqq<C-w>v<C-w>n@qq@q:D
DJMcMayhem

18

Python、40バイト

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

再帰関数。sカウンターiがの長さを超えるまで、入力文字列を逆の関数に追加しますs


ワオ。56バイトのPython回答を送信しようとしていました、
ハハ

@DJMcMayhemそれはまたlambda s:(len(s)*(s+s[::-1]))[:len(s)**2]1バイトのビートです。
ジョナサンアラン

私はこれを得た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))])
カレル

12

脳高射砲418の 378 228バイト

これは私のBrain-Flakの傑作です。ゴルフが上手くいかないかもしれませんが、このチャレンジは私が今まで遭遇した中で最も難しいものです。

オンラインでお試しください!

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

説明

この説明は少し時代遅れですが、それでもプログラムを説明する上でかなり良い仕事をしています。

この説明は、通常の説明プロセスとは少し異なります。結果を順番に説明するのではなく、どのようにしてこの結果に至ったのかを説明します。ここに行く:

ローラー

問題にかなり取り組んだ後、私はこのコードを思いつきました:

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

このコード(nは、ある数字のリテラルです。例えば()())は、スタックの一番上にあるアイテムを取得し、nステップ下に移動します。スタックの高さとしてnを指定すると、スタックの「ロール」が実行されます。すなわち、一番上のアイテムをスタックの一番下に移動します。仕組みは次のとおりです。

アイテムを移動したい場所をスタック上のマイナス1に置きます。なぜマイナス1?私はそれがちょうどそのように機能することを知りません。

(n[()])

次に、この数が0に達するまでループを追跡し、でループします()

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

ループするたびに、一番上のアイテムを取得し、その下にあるアイテムを他のスタックに移動します。これにより、番号がその場所の一番上に配置されます。

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

今やらなければならないことは、移動した数字を入れることです。オフスタックに切り替えて、ループの実行回数をプッシュします。

(...<>)

新しくプッシュされた数値がゼロに達するまで、デクリメントを繰り返します。1つの数字を戻すたびに。

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

次に、ロールを修正して、完全なスタックを反転させました。

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

再びnは逆の深さを表します。つまり、スタックの上位n個のアイテムが逆になります。使い方:

その逆は、空想に包まれたローラーです。スタックの上部をn回ロールするだけで、ロールの深さが1つずつ減少します。

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

複製する

インプレースでの複製は困難です。とても大変。スタックを逆にする方法を考え出した後、複製アルゴリズムを思い付くにはまだかなりの努力が必要でした。

ここにあります:

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

それは少し大きなものですが、これがどのように機能するかは次のとおりです。

nを押して開始します。nは複製の深さです。また、2つの括弧を開きます。これらにより、再度必要になるまでnの値をスコープに保存できます。

(((n)<

次に、スタックの最上位の値をオフスタックに2回プッシュするたびに、n回ループします。これにより、スタック上の各番号の初期複製が作成されます。

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

これで、オフスタックに各番号のコピーが2つあります。これらを2つのグループに分ける必要があります。

そこで、オフスタックに切り替えて、最初に保存したnsの1つを呼び出します。

<>>)

n回ループします。

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

1つのコピーをメインスタックに移動するたびに。

({}<>)<>

そして、コピーの1つをスタックの一番下にロールします。(これは、この複製をスタッククリーンではなくすることから始めるために、オフスタックが空だったと仮定しています)

([][()])ROLLER

それが完了したら、オリジナルを「オリジナル」とオフスタック上のコピーの2つのグループに分割しました(コピーは実際には逆です)。そのため、コピーをメインスタックに移動するだけで完了です。

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

スケルトンプログラム

プログラムのすべての部分を作成したので、それらをフレームに挿入するだけです。

フレームは、スタックの高さの1倍少ないテキストを2倍にして、複製を使用します。

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

次に、初期スタックの高さの増分をn ^ 2-nから0に減らしてスタックを反転します。

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

5
すごい。あなたはいつもこの言語ができることで私の心を吹き飛ばします!:D
DJMcMayhem

10

ゼリー4 3バイト

,Ṛṁ

オンラインでお試しください!またはすべてのテストケースを検証します。

@ Maltysenのおかげで1バイト節約できました

説明

,Ṛṁ  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

おかげで、あなたはそのソースコードからまたは経験から知っていましたすごい@Maltysen
マイル

経験から、私はゼリーを知らないが、私はちょっとゼリーは本当にオーバーロードを行いませんので、どのような金型は、非数に行うだろうのは、またちょっとJからリシェイプのことを思い出し、金型と推測
Maltysen

moldは実際にはイテラブルのみを取りますが、最初に範囲に整数をキャストします。
デニス

1
ええ、私はカビをリシェイプとして扱いました。文字列の配列だけで自動的に連結された文字列として出力するかのようなゼリーで非常に多くの小ぎれいな扱い、あります
マイル

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

私はRubyを吸います。ゴルフの助けをいただければ幸いです。

Rubyは、このために本当に素晴らしい言語です .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作品
バリューインク

@ValueInk、パイプを使用すると、ファイルなしで改行なしの入力を提供できます。または、Enterキーを押さずに、手動で入力することもできます。i.stack.imgur.com
manatwork

1
ラムダの引数を括弧で囲む必要はありません。また、感嘆符の1つを剃ることができると思います:s.gsub(/./){s.reverse!.reverse}
m-chrzan

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|
+------+------+

外側の2つの動詞は残りの列車を構成します。#この場合、引数のサイズ、つまり長さです。これらをリンクする動詞は;@$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バイトのソリューションです#;@$];|.、どの箱初期と逆箱入りの文字列を整形し、それらを一緒にrazes
マイル

@milesおっと、それはかなりきれいです。
コナーオブライエン

5

JavaScript(ES 6)、59 50バイト

HediとHuntroのおかげで9バイト。

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

再帰関数。

文字列の反転にはサイズのほぼ半分(25 22バイト!)が必要です...
なぜネイティブな方法がないのですか?


1
あなたは使用することができますs[n]?...のinteadn<s.length?...
エディ

1
[...s]代わりにs.split``
-Huntro

理想的には36バイトf=(s,n=1)=>n==1?s:s+s.reverse(),n-1)
caub

非再帰的なものf=(s,n=1)=>Array.from({length:n},(_,i)=>i%2?s.reverse():s).join``)で、範囲に対してより良い機能を備えている方が良いでしょう
caub

@caub:SyntaxError: Unexpected token )JSにはネイティブの文字列復帰はありません。SyntaxError: Invalid or unexpected token2番目の提案。どのブラウザで動作しますか?
タイタス


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

スタンドアロンPC DOS実行可能プログラム。コマンドラインを介した入力文字列、出力はコンソールです。

ここに画像の説明を入力してください



3

Haskell、40 36 32バイト

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

例:

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

さらに短く(Damienのクレジット):

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

s >> [s、reverse s]サイクル["abc"、 "cba"、...]サイクルは正しいサイズに圧縮され、fstでconcatMap'ped


2
q s=zip(s>>[s,reverse s])s>>=fst
ダミアン

3
または、同じサイズのポイントフリーのもの:(>>=fst).(iterate reverse>>=zip)
ダミアン

3

Perl 6の 31の  30バイト

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

誤用により1バイトを節約します.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:、もっとコンパクトにできると思いました。
-Sanchises

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バイト削り落としました。

提案のための破壊可能なスイカのおかげで、バイトを削った。


私はScalaのを知っていませんが、変更することができますi%2==1i%2>0
破壊可能なレモン

@DestructibleWatermelonそれを考えていなかった、はい、できます
-Himself12794

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 :文字列の長さを2回重複させ、2つのコピーをスタックの一番下にプッシュします
  • ループ:

    • 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
  • ?topがゼロの場合、直進し@て終了します
  • 他に
    • psq:uq :下から上へ移動、上から下へ移動、上から下へdup、上から下へ移動 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 ceilingcatのおかげ

旧版

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

オンラインでお試しください!

短いバージョン(少し壊れています)

コメントのみASCIIのみによる76バイトのアプローチをリフし、私の微調整の彼の微調整から-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であることを指定します
ケビンCruijssen

Na、彼がJavaの最新バージョンを使用していると仮定しても問題ありません。
ショーンワイルド

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

文字列の長さを取得したり逆にしたりする実際のクリーンな方法はないので、これはかなり長いです。

inputを受け取り$a、ループを1to $a.length$xします(後で使用するために保存されます)。各反復では、入力値が奇数/偶数であるかどうかに基づいて、疑似3進数を使用して、$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。不要な括弧と括弧を削除できます。また、モジュールチェックを==1to から入れ替えることができます<1==0非負の数値と同等です)。また、i++forループ内で最後の使用に移動できます。
ケビンCruijssen 16

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バイト+ LINQインポート用に18バイト。

使い方:

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

Luisのおかげで4バイト節約されました。保存された1バイトの~x代わりに0*x(xのすべての要素がゼロ以外であるため機能します。保存された別の2バイトのflip代わりにflipudflip存在することは知りませんでした)。


2

bash + util-linux、68 58 53バイト

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

説明

forループに関する2つのこと:

  • 明らかに文書化されていないforループの記述方法があり、そこではdoand doneキーワードを中括弧{とに置き換えます}。最初のブラケットの後のスペースが必要であり、最後のセミコロンも必要です。
  • 「Cスタイル」forループでは、をi;使用する代わりにで初期化することができますi=0;
  • ${#1}条件の一部は、i < ${#1}入力の長さ(最初のパラメーター$1)を参照します。一般${#foo}に、文字列のサイズを取得するために使用できます$foo

さらに:

  • rev 文字列を逆にするutil-linuxのツールです。
  • 改行を削除するには、-nフラグを渡す必要がありechoます。
  • rev<<<$yhere-stringこの関連するtldp.orgページを参照)と呼ばれ、変数$yをの標準入力に渡しますrev

あなたの知識の一部を説明してください。また、おそらくスペースエコーが取り外し可能である前に、私はかかわらず、bashの上で知識豊富ではないよ
ロハンJhunjhunwala

@RohanJhunjhunwalaいくつかの事柄を明確にするために、答えに少し説明を追加しました。また、ループ内でdoand doneキーワードを省略するとfor、実際にそのスペース必要になります!
フレーム

+1の表示が良くなりました。あなたのコードが自動低品質フラグを描いたので、私はコメントしました。コードのみの回答には自動フラグが付けられます
Rohan Jhunjhunwala

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しかし、例に感謝します!
NIT

申し訳ありませんが、間違ったリンクを投稿しました。実際には6バイトです。
シャギー


1
@Shaggy私は気にしない、そしてそれはNitの答えとは十分に異なっている。男のために行きます。
オリバー

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バイトはコードと同じですが、探しているビルトインが含まれています。:)Âは分岐(Duplicate&Reverseの略で、まさにあなたがしていることです)。\ スタックの一番上のアイテムを削除します。
ケビンクルーッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.