「Ceeeeeeee」プログラムを作成する


95

入力として文字列と文字を取り、最初の文字と入力として与えられた文字を除くすべての文字を1つずつ削除するJavaScriptプログラムを作成した後。

たとえば、入力codegolf.stackexchange.comを使用eして文字を計算すると、次のようになります。

codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceeecom
ceeeom
ceeem
ceee

最初の文字とすべてeのを保持します。他のすべての文字は1つずつ削除されます。

あなたの仕事は、この効果を達成する文字列を2つの入力と出力(または返す)を取るプログラム(または関数)を書くことです。

仕様書

  • 文字列には改行が含まれないと想定できます。
  • 2番目の入力は常に1文字です。
  • 答えが関数の形式である場合、出力の各行を含む文字列の配列を返すことができます。
  • 出力には、末尾の改行を含めることができます。

テストケース

Test Casess

Test Cases
Tst Cases
Ts Cases
TsCases
Tsases
Tsses
Tsss

Make a "Ceeeeeeee" programe

Make a "Ceeeeeeee" program
Mke a "Ceeeeeeee" program
Me a "Ceeeeeeee" program
Mea "Ceeeeeeee" program
Me "Ceeeeeeee" program
Me"Ceeeeeeee" program
MeCeeeeeeee" program
Meeeeeeeee" program
Meeeeeeeee program
Meeeeeeeeeprogram
Meeeeeeeeerogram
Meeeeeeeeeogram
Meeeeeeeeegram
Meeeeeeeeeram
Meeeeeeeeeam
Meeeeeeeeem
Meeeeeeeee

Hello World!!

Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!

Hello World!z

Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!
H

alphabeta

alphabet
aphabet
ahabet
aabet
aaet
aat
aa

upperCASEe

upperCASE
uperCASE
uerCASE
ueCASE
ueASE
ueSE
ueE
ue

これはであるため、最短のコード(バイト単位)が優先されます。



25
+1Meeeeeeeeegram
FlipTack

配列を返す場合、各要素に末尾の改行を含める必要がありますか?
ブラッドギルバートb2gills

@ BradGilbertb2gills No.
エソランジングフルーツ

4
Meeeeeeeeeeeeem
Mathime

回答:


5

V、12バイト

òYpó.“„a]òd

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

Hexdump:

00000000: f259 70f3 2e93 8412 615d f264            .Yp.....a].d

チャレンジの前に利用可能な最新バージョンのVでこれをテストしましたが、すべてが正しく実行され、この答えが競合します。

説明:

ò         ò    " Recursively:
 Yp            "   Duplicate this line
   ó           "   Remove:
    .a]      "     A compressed regex
            d  " Delete our extra line

圧縮された正規表現は

.\zs[^e]

つまり

.           " Any character
 \zs        " Leave the previous character out of the selection
    [^e]    " Any character except for 'e' (Or whatever is given for input)

非競合バージョン(11バイト)

このバージョンでは、Ypこのチャレンジが投稿されたときには利用できなかったショートカットを使用しています。


@ challenger5素晴らしい!古いバージョンをチェックアウトし、正しく機能することを確認します。少し変更する必要があるかもしれません。更新したら、pingを送信します。
DJMcMayhem

@ Challenger5回答を編集し、チャレンジが投稿されたときにこのバージョンが機能することを確認しました。
DJMcMayhem

Linuxシステムのファイルに保存されたVimコマンドの束をどのように実行しますか?私だろうcat filename | vimか、私は他の何かをしますか?
ckjbgames

31

VIM、27、26、25のバイト

DJqqYp:s/.\zs[^<C-r>-]<CR>@qq@qD

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

入力の形式は次のとおりです。

e
codegolf.stackexchange.com

私の素朴な最初のアプローチは3バイト長くなります:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd

私の名前から始まるので、この答えにも満足しています。

DJqq:t$|s/.\zs[^<C-r>"]<CR>@qq@qD
DJMcMayhem

類似性を参照してください?え?

あまり成功していないアプローチ:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd
i:s/.\zs[^<Right>]<CR>@q<Esc>"adkqqYp@aq@qdd
DJ:s/.\zs[^<C-r>"]<CR>uqqYp@:@qq@qdd
DJqq:t.|$s/.\zs[^<C-r>"]<CR>@qq@qdd

説明:

D                                   " Delete everything on this first line
 J                                  " Remove this empty line
  qq                                " Start recording into register 'q'
    Y                               " Yank this line
     p                              " And paste it
      :s/                           " Run a substitute command on the last line in the buffer. Remove:
         .                          "   Any character
          \zs                       "   Move the selection forward (so we don't delete the first one)
             [^<C-r>-]              "   Followed by anything *except* for the character we deleted
                      <CR>          " Run the command
                          @q        " Call register 'q'
                            q       " Stop recording
                             @q     " Run the recursive macro
                               D    " Delete our extra line

1
入力が与えられたところにタイプミスがあったと思いますk:)
geisterfurz007

@ geisterfurz007私はあなたが意味するものを得るかどうかわかりませんか?
DJMcMayhem

現在は(...)comk5行目です。
geisterfurz007

:tここで使用する理由はありません。通常Ypはバイトを節約します。<C-R>-もちろん、切り替える必要があります。典型的なPPCG規則は、理由の任意の合理的なテストケースのために、イライラしている:t.|s99@:、さらには999@:正しいことだろうが、取得するには良い方法はありません無限そのように繰り返して。あなたはあまり面白くない戦略を使用せざるを得ません。
udioica

22

MATL20 16バイト

y-f1X-"t[]@X@q-(

オンラインでお試しください!またはテストケースを検証:12345

ボーナス

文字列が徐々に縮小されるようにコードを修正しました(オフラインコンパイラ):

y-f1X-"tt.3Y.XxD[]@X@q-(].3Y.XxDvx

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

または、MATL Online試しください

説明

y        % Implicitly input string and char. Duplicate string onto top
-        % Subtract. Gives nonzero for chars in the input string that are
         % different from the input char
f        % Array of indices of nonzero values
1X-      % Remove 1 from that array. This gives an array of the indices of 
         % chars to be removed from the string
"        % For each
  t      %   Duplicate previous string
  []     %   Push empty array
  @      %   Push index of char to be removed. But this index needs to be 
         %   corrected to account for the fact that previous chars have
         %   already been removed...
  X@q-   %   ... So we correct by subtracting the 0-based iteration index
  (      %   Assign empty array to that position, to remove that char
         % Implicitly end for each
         % Implicitly display

3
GIFS!gifはクールです!
ブレインガイダー

20

Haskell、50バイト

w@(a:x)%c|(d,_:y)<-span(==c)x=w:(a:d++y)%c|0<1=[w]

(%)文字列のリストを返す関数を定義します。

説明

(%)はとして呼び出されw%cw入力文字列でありc、保持する文字です。要するに、この定義wは、最初の文字(a)と残り(x)に分離xし、以外の文字の最初の出現で分割し、cその1文字を落とした状態で自分自身を再帰的に呼び出すことによって機能します。

w@(a:x)%c              -- define (%) with w separated into a and x.
 |(d,_:y)<-span(==c)x  -- split x; bind the string of `c` to d, and the rest
                       -- to _:y, dropping first character and calling the rest y.
  =w:(a:d++y)%c        -- if there was a character to drop, cons w onto the
                       -- sequence gained by recursively calling (%) with that
                       -- character removed (i.e. call with a:d++y).
 |0<1=[w]              -- if nothing needed to be dropped, the result sequence is
                       -- simply the one-element list [w]

3
コードを説明できますか?
bli

1
@bli完了!うまくいけば、これが役立ちますか?
ダイアン

14

網膜28 27バイト

バイトカウントはISO 8859-1エンコードを前提としています。

;{G*1`
R1r`(?!^|.*¶?\1$)(.)

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

説明

;{G*1`

ここには多くの設定があります。ステージ自体は実際にはjust G1`であり、最初の行のみを保持し、入力文字を破棄します。*ドライランに変換します。つまり、結果(つまり、文字列の最初の行)は実際に文字列を変更せずに印刷されます。{Retinaに、文字列の変更が停止し;、プログラムの最後で出力が行われないまで、ループで両方のステージを実行するように指示します。

R1r`(?!^|.*¶?\1$)(.)

これにより、a)入力の先頭にない最初の文字、b)別の入力文字と等しくない文字は破棄されます。


10

ピップ22 26 24 22バイト

Lv+#Paa@oQb?++oPaRA:ox

最初のコマンドライン引数として文字列を取り、2番目の文字として文字を取ります。オンラインでお試しください!

説明

入力の文字をループします。文字が特殊文字と等しい場合、次の文字に進みます。そうでない場合は、削除して文字列を出力します。

改変されていないバージョン(abget cmdline args; はのo値で始まり1xis ""):

P a         Print a
L #a-1      Loop len(a)-1 times:
 I a@o Q b   If a[o] string-eQuals b:
  ++o         Increment o
 E {         Else:
  a RA: o x   In-place in a, Replace char At index o with x (i.e. delete it)
  P a         Print a
 }

ゴルフのコツ:

  • のループヘッダーLは1回しか評価されないため、そこに初期印刷を潜入することができます。#Pa-1P優先順位が低いため解析されませんが(として解析されます#P(a-1))、に事前初期化されv+#Pav変数を使用して、に再配置できます-1
  • RA:オペレータは、新しい値を返すaので、私たちは別々のではなく、その式を印刷することができPa文を。
  • ifステートメントの両方のブランチは単一の式であるため、?代わりに三項演算子を使用できます。

10

Perl 5、29バイト

Strawberry Perlを使用して35バイトを得ました:31バイト、プラスの-nE代わりに1 -e、プラススペース+ -i(1文字入力に使用。長い文字列はSTDINから)に3。

chomp;say;s/(.)[^$^I]/$1/&&redo

ただし、Strawberryを使用して自分でテストすることはできませんが、29バイトのをchomp;使用せずにこれが実行できることは間違い<<<ありません。

say;s/(.)[^$^I]/$1/&&redo

副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:

perl -im -nE'say;s/(.)[^$^I]/$1/&&redo' <<< "example"

「入力に改行なし」を指定するだけです(2番目のプログラムの動作です)。入力の改行をひどく削除する必要がある場合は、-lオプションを調べます。自動改行処理モードがオンになりprint、追加の改行(ここでは無関係)が印刷され、-p/ -ninputが改行(非常に関連性の高い)を削除します。また、非推奨ですが^I、余分なバイトを節約するために、リテラルのcontrol-Iに置き換えることができると思います。最後に、私s/.\K[^$^I]/redo/eはそれが1文字短くなると思いますが、それがを置くための正当な場所であることは100%確信していませんredo

@ ais523、改行のアドバイスに感謝しますが、すでに問題を十分に処理したと思います。リテラル^I、これはほとんどのコントロール文字変数に当てはまりますが、この変数IIRCには当てはまりません。再\K、とredoの交換を入れて/e、ありがとう!機会があればテストします…。
msh210

...そしてそれは動作しません。@ ais523
msh210

8

Perl 6の 47の40  38バイト

->\a,\b{a,{S/^(."{b}"*:)./$0/}...^{$^a eq $^b}}
->\a,\b{a,{S/^(."{b}"*:)./$0/}...^&[eq]}
{$^b;$^a,{S/^(."$b"*:)./$0/}...^&[eq]}

拡張:

{       # lambda with two placeholder parameters 「$a」 and 「$b」

  $^b;    # declare second parameter

  $^a,    # declare first parameter, and use it to seed the sequence

  {       # bare block lambda with implicit parameter 「$_」
    S/      # string replace and return
      ^       # beginning of string
      (       # capture into 「$0」
        .       # the first character
        "$b"*   # as many 「$b」 as possible
        :       # don't allow backtracking
      )
      .       # any character ( the one to be removed )

    /$0/      # put the captured values back into place
  }

  ...^      # repeat that until: ( and throw away the last value )

  &[eq]     # the infix string equivalence operator/subroutine

}

...^代わりに使用された理由は、最後の値が繰り返されるまで戻らない...という&[eq]ことTrueです。


7

05AB1E26 25バイト

¬ˆ[¦Ðg_#¬²k0Qi²ˆë¯J?,]¯J?

¬ˆ                         Put the first character into an array
  [                        While true
   ¦                       Remove the first character
    Ð                      Triplicate
     g_#                   if the string is empty, break
        ¬²k0Qi             if the first character is equal to the one specified in the input
              ²ˆ           Add it to the array
                ë          Else
                 ¯J?       Display the array
                    ,      Display the remaining string
                     ]     End while
                      ¯J?  Display the last string

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

¬²k0Q書き換えることができます¬²Qが、何らかの理由で現在の文字が引用符である場合は機能しません。Qはブール値ではなく実際の文字列を返し、無限ループを引き起こします。

¯J?重複しているため、このコードはさらにゴルフすることができます。この部分をループ内で移動すると、重複が削除され、閉じ角括弧も削除されます。


DˆćUΔD²KRнõ.;DXìˆ}¯¨»21ですが、それは新しいコマンドを使用します。
魔法のタコ

7

Python 2、71 66バイト:

f,m=input();k=f[0]
while f:a=f[0]==m;k+=f[0]*a;f=f[1+a:];print k+f

完全なプログラム。形式でSTDINを介して2つの入力を受け取ります'<String>','<Char>'

また、以下は現在140バイトの再帰的なソリューションです。

Q=lambda c,p,k='',j=1,l=[]:c and Q(c[1:],p,k+c[0]*(j<2)+c[0]*(c[0]==p),j+1,l+[k+c])or'\n'.join(sorted({*l},key=l.index))+('\n'+k)*(k not in l)

これは、形式で呼び出す必要がありますprint(Q('<String>','<Char>'))


私はPythonバフではありませんが、これは1行だけを印刷すべきではありませんか?
コナーオブライエン

@ ConorO'Brienええ、私は前に投稿を読み違えました。現在修正されています。
R. Kap

7

Python 3、72バイト

def e(i,k):
 for r in i:
  if r!=k:i=i[0]+i[1:].replace(r,'',1);print(i)

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

e('😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆','🥓')

ダイエットをする:

😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🍅🍄🍆
😋🥓🥓🥓🥓🍄🍆
😋🥓🥓🥓🥓🍆
😋🥓🥓🥓🥓

6

JavaScript(ES6)、74バイト

(s,c)=>[...t=s.slice(1)].map(d=>c!=d?s+=`
`+s[0]+(t=t.replace(d,``)):s)&&s

これはf('test cases', 's')stssでなくで終わる)の誤った出力を生成すると思いますtsss。これはreplace、最初の出現を削除して、ループの4回目の反復でt2番目tではなく最初の出現を削除するためだと思いmapます。
Lmis

@Lmisそれを指摘してくれてありがとう、私は自分のバージョンの1つを7バイトのペナルティだけで修正できたと思います。
ニール

5

Ruby、148 139 97 90 83 77 62バイト

a,c=$*;p s=""+a;i=1;while d=s[i];(d!=c)?(s[i]="";p s):i+=1;end

この交換でアマチュアコードが受け入れられるかどうかはわかりませんが、ゴルフのコーディングを学ぶことに興味がありますが、それは恐ろしいことです。

編集:

putをpに置き換えました

Wheat Wizardのおかげで、大量の空白を削除し、バイトを正しくカウントしました

challenger5のおかげでから行ったs=gets.chop;c=gets.chop;s,c=gets.chop,gets.chop;

交換しthen;gets.chopしてgets[0]感謝Mhutter!

入力をコマンドライン変数として今、例えば prog.rb helloworld l

jeroenvisser101によって多くの改良のおかげで交換するa=s.dups=""+aしている場合、前の文if s[i]!=c;s[i]="";p s;else i+=1;end(d!=c)?(s[i]="";p s):i+=1;大幅に改善!


サイトへようこそ!私はルビーのゴルフの専門家ではありませんが、余分な空白があるようです。特に=sの周り。より包括的なヒントについては、ヒントのページをご覧ください
小麦ウィザード

バイトを削除する最も簡単な方法は、たとえば、余分な空白を削除することs=gets.chompです。Rubyでこれができるかどうかはわかりませんが、Pythonのような一部の言語では、複数の割り当てを1つのステートメントに結合できますa,b,c=0,1,2
エソランジングフルーツ

空白に関するヒントに感謝します。ルビーのドキュメントを読んで、セミコロンが終了ステートメントに置き換えることができることに気付きました: ')そのような残念ながら間違いなく聞きしたいコードの大部分と、私はその長い文を削除したい...
ベンHili

特にキーワード(dothenおよびend)の前、および4番目の前後には、まだいくつかの余分なスペースがあります=
小麦ウィザード

バイト数を自分で変えているように見えます。私は自分で90バイトしかカウントしません。
小麦ウィザード

4

C90、129の 125バイト

空白あり:

main(q, x)
{
    for (char **v = x, *a = v[1], *b = a, *c;*b++;)
        for (c = a; c == a | *c == *v[2] && *b != *v[2] && putchar(*c),
            ++c != b || *b != *v[2] && !puts(b););
}

空白なし:

main(q,x){for(char**v=x,*a=v[1],*b=a,*c;*b++;)for(c=a;c==a|*c==*v[2]&&*b!=*v[2]&&putchar(*c),++c!=b||*b!=*v[2]&&!puts(b););}

なし:

#include <stdio.h>
int main(int argc, char **argv)
{
    char *a = argv[1];
    for (char *b = a + 1; *b; b++) {
        if (*b == *argv[2]) {
            continue;
        }
        putchar(*a);
        for (char *c = a + 1; c != b; c++) {
            if (*c == *argv[2]) {
                putchar(*c);
            }
        }
        puts(b);
    }
}

これは、文字列の先頭へのポインタを受け取り、文字列の末尾に到達するまでこのポインタを繰り返しループします。ループ内で、最初の文字を出力し、次に文字列の先頭とポインターの間にある2番目の引数のインスタンスを出力します。この後、ポインタにputsを呼び出して、残りの文字列を出力します。

これは、sizeof(int)== sizeof(char *)のシステムでコンパイルする必要があります。それ以外の場合は+3バイト。

ここでコードゴルフを試したのはこれが初めてなので、いくつかの最適化が行われるはずです。


3

Dyalog APL、27 バイト

{×i←⊃1+⍸⍺≠1↓⎕←⍵:⍺∇⍵/⍨i≠⍳≢⍵}

は除外される文字で、初期文字列です

引数を出力します。最初のcharの後の最初のinon-のインデックスを見つけます。見つかった場合、i削除して再帰的に呼び出します


3

Mathematica、64バイト

Most@FixedPointList[StringReplace[#,b_~~Except@a:>b,1]&,a=#2;#]&

匿名関数。入力として2つの文字列を受け取り、出力として文字列のリストを返します。キャラクターの最初の非インスタンスを繰り返し削除することで機能します。


私は間違いなく使用を開始するつもりですFixedPointList
ngenisis 16

3

PHP、88 84 86 85 82 81 78バイト

@IsmaelMiguelのおかげで1バイト、@ user59178のおかげで3バイト、@ user59178に触発された3バイト

while($b=substr("$argv[1]\n",$i++))$a>""&$b[0]!=$argv[2]?print$a.$b:$a.=$b[0];

コマンドライン引数から入力を受け取ります。と走るphp -r <code> '<string>' <character>


  • 暗黙の最終印刷のために、入力に改行を追加します。
    これは5 4バイトのコードを追加しますが、出力と追加のを節約しecho$a;ます。

1
$argv[1]."\n"ように書くことができます"$argv[1]\n"
イスマエルミゲル

1
$b取得改行それは限り、そのようなものとして、それは長さ> = 1を有するように常にtruthyによってそれに添加される""<必要がありません。
user59178

substr()割り当てるのではなく、3進数を使用して別のバイトを保存できます$b
user59178

@ user59178私は本当にそこにあなたを捕まえませんでした:私substrは条件と両方の結果が必要printです。そのため、どこかに割り当てる必要があります。しかし、あなたは私にインスピレーションを与えました。
タイタス

私はfor(;$b=substr($b?:".$argv[1]\n",1);)あなたが今持っているものをさらに良くするつもりでした。
user59178

3

05AB1E、26 24 23バイト

@Kadeに2バイトありがとう!
@Emignaに1バイトをありがとう!

¬UDvy²k0Êiy¡¬s¦yý«Xs«=¦

CP-1252エンコードを使用します。オンラインでお試しください!

y²k0Ê可能性がありますy²Êが、"それを台無しにします。

これはおそらく«2回繰り返されるため、より多くのゴ​​ルフができるでしょう。何か提案やゴルフをする方法があれば、コメントを残してください。


3

ジャワ10、155の 140 139 124バイト

c->s->{var r=s+"\n";for(int i=0;++i<s.length();)if(s.charAt(i)!=c)r+=(s=s.substring(0,i)+s.substring(i--+1))+"\n";return r;}

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

説明:

c->s->{          // Method with character and String parameters and String return-type
  var r=s+"\n";  //  Result-String, starting at the input-String with trailing new-line
  for(int i=0;++i<s.length();)
                 //  Loop over the characters of the String, skipping the first
    if(s.charAt(i)!=c)
                 //   If the current character and the input-character are equal
      r+=(s=s.substring(0,i)+s.substring(i--+1))
                 //     Remove this character from the String `s`
         +"\n";  //     And append the new `s` with trailing new-line to the result-String
  return r;}     //  Return the result-String

古い139バイトの再帰的な回答:

void c(String s,int c){System.out.println(s);for(int i=1;i<s.length();)if(s.charAt(i++)!=c){c(s.substring(0,i-1)+s.substring(i),c);break;}}

@Eugeneのおかげで-1バイト。(次回は、誰か他の人の投稿を編集する代わりにコメントをしてください。)

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

説明:

void c(String s,int c){     // Method with String and integer parameters and no return-type
  System.out.println(s);    //  Print the input-String with trailing new-line
  for(int i=1;i<s.length();)//  Loop over the characters of the String, skipping the first
    if(s.charAt(i++)!=c){   //   If the current character and the input-character are equal
      c(s.substring(0,i-1)+s.substring(i),c); 
                            //    Remove this character, and do a recursive call
      break;}}              //    And stop the loop

char []に煩わされず、s.charAt()を使用する方がはるかに短くないでしょうか?
dpa97

@ dpa97ああ、あなたは完全に正しい。最初はforeachループを使用しましたが、通常のforループに変更しました。文字配列を削除するのを忘れました。ありがとう。
ケビンCruijssen

2

C位、122の 117 112バイト

IEnumerable F(string s,char c){for(int i=0;i<s.Length;++i)if(i<1||s[i]!=c)yield return i>0?s=s.Remove(i--,1):s;}

アンゴルフド:

public IEnumerable F(string s, char c) {
    for (int i = 0; i < s.Length; ++i) {
        if (i < 1 || s[i] != c)
            yield return i > 0 ? s = s.Remove(i--, 1) : s;
    }
}

文字列のコレクションを返します。


1
ジェネリックではないコレクションを使用する素晴らしいトリック。ただし、最後のcharが特殊charでない場合は機能しませんc。その場合、ループは永久に機能します。
paldir

1
@paldir Woops、あなたは正しい!この時間に私の脳を回して、より良い(そしてより短い!)方法を見つけました。
サイコ

forループの括弧を削除して、2バイトを節約できます。
-PmanAce

@PmanAceごめんなさい、どういう意味ですか?どの括弧?
サイコ

public IEnumerable F(string s、char c){for(int i = 0; i <s.Length; ++ i)if(i <1 || s [i]!= c)yield return i> 0?s = s.Remove(i--、1):s; }
PmanAce

2

TSQL、127バイト(変数定義を除く)

DECLARE @1 VARCHAR(100)='codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'

DECLARE @ char=LEFT(@1,1)WHILE patindex('%[^'+@2+']%',@1)>0BEGIN SET @1=STUFF(@1,patindex('%[^'+@2+']%',@1),1,'')PRINT @+@1 END

フォーマット済み:

DECLARE @1 VARCHAR(100) = 'codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'
DECLARE @ CHAR = LEFT(@1, 1)

WHILE patindex('%[^' + @2 + ']%', @1) > 0
BEGIN
    SET @1 = STUFF(@1, patindex('%[^' + @2 + ']%', @1), 1, '')

    PRINT @ + @1
END

グッドの使用patindexが、alphabet例としては、かなり右いないようですが、それが表示さaaphabet通じダウンaaa。また、これは大文字と小文字を区別する照合を使用してサーバーまたはデータベースで実行する必要があります。そうしないと、upperCASE例も失敗ueEし、最終行に表示されます。
BradC

2

C#、135 138 :( 137バイト

ゴルフ:

IEnumerable<string>F(string s,char c){int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i==l)break;s=s.Remove(i,1);}}

ゴルフをしていない:

    IEnumerable<string> F(string s, char c)
    {
        int i = 1, l;

        for (;;)
        {
            yield return s;

            l = s.Length;

            while (i < l && s[i] == c)
                i++;

            if (i == l)
                break;

            s = s.Remove(i, 1);
        }
    }

関数は文字列のコレクションを返します。

EDIT1:@psychoは、アルゴリズムが適切に実装されていないことに気付きました。

EDIT2:の変数を作成しましたs.Length。@TheLethalCoderのおかげで1バイト節約できました。


1
入力文字が連続して複数回存在する場合は機能しません。例:の代わりにcodeegolf e与えるでしょう。cecee
サイコ

交換ifした@psychoはwhile動作します。
paldir

より良い!しかし、それより短くすることもできます。自分で投稿します!
サイコ

1
以下のための変数を作成してs.Length1つのバイトを保存するために:int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i>=l)break;s=s.Remove(i,1);}}
TheLethalCoder

2

Pythonの2 - 65の 73バイト

lambda s,c:[s[0]+c*s[1:i].count(c)+s[i+1:]for i in range(len(s))]

そして、76バイトの再帰的なソリューションです。最初のものよりも長いにも関わらず、私はそれが好きだからです。

f=lambda s,c,i=1:s[i:]and[[s]+f(s[:i]+s[i+1:],c,i),f(s,c,i+1)][s[i]==c]or[s]

2

ラケット194バイト

(let p((s s)(n 1)(t substring)(a string-append))(displayln s)(cond[(>= n(string-length s))""]
[(equal? c(string-ref s n))(p(a(t s 0 n)(t s n))(+ 1 n)t a)][else(p(a(t s 0 n)(t s(+ 1 n)))n t a)]))

ゴルフをしていない:

(define (f s c)
  (let loop ((s s)
             (n 1))
    (displayln s)
    (cond
      [(>= n (string-length s))""]
      [(equal? c (string-ref s n))
       (loop (string-append (substring s 0 n) (substring s n))
             (add1 n))]
      [else
       (loop (string-append (substring s 0 n) (substring s (add1 n)))
             n)])))

テスト:

(f "Test cases" #\s)
(f "codegolf.stackexchange.com" #\e)

出力:

Test cases
Tst cases
Tst cases
Ts cases
Tscases
Tsases
Tsses
Tsses
Tsss
Tsss
""
codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceee.com
ceeecom
ceeeom
ceeem
ceee
""

2

JavaScript(ES6)、64 69

改行を含む単一の文字列を返す

s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s

F=
s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s
  

function update() {
  var s=S.value,c=C.value[0]
  O.textContent=F(s)(c)
}

update()
<input id=S value='Hello world!' oninput='update()'>
<input id=C value='!' oninput='update()'>
<pre id=O></pre>


2つの引数ではなく1つの引数を取り、2番目の引数を与える必要がある別の関数を返すという点で少し奇妙です。これが予想された動作であったかどうかはわかりません。
-MT0

@ MT0私は奇妙ですが、1バイトを節約するため、2つの引数を持つ関数に受け入れられます。見つかったら参照します。ここにあるmeta.codegolf.stackexchange.com/a/8427/21348
edc65は、

すばらしいテクニックです。3番目の引数を変更すること.mapが累積的であることに気づきませんでした。私が見た.map().filter()と思ったが、配列内包のインデックスの欠如は、それを殺し、それが同じ長さで終わった「これは偉大な配列内包になるだろう!」: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](。ところで、私はこれらのすべてのための68のバイトをカウント)
ETHproductions

1
実際には、([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
パラメーターを

@ETHproductionsは、私が再びバイトカウントを間違えたとは信じられません。とにかく、私はそれについてもう一度考えて作るのおかげで、私は標準ES6で64を得た
edc65

2

スイフト3 - 151の 147バイト

Swiftは、特に文字列のインデックス付けに関連する場合、ゴルフに理想的な言語ではありません。これは私ができる最善の方法です:

func c(a:String,b:String){print(a);var q=Array(a.characters),i=1;while i<q.count{if "\(q[i])" != b{q.remove(at:i);c(a:String(q),b:b);break};i=i+1}}

残念ながら、Swiftには(スペースは必要あり!=ませんが==)スペースが必要です。Swift3は++オペレーターを削除しました。これらの両方のトリックは、整数のインデックス付けを可能にする文字配列に変換し、文字の文字列補間を使用してString"\(c)")に戻すことです。

ゴルフをしていない:

func c(a:String, b:String) {
    print(a)
    var q = Array(a.characters)
    var i = 1
    while i < q.count {
        if "\(q[i])" != b {
            q.remove(at:i)
            c(a: String(q), b: b)
            break
        }
        i=i+1
    }
}

以前の非再帰的ソリューション

func c(a:String,b:String){var q=Array(a.characters),e={q.removeFirst()},z="\(e())";print(a);while !q.isEmpty{"\(e())"==b ? z=z+b : print(z+String(q))}}
func c(a:String, b:String) {
    var q = Array(a.characters)
    var z = "\(q.removeFirst())"
    print(a)
    while !q.isEmpty {
        if "\(q.removeFirst())" == b {
            z = z + b
        }else{
            print(z + String(q))
        }
    }
}

PPCGへようこそ!コードの最後の空白を削除できますか?
ETHproductions 16

@ETHproductionsは残念ながらそうではありません。三項演算子とwhileコンパイルに必要なスペースです。また、タイプエイリアスStringprintクロージャーの設定を試みましたが、スペースを節約できませんでした。
rabidaudio 16


1

Mathematica、78バイト

くそー、マーティン・エンダー、私はほとんど最初でした:p

(i=2;a={c=#};While[i<=Length@c,If[c[[i]]==#2,i++,c=c~Drop~{i};a=a~Append~c]];a)&

名前のない機能; Whileループといくつかの一時変数を使用した簡単な実装。


ああ、勘弁してくれよ、我々の両方がMathematicaは必須ではないことを知っている
LegionMammal978

1
<白い旗を振る>
グレッグマーティン

1

JavaScript ES6、89バイト

これは簡単な挑戦だと思いましたが、ここで何かが欠けていると確信しています。

再帰を使用して、文字列の配列を返します

(c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

F=
  (c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

G=_=>A.value.length>1 && (O.innerHTML = F(E.value)(A.value).join`
`)

G()
<input id=A oninput='G()' value='alphabet'>
<input id=E oninput='G()' value='a'>
<pre id=O>


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.