交換、削除、繰り返し


24

前書き

次の文字列を観察してみましょう。

ABCDEFGHIJKLMNOP

文字列両端を交換すると、次のようになります。

ABCDEFGHIJKLMNOP
^^            ^^

次の結果が得られます。

BACDEFGHIJKLMNPO

その後、文字列の終わりを削除します。この場合はB、とOです。結果は次のとおりです。

ACDEFGHIJKLMNP

プロセスを繰り返すと、次のリストが表示されます。

N     Result

2     ADEFGHIJKLMP
3     AEFGHIJKLP
4     AFGHIJKP
5     AGHIJP
6     AHIP
7     AP

N = 5の場合、結果はであることがわかりAGHIJPます。でN = 7、文字列の長さよりも小さい3 N> 7が考慮されるように、無効この場合。

タスク

少なくとも長さ4および繰り返し数N > 0の文字列Sが与えられた場合、最終結果を出力します。Nは常に有効であるます

テストケース

Input                               >  Output

N = 3, S = ABCDEFGHIJKLMNOP         >  AEFGHIJKLP
N = 1, S = Hello                    >  Hlo
N = 2, S = 123321                   >  11

これはであるため、バイト数が最小の提出が勝ちです!簡単にするために、文字列には英数字のみが含まれると想定できます。


質問:Nを単項で取り、次のようなもので構いませんか? 'カウント文字のませんか?例:''123321
-daavko


@Adnan単項形式はに使用Nできますが、引用符付きの文字列にすることはできますか?私はのために、意味N=3テイク'111'(とは対照的に111
ルイスメンドー

@LuisMendoはい、使用できます
アドナン・

私は1をスキップしてNを削除するように見えます-これは答えとして許可されていますか、コードは削除と繰り返しを交換する必要がありますか?
アレックスカールセン

回答:


5

MATL、8 9 12 13バイト

th"P[]2(

入力は次のとおりです。最初Nは引用符付きの単項文字列として(チャレンジで許可されます)。2番目Sは引用符付きの文字列です(デフォルトでは、文字列内の引用符が許可されています)。改行で区切られます。

これは、文字列を反転し、その2番目の要素を削除して、合計2*N回数繰り返すことで機能します。

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

th       % implicitly take first input (N) as a unary string. Concatenate horizontally
         % with itself: gives a string of 2*N ones
"        % for each (i.e., repeat 2*N times)
  P      %   flip string. Take S implicitly as input the first time
  []     %   empty array (used as new contents)
  2      %   2 (used as index)
  (      %   assign [] to position 2 of string; that is, remove second element
         % implicitly end for each
         % implicitly display

説明?:P
アディソンクランプ

@VoteToClose確かに:-)私は走らなければならなかった。追加したばかりです
ルイスメンドー

18

網膜 44 20バイト

取り消し線44は、まだ通常の44です:(

+`'(\w).(.*).\B
$1$2

次の形式の入力を想定します(単項-カウント文字:)'
{number of repeats}{string}
例:'''''''ABCDEFGHIJKLMNOP
繰り返し数と文字列の間にスペースはありません。

24バイトを削ってくれてありがとう@MartinBüttner

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



@MartinBüttnerああ!これがあなたの心理的マスタープランでした:p
Adnan

9
@Adnan¯\ _(ツ)_ /¯
マーティン・エンダー


11

Python 2、31バイト

lambda s,n:s[0]+s[n+1:~n]+s[-1]

これはうまくいくと思う?


はい、それはうまくいくようです:)
Adnan

また、有効なPython 3だ
Chiel 10 Brinke

9

Mathematica、29バイト

私の最初の答え!

#~Delete~{{2},{-2}}&~Nest~##&

ブラケットレスMathematicaの核心!関数入力は、(文字などの)リストと数値です。


1
PPCGへようこそ!:D素敵な最初の答え。
アディソンクランプ

9

ラビリンス、40バイト

<
,,}:?
.
;("   {(={}{".
,",;=};} }) "{@

入力のN後には、数字以外の文字で区切られた文字列が続きます。

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

これはSp3000とのコラボレーションで書かれました(つまり、アルゴリズムを理解するのに悩まされなかったので、彼はそれに取り組み始め、118バイトのソリューションを思いつきましたが、それをゴルフに悩ませることができなかったので、ゴルフをしました。 ..チームワークに賛成)。

説明

Spの通常の入門書(通常どおりわずかに変更):

  • Labyrinthは、メインと補助の2つのスタックを持つスタックベースの2D言語です。ほとんどすべてがメインスタックで発生しますが、値を他の値にシフトすることができます。たとえば、値を逆にしたり、後で使用するために保存したりできます。
  • スタックは底なしでゼロで埋められているため、空のスタックからポップしてもエラーにはなりません。
  • 実行は最初の有効な文字(ここでは左上)から始まります。命令ポインタ(IP)が取ることができる2つ以上のパスがある各ジャンクションで、スタックの最上部がチェックされ、次に進むべき場所が決定されます。負は左に、ゼロは前進、正は右に曲がります。これはされたが意味します、曲がりくねった通路を巻きのようなコードを見て作るために、これらの条件はすべての細胞で確認されている「ルーム」を作るからあなたを止めるものは何もありません。これらは非常に予測不可能な動作をもたらす可能性がありますが、ゴルフには最適です。
  • ソースコード(したがって迷路のレイアウト)は<>^v、行または列またはグリッドを循環的にシフトすることを使用して、実行時に変更できます。
  • " ノーオペレーションです。

さあ。

コードはから始まります<。これは、長い線形コードから始めるときに何度か使ったゴルフのトリックです。最初の行を循環的に左にシフト、その上にIPがあります。そのため、ソースは次のようになります。

              <
,,}:?
.
;("   {(={}{".
,",;=};} }) "{@

しかし、IPはどこにも移動できないため、<再び実行されます。これは、次の状態になるまで続きます。

    <
,,}:?
.
;("   {(={}{".
,",;=};} }) "{@

この時点で、IPはセルを離れ、から始まる2行目の実行を開始でき?ます。線形コードは以下のとおりです。

?   # Read the first integer on STDIN, i.e. N.
:}  # Duplicate it and move one copy over to the auxiliary stack.
,   # Read the separator character.
,.  # Read the first character of the input string and directly print it.

IPは、この2つの2x2時計回りのループである実際に2つの緊密に圧縮された(重複する)この3x2の部屋に入ります。最初のループはN-1、STDINから文字を読み取り、破棄します。

;   # Discard the top of the stack. On the first iteration, this is the
    # separator we've already read. On subsequent iterations this will be
    # one of the N-1 characters from the input string.
(   # Decrement N. If this hits zero, we leave the loop, otherwise we continue.
,   # Read the next character from STDIN to be discarded.

次に、入力文字列の残りを読み取る2番目のループに入ります。EOFを検出できるの,-1、その場合に戻るため、IPが左に曲がるからです。

,   # Read a character. Exit the loop if EOF.
(   # Decrement it.

この減少は実際には有用ではありませんが、後で無料で元に戻すことができ、ここでは2つのループをオーバーラップできます。

我々が取る場合5 ABCDEFGHIJKLMNOPの例として、入力を、このようなスタックルックス:

Main [ ... 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' -1  |  5 ... ] Auxiliary

これらは実際に入力文字に対応しているFGHIJKLMNOPので(デクリメントしたため)、実際にはそれらの最初のN-1文字を印刷したくない(文字のみを破棄したがスキップしたいN)ことに注意してください。

次のループに向けてスタックを準備する短い線形ビットがあります。

;   # Discard the -1.
=   # Swap the tops of the stacks, i.e. N with the last character. 
    # By putting the last character on the auxiliary stack, we ensure that
    # it doesn't get discarded in the next loop.
}   # Move N over to the auxiliary stack as well.

スタックは次のようになります。

Main [ ... 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N'  |  5 'O' ... ] Auxiliary

別の2x2時計回りループに入ります。これNにより、メインスタックから先頭の文字が破棄されます。

;   # Discard the top of the main stack.
{   # Pull N over from the auxiliary stack.
(   # Decrement it. It it's 0 we leave the loop.
}   # Push N back to the auxiliary stack.

ループを終了すると、=それと0入力文字列の最後の文字が再び交換されます。スタックは次のようになります。

Main [ ... 'E' 'F' 'G' 'H' 'I' 'O'  |  ... ] Auxiliary

メインスタックの内容(一番下の要素と1ずつ増加するものを除く)の内容をから印刷します。つまり、補助スタックに渡す必要があります。それが次の2x2(時計回り)ループの動作です:

{   # Pull an element over from the auxiliary stack. This is necessary so we
    # have a 0 on top of the stack when entering the loop, to prevent the IP
    # from turning right immediately.
}   # Move the top of the main stack back to the auxiliary stack. If this was the
    # bottom of the stack, exit the loop.
)   # Increment the current character.
}   # Move it over to the auxiliary stack.

今すぐスタック:

Main [ ...  |  'F' 'G' 'H' 'I' 'J' 'P] ... ] Auxiliary

それらのうちの最初のもの(印刷したくないもの)をメインスタックに戻します{。そして、最後の2x2(反時計回り)ループに入り、残りを出力します:

{   # Pull another character over from the auxiliary stack. Exit the loop
    # if that's the zero at the bottom of the stack.
.   # Print the character.

最後に、でプログラムを終了し@ます。


6

JavaScript(ES6)、39バイト

(s,n)=>s[0]+s.slice(++n,-n)+s.slice(-1)

@ Sp3000の答えを再発明したことがわかりました。


6

ゼリー、8バイト

Ḣ1¦UðḤ}¡

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

使い方

Ḣ1¦UðḤ}¡  Main link. Left input: S (string). Right input: N (deletions)

Ḣ         Pop the first element of S.
          This return the element and modifies S.
 1¦       Apply the result to the first index.
          This replaces the first character of the popped S with the popped char.
   U      Upend/reverse the resulting string.
    ð     Convert the preceding chain into a (dyadic) link.
     Ḥ}   Apply double to the right input.
          This yields 2N.
       ¡  Repeat the link 2N times.

5

ゼリー、10バイト

Ḣ;ṪjḊṖ$Ɠ¡F

入力 STDINを介して数値を、コマンドラインargsを介して文字列をします。これを機能させるための多くのヒント/ヘルプを提供してくれた@Dennisに感謝します(Jellyはまだ私を避けています)。

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

Ḣ;Ṫ               Pop first and last chars of string and concatenate
   j              Join by...
       Ɠ¡           Execute n times...
    ḊṖ$               Drop first, drop last of string ($ combines the two monadically)
         F        Flatten to filter out empty lists, since Jelly's j is weird

正直な質問、10バイトはどのように機能しますか?これはUTF-8ではありません(ḢṪḊṖƓ¡すべてが1バイト以上を使用しているため、少なくとも16バイトであってはなりません)か、読みやすさのために何らかの文字コードテーブルを使用していますか?
AutomatedChaos

1
@AutomatedChaos後者:)(ヘッダーに「bytes」という単語があるリンクをクリックします)。Jellyは、APLのような言語に似たカスタムコードページを使用します。
Sp3000


4

Vitsy、12 9(コード)+ 1(関数宣言の改行)= 10バイト

\ o /

文字列の後に数字が続くように、スタックへの入力を期待します。

2*\[vXvr]
2*         Multiply by 2.
  \[    ]  Do the stuff in the brackets that many times. (input num * 2)
    v      Take the top item off the stack and save it as a local variable.
     X     Remove the top item of the stack.
      v    Push the temporary variable back onto the stack.
       r   Reverse the stack.

どちらで呼び出すことができますか:

'String' r <number> 1m Z
2*\[vXvr]

これは、結果の文字列をスタックに残す関数です。TryItOnlineリンクでプログラムとして提供しました。

TryItOnline!


@Adnan固定-でその場所に私に近い Pythに近接。D:
アディソンクランプ

しかし、まだ1バイト先です:D
Adnan

@Adnan入力ではなくスタック上のアイテムを期待していると言っても大丈夫ですか?またはそれはノーですか?
アディソンクランプ

そのためのポリシーはわかりませんが、既にスタックにあるアイテムに関するメタ投稿を見つけることができれば、それは問題ありません:)
Adnan

@Adnan Brainfuckのような言語のテープにすでにあるアイテムについてのメタ投稿があります。私はそれについてメタで尋ねます(それは実際にVitsyにとって非常に重要だからです。:D)
Addison Crump


4

C、96バイト

i;main(c,v,p)char**v,*p;{i=atoi(v[2])+1;c=strlen(p=v[1]);printf("%c%.*s%s",*p,c-2*i,p+i,p+c-1);}

非ゴルフ

i; /* Param 2, the number of chars to remove */

main(c,v,p)char**v,*p;
{
    i=atoi(v[2])+1; /* convert param 2 to integer */
    c=strlen(p=v[1]); /* Length of the input */
    printf("%c%.*s%s",*p, /* Print the first char... */
        c-2*i, /* a number of characters equal to the length minus twice the input... */
        p+i, /* skip the "removed" chars... */
        p+c-1); /* Print the last character of the string */
}

3

ルビー、29バイト

->s,n{s[0]+s[n+1...~n]+s[-1]}

とても簡単です。

~トリックから盗まれたSPの答えを超えるバイトを保存し、s[n+1..-2-n]。(ので、それは動作し~nている-1-n2の補数で、その後...排他的範囲です。)


3

Perl、36 32 + 1 = 33バイト

for$i(1..<>){s;\B.(.+).(.);$1$2;}

-pフラグが必要で、2行で入力を受け取り、最後に反復回数を指定します。

$ perl -pe'for$i(1..<>){s;\B.(.+).(.);$1$2;}' <<< $'ABCDEFGHIJKLMNOP\n4'
AFGHIJKP

ゴルフをしていない?

for $i ( 1..<> ) {
  s;
  \B.(.+).(.);$1$2;x
}

3

CJam、12バイト

q~{VW@)t(t}*

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

使い方

q~            Read and evaluate all input. This pushes S (string) and N (integer).
  {       }*  Do the following N times:
   VW           Push 0 and -1.
     @          Rotate S on top of them.
      )         Pop the last character of S.
       t        Set the item at index -1 to that character.
        (       Pop the first character of S.
         t      Set the item at index 0 to that character.

3

オクターブ、28バイト

@(S,N)S([1,N+2:end-N-1,end])

文字列にインデックスを付け、省略しS(2:N+1)S(end-N:end-1)ます。

ideoneでのサンプル実行。


3

さび、135バイト

まあ、それはかなりひどい長さです。

fn f(s:&str,n:usize)->String{let s=s.as_bytes();s[..1].iter().chain(&s[n+1..s.len()-n-1]).chain(s.last()).map(|d|*d as char).collect()}

プリティプリント:

fn f(s: &str, n: usize) -> String {
    let s = s.as_bytes();
    s[..1].iter()
          .chain(&s[n+1..s.len()-n-1])
          .chain(s.last())
          .map(|d| *d as char)
          .collect()
}

適切な文字列の代わりにバイト文字列を許可すると、104バイトまで減らすことができます。

fn f(s:&[u8],n:usize)->Vec<u8>{let mut r=vec![s[0]];r.extend(&s[n+1..s.len()-n-1]);r.extend(s.last());r}

プリティプリント:

fn f(s: &[u8], n: usize) -> Vec<u8> {
    let mut r = vec![s[0]];
    r.extend(&s[n+1..s.len()-n-1]);
    r.extend(s.last());
    r
 }

誰かがもっとうまくできるかどうか興味があります。


3

mSL-137バイト

c {
%l = $len($1)
return $mid($+($mid($1,2,1),$left($1,1),$right($left($1,-2),-2),$right($1,1),$mid($1,$calc(%l -1),1)),2,$calc(%l -2))
}

説明:

%l = $len($1) 入力文字列の長さを取得し、lという変数に保存します

$right(<input>,<length>) そして $left(<input>,<length>、元の文字列の左または右のほとんどの部分を適切に返すために使用できます。$ leftは常に一番左から始まるテキストを返し、$ rightは常に右から始まるテキストを返します。指定された長さが負の数である場合、$ leftと$ rightは、テキスト全体からそれぞれの側からその数の文字を引いたものを返します。

$mid(<string>,<start>,[length])文字列の中央から部分文字列を取得するために使用されます。開始は、左からの部分文字列の開始です。負の値は、右からの開始を示します。どちらの場合も、オプションの長さを指定できます。負の長さを使用すると、その数の文字を末尾から削除できます。そこで、入力文字列の長さを使用して、2番目の文字と2番目の最後の文字を取得するために使用しました。

$calc(<input>) 数学計算を実行するために使用されます


1
PPCGへようこそ!通常、注釈やコードの説明を追加することをお勧めします。
ザックゲイツ

@ZachGatesありがとう!次回もこれを覚えておいてください!
デニー

2

まだ無題の言語の(非常に新しい非競争的)、9バイト

hD_RQ:Q|J

ここでソースコードを見つけることができますで、言語は完全に不安定です(最初のテストチャレンジ)ので、将来動作することを期待しないでください(コミット7)

これは、スタックにオブジェクトを追加および削除する機能を備えたスタックベースの言語です。現在2つのスタック操作コマンドがあります:(スタックDのトップをN回複製します)およびR(のトップNアイテムを回転)

説明:

          - autoassign Q = eval_or_not(input()) (string)
h         - imp_eval_input()+1
 D        - duplicate(^)
  _       - neg(^)
   R      - rotate(^)
    Q:    - Q[^:^]
      Q|  - Q[0], Q[-1]
        J - "".join(all)

2

CJam、14バイト

l(o)\l~_W*@<>o

ここでテストしてください。

説明

l   e# Read the input string.
(o  e# Pull off the first character and print it.
)\  e# Pull off the last character and swap with the rest of the string.
l~  e# Read the second line of the input and evaluate it (N).
_   e# Duplicate.
W*  e# Multiply by -1 to get -N.
@   e# Pull up the string.
<   e# Discard the last N characters.
>   e# Discard the first N characters.
o   e# Output what's left. The last character of the input is now still on the
    e# stack and is automatically printed at the end of the program.

2

Vim、27バイト

o0lxehx <ESC>"ay0ddA@a<ESC>B"bdWx@b

入力は次の形式であることが期待されています STRING N、他の文字を含まない最初の行のである。

説明:

#Write a macro to do one round of the swap and delete and save to register a
o0lxehx <ESC>"ay0dd

#Append register a to N and save in register B so it will run @a N times.
A@a<ESC>B"bdWx

# Actually run the macro
@b

2

Brainfuck、130バイト

私の最初のPPCGエントリー!

明らかに勝つつもりはないが、ちょっと。

4ABCDEFGHIJKLのような入力を取ります。最初の文字はNです。

,>+++++++[<------->-]<+>>+[>,]<[<]>-<<[>>>[<+>-]>[<+>-]<<[>>+<<-]>[>]<[>+<-]<[>+<-]>>[<<+>>-]<[-]<[<]>[-]>[[<+>-]>]<<[<]<<-]>>>[.>]

この素晴らしいサイトでテストしてください。

2桁の数字は苦痛なので、9以下のNに制限されます。

編集:私はそれを吸い込んで、2桁の数字のサポートを追加しました。1桁の場合はゼロで埋めます。

,>+++++++[<------->-]<+ [>++++++++++<-]>[<+>-],>+++++++[<------->-]<+ [<+>-]>+[>,]<[<]>-<<[>>>[<+>-]>[<+>-]<<[>>+<<-]>[>]<[>+<-]<[>+<-]>>[<<+>>-]<[-]<[<]>[-]>[[<+>-]>]<<[<]<<-]>>>[.>]

PPCGへようこそ!これは非常に良い最初の答えです!:)
アドナン

@AandNありがとう!私は新しいお気に入りの言語の1つであるBFで比較的簡単に解決できる課題を探していました。D
vasilescur

2

Perl、27バイト

+1を含める -p

として実行 perl -p sdr.pl

STDINで指定された入力、1行目は文字列、2行目はカウント文字列に「単語」文字のみが含まれると想定

sdr.pl

eval's%\B.(.*).\B%$1%;'x<>

1

PHP、60バイト

このソリューションは、入力文字列の文字をインデックスによって空の文字列に繰り返し設定します。longを防ぐために、入力文字列を直接操作していますreturn

function(&$w,$i){for(;$i;)$w[$i--]=$w[strlen($w)-$i-2]="";};

基本的に、メモリ内で$wは、次のようになります。

Addr 0 1 2 3 4
     H   l   o
     ^   ^   ^
>Result: Hlo

次のように実行します。

php -r '$f = function(&$w,$i){for(;$i;)$w[$i--]=$w[strlen($w)-$i-2]="";}; $f($argv[1],$argv[2]);echo"$argv[1]\n";' Hello 1

PHP 4.1(50バイト): <?for(;$I;)$W[$I--]=$W[strlen($W)-$I-2]="";echo$W;。これは、キーの値を期待WしてI、POST / GET / COOKIE上...例は以下のようになりますhttp://example.com/a.php?W=MyString&I=5
イスマエルミゲル

1
うん、register globalsもう必要な答えはしたくない。提案のためのThx :)
aross

1

パイロン、16バイト。

i:At,{\,v\,v,A}c

使い方:

i    # Get command line input.
:At  # Set A equal to the top of the stack.
,    # Pop the stack.
{    # Start a for loop.
 \   # Swap the top two elements of the stack.
  ,  # Pop the stack.
   v # Reverse the stack.
 \   # Swap the top two elements of the stack.
  ,  # Pop the stack.
   v # Reverse the stack.
 ,   # Switch to loop iterations.
 A   # Iterate A times.
}    # End the for loop.
c    # Print the stack as a string

1

CJam、15バイト

r(\)\{(;);}ri*\

これをさらにゴルフすることは可能だと確信しています...



1

真剣に、17バイト

,#,`p@pXod@dXq`nΣ

入力をとして受け取りますs \n n

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

説明:

,#,`p@pXod@dXq`nΣ
,#                 push a list of characters in s
  ,`          `n   do the following n times:
    p@pXo          pop 2 characters off the front, discard the second, put the first back
         d@dXq     pop 2 characters off the back, discard the second, put the first back
                Σ  join

1

C#、129バイト

基本的に1をスキップしてNと逆のシナリオを削除するため

string o(string i,int n){var s=i.ToList();int x=0;while(x<2){s.RemoveRange(1,n);s.Reverse();x++;}return new string(s.ToArray());}

食べない

string o(string i, int n)
{
    var s = i.ToList();
    int x = 0;
    while (x < 2) //Repeat the following twice
    {
        s.RemoveRange(1, n); //remove n at index 1
        s.Reverse(); //Reverse the list
        x++;
    }
    return new string(s.ToArray());
}

次のforループを使用して、スクリプトの長さを短くすることができます:for(int x = 0xi <2; i ++)
t-clausen.dk

1

Java、144バイト

static String y(int i,String s){return i==0?s:y(i-1,new StringBuffer(s).replace(1,2,"").replace(s.length()-3,s.length()-2,"").toString());}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.