Bir "Ceeeeeeee" programı hazırlayın


95

Bir keresinde bir dize ve karakter olarak girdi alacak ve birincisi ve giriş olarak verilen karakter dışındaki karakterleri birer birer kaldıracak bir JavaScript programı yazdım.

Örneğin, bunu girdilerle codegolf.stackexchange.comve ekarakter verimi için hesaplama :

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

İlk karakteri ve hepsini tutar e. Diğer tüm karakterler tek tek kaldırılır.

Göreviniz iki girdi alan bir program (veya işlev) yazmak ve bu efekti elde eden bir dizgeyi çıktılar (veya döndürür).

Özellikler

  • Dize herhangi bir yeni satır içermeyeceğini varsayabilirsiniz.
  • İkinci giriş her zaman bir karakter olacaktır.
  • Cevap bir işlev biçimindeyse, çıktıdaki her satırı içeren bir dizge dizisi döndürebilirsiniz.
  • Çıktı izleyen bir yeni satır içerebilir.

Test Kılıfları

Test Cases, s:

Test Cases
Tst Cases
Ts Cases
TsCases
Tsases
Tsses
Tsss

Make a "Ceeeeeeee" program, e:

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

alphabet, a:

alphabet
aphabet
ahabet
aabet
aaet
aat
aa

upperCASE, e:

upperCASE
uperCASE
uerCASE
ueCASE
ueASE
ueSE
ueE
ue

Bu , bu yüzden en kısa kod (bayt cinsinden) kazanır.


27
Biraz rasgele, ama 1
TuxCrafting

25
+1 içinMeeeeeeeeegram
FlipTack

Bir dizi döndürmesi durumunda, öğelerin her biri sondaki bir yeni satır içermeli midir?
Brad Gilbert,

@ BradGilbertb2gills No.
Esolanging Meyve

4
Meeeeeeeeeeeeem
Mathime

Yanıtlar:


5

V , 12 bayt

òYpó.“„a]òd

Çevrimiçi deneyin!

HexDump:

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

Bunu , meydan okumadan önceki en son V sürümüyle test ettim ve her şey doğru bir şekilde çalışarak bu cevabın rekabet etmesini sağladım.

Açıklama:

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

Sıkıştırılmış regex çevirir

.\zs[^e]

Bu demektir

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

Rekabet etmeyen sürüm (11 bayt)

Bu sürüm, Ypbu zorluk yayınlandığında kullanılamayan bir kısayol kullanıyor .


@ challenger5 Harika! Eski bir sürümü kontrol edeceğim ve doğru çalıştığını doğrulayacağım. Hafifçe değiştirmek zorunda kalabilirim. Güncellediğimde sana ping gönderirim.
DJMcMayhem

@ Challenger5 Cevabı değiştirdim ve bu sürümün itiraz edildiğinde çalıştığını doğruladım.
DJMcMayhem

Bir Linux sistemindeki bir dosyada saklanan bir grup Vim komutunu nasıl yerine getiririm? İ misiniz cat filename | vimyoksa başka bir şey yapsın ki?
ckjbgames

31

Vim, 27, 26 , 25 bayt

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

Çevrimiçi deneyin!

Giriş bu biçimde gelir:

e
codegolf.stackexchange.com

Saf ilk yaklaşımım üç bayt daha uzun:

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

Bu cevaptan da memnunum çünkü ismimle başlıyor.

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

Benzerliği görüyor musunuz? Eh?

Daha az başarılı yaklaşımlar:

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

Açıklama:

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
Oraya girdi bir orada verilir nerede bir yazım hatası var bence kçok fazla :)
geisterfurz007

@ geisterfurz007 Ne demek istediğini anlayamadım emin değilim?
DJMcMayhem

(...)comkŞu anda 5. satırda yazıyor .
geisterfurz007

Burada kullanmak için hiçbir sebep :tyok. Normal Ypbir bayt kaydeder. <C-R>-Elbette geçiş yapmanız gerekecek . Tipik PPCG kuralları, çünkü herhangi bir makul bir test durumu için, sinir bozucu :t.|solan 99@:, hatta 999@:doğru olurdu, ama bir olsun için iyi bir yol yoktur sonsuz yineleyin bu şekilde. Daha az ilginç kayış kullanmak zorundasın.
udioica

22

MATL , 20 16 bayt

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

Çevrimiçi deneyin! Veya test durumlarını doğrulayın: 1 , 2 , 3 , 4 , 5 .

Bonus

Kademeli olarak küçülen diziyi görmek için değiştirilmiş kod (çevrimdışı derleyici):

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

enter image description here

Veya MATL Online'da deneyin !

açıklama

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'ler harika!
Brain Guider,

20

Haskell, 50 bayt

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

(%)Dizelerin listesini döndüren bir işlevi tanımlar .

açıklama

(%)olarak adlandırılır w%cile, wgirdi dizesi ve varlık ctutmak için karakter. Kısacası, bu tanım ayırarak çalışır wilk karakter (halinde a) ve geri kalanı ( x), bölme xdışında bir karakter ilk durumda cbu bir karakter düştü ile Kendisine yinelemeli ve.

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
Kodu açıklayabilir misin?
bli

1
@bli Yapıldı! Umarım bu yardımcı olur?
dianne

14

Retina , 28 27 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

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

Çevrimiçi deneyin!

açıklama

;{G*1`

Burada çok fazla yapılandırma var. Sahnenin kendisi gerçekten sadece G1`giriş karakterini atarak yalnızca ilk satırı koruyor. *onu kuru çalışmaya çevirir, yani sonuç (dizinin ilk satırı) gerçekte dizeyi değiştirmeden yazdırılır. {Retina'ya, dize değişmeyi durdurana ve ;program sonunda çıktısını önleyene kadar her iki aşamada da bir döngüde çalışmasını söyler .

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

Bu, a) girişin başında olmayan ilk karakteri atar, b) ayrı giriş karakterine eşit değildir.


10

Pip , 22 26 24 22 bayt

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

Dizeyi birinci komut satırı argümanı, karakteri ikinci olarak alır. Çevrimiçi deneyin!

açıklama

Girdi karakterleri üzerinde döngüler; karakter özel karaktere eşitse, bir sonrakine geç; değilse, silin ve dizeyi yazdırın.

Bir ungolfed versiyonu ( a, bkomut_satırı bağımsız değişken almak; odeğeri ile başlar 1, xolduğu ""):

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
 }

Golf püf noktaları:

  • İçin döngü başlığı Lyalnızca bir kez değerlendirilir, bu nedenle ilk baskısını oraya gizleyebiliriz. #Pa-1işe yaramayacak çünkü Pdüşük öncelikli (ayrıştırır #P(a-1)), ama önceden v+#Pabaşlatılmış vdeğişkeni kullanarak yeniden düzenleyebiliriz -1.
  • RA:Operatör yeni değerini verir a, bu yüzden ayrı bir kalmadan bu ifadeyi yazdırabilirsiniz Padeyimi.
  • Şimdi if ifadesinin her iki kolu da tek ifadelidir, bu yüzden üçlü işlecini kullanabiliriz ?.

10

Perl 5, 29 bayt

Strawberry Perl: 35 bayt, 31 bayt, artı 1 -nEyerine -eartı + 3 alan + -ikullandım (tek harfli girdi için kullanılır; daha uzun dize STDIN'dendir).

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

Bununla birlikte, bunun Strawberry kullanarak kendimi test edemesem de, 29 bayt olan, chomp;kullanmadan yapılabileceğinden şüphem yok <<<.

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

Böylece:

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

"Girişte yeni satır yok" ifadesini belirtebilirsiniz (ikinci programın çalışma şekli budur). Girişteki yeni satırları fena halde silmeniz gerekirse, ek bir yeni satır yazdırmak (burada ilgisiz) ve / girdisi satır sonunu kaldırır (çok ilgili) -lolan otomatik bir yeni satır işleme modunu açan seçeneğe bakın . Ayrıca, kullanımdan kaldırılmış durumdadır, ancak ek bir tasarruf baytı için değişmez kontrolü-I ile değiştirebileceğinizi düşünüyorum . Sonunda, bir karakterin daha kısa olacağını düşünüyorum , ancak bunun% 100 olduğundan emin olduğumdan eminim . print-p-n^Is/.\K[^$^I]/redo/eredo

@ ais523, newline tavsiyesi için teşekkürler, ama konuyu yeterince iyi ele aldım galiba. Gerçekten ^Ide, kontrol mektubu değişkenlerinin çoğu için bu doğru, ancak bu değil, IIRC. Re \Kve koyarak redoile değiştirilmesi halinde /esayesinde,! … Şansım olduğunda test edeceğim.
msh210

... ve çalışmıyor. @ ais523
msh210 21:16

8

Perl 6 ,  47 40  38 bayt

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

Expanded:

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

}

Sebebi ...^yerine kullanılmıştır ...olmasıdır &[eq]dönmek olmazdı Trueson değer tekrarlandı kadar.


7

05AB1E ,26 25 bayt

¬ˆ[¦Ð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

Çevrimiçi deneyin!

Lütfen ¬²k0Qyeniden yazılabileceğini unutmayın ¬²Q, ancak bir nedenden dolayı geçerli karakter bir alıntı işareti olduğunda işe yaramaz: Q, bir boole yerine gerçek dizgiyi döndürür ve sonsuz bir döngüye neden olur.

Bu kod ¯J?, kopyalandığından beri daha fazla golf oynayabilir . Bu parçayı döngünün içinde hareket ettirmek kopyalamayı kaldırır ve aynı zamanda kapanış köşeli parantezin düşmesine de izin verir.


DˆćUΔD²KRнõ.;DXìˆ}¯¨»21 için, ancak bu yeni komutları kullanıyor.
Magic Octopus Urn,

7

Python 2, 71 66 bayt:

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

Tam bir program. STDIN üzerinden 2 giriş alır '<String>','<Char>'.

Ayrıca, şu anda 140 byte'da yinelemeli bir çözüm :

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)

Bu formatta çağrılmalıdır print(Q('<String>','<Char>')).


Piton meraklısı değilim ama bu sadece bir satır yazdırılmamalı mı?
Conor O'Brien

@ ConorO'Brien Evet, daha önce yazıyı yanlış okudum. Şimdi düzeltildi.
R. Kap

7

Python 3 , 72 bayt

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

Çevrimiçi deneyin!

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

Diyete başla:

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

6

JavaScript (ES6), 74 bayt

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

Bunun için yanlış çıktı f('test cases', 's')( stssyerine biten) ürettiğini düşünüyorum tsss. Bunun sebebi replace, ilk oluşumu ortadan kaldırması ve böylece dördüncü yinelemede ikinciyi tdeğil ilkini kaldırmasıdır .tmap
Saat

@ Lmis Bunu gösterdiğin için teşekkürler, "sadece" 7 baytlık bir ceza için sürümlerimden birini tamir edebildiğimi düşünüyorum.
Neil

5

Ruby, 148 139 97 90 83 77 62 bayt

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

Amatör kodun bu değişimde kabul edildiğinden emin değilim, ancak golf kodunu öğrenmekle ilgileniyorum ancak bu konuda çok kötü olsam da, bu programın burada diğerleri kadar küçük görünmesine nasıl yardım edebileceğim konusunda herhangi bir yardım var mı?

DÜZENLE:

P ile değiştirilen kotar

Buğday Sihirbazı sayesinde bir ton boşluk bırakıldı ve doğru şekilde bayt sayıldı

Challenger5 sayesinde gitti s=gets.chop;c=gets.chop;etmeks,c=gets.chop,gets.chop;

değiştirilir thenile ;ve gets.chopile gets[0]teşekkür Mhutter!

Girdiyi komut satırı değişkenleri olarak almak, örn. prog.rb helloworld l

Jeroenvisser101 değiştirmeyle ilgili çok sayıda iyileştirme sayesinde a=s.dup ile yapılan büyük iyileştirme ile s=""+aönceki if ifadesi if s[i]!=c;s[i]="";p s;else i+=1;endsayesinde (d!=c)?(s[i]="";p s):i+=1;!


Siteye Hoşgeldiniz! Ruby golf alanında uzman değilim, ancak fazladan boşlukunuz var gibi görünüyor. Özellikle =s. Daha kapsamlı ipuçları için ipuçları sayfamızı ziyaret edebilirsiniz .
Sriotchilism O'Zaic

Baytları temizlemenin en kolay yolu, örneğin fazla boşlukları ortadan kaldırmaktır s=gets.chomp. Bunu Ruby'de yapıp yapamayacağınızdan emin değilim, ancak Python gibi bazı dillerde çoklu atamaları tek bir ifadede birleştirebilirsiniz a,b,c=0,1,2.
Esolanging Fruit

Hey, boşluk hakkındaki ipucu için ruby ​​belgelerini okuyun ve noktalı virgüllerin ifadeleri bitirme yerine değiştirmelerini sağlayın: ') s = gets.chop ve c = gets.chop yapmak için s, c = gets.chop veya başka bir şey yapmak için Öyle ki maalesef kesinlikle kodun en büyük kısmını oluşturuyorlar ve bu uzun ifadeyi kaldırmak istiyorum ..
Ben Hili

Hala özellikle anahtar kelimeler önce bazı fazladan boşluklar var ( do, thenve end) ve dördüncü çevresinde =.
Sriotchilism O'Zaic

Bayt sayısında kendinizi kısa değiştiriyor gibisiniz. Sadece 90 bayt kendim sayıyorum.
Sriotchilism O'Zaic

4

c90, 129 125 bayt

boşluklu:

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

boşluk olmadan:

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

ungolfed:

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

Bu, dizenin başlangıcına bir işaretçi alır ve dizenin sonuna ulaşana kadar bu işaretçiyi yineleyerek döngüler. Döngünün içinde ilk karakteri, ardından dizenin başlangıcı ile işaretçi arasında bulduğu ikinci argümanın örneklerini yazdırır. Bundan sonra, dizenin geri kalanını yazdırarak işaretçiyi koyar.

Bu sizeof (int) == sizeof (char *) 'in bulunduğu bir sistemde derlenmelidir. Aksi takdirde +3 bayt.

Bu ilk kez kod golfünü denedim, bu yüzden yapılacak bazı optimizasyonlar olduğuna eminim.


3

Dyalog APL , 27 bayt

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

dışlanan karakter, ilk dizedir.

baskı argümanı; ilk karakterden sonraki iilk olmayanın dizinini bulun ; bulunursa, ikaldırılmış olarak yinelemeli olarak arama yapın


3

Mathematica, 64 bayt

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

Anonim işlev Girdi olarak iki dizge alır ve çıktı olarak dizelerin bir listesini döndürür. Karakterin ilk olmayan örneğini tekrar tekrar kaldırarak çalışır.


Kesinlikle kullanmaya başlayacağım FixedPointList.
ngenis

3

PHP, 88 84 86 85 82 81 78 bayt

@IsmaelMiguel sayesinde 1 bayt, @ user59178, @ user59178 ilham alan 3 bayt sayesinde 3 bayt

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

komut satırı argümanlarından girdi alır; koşmakphp -r <code> '<string>' <character>


  • Örtük bir son baskı için girdiye yeni bir satır ekler.
    Bu, 5 4 baytlık kod ekler , ancak çıktı ve ek bir tasarruf sağlar echo$a;.

1
$argv[1]."\n"olarak yazılabilir"$argv[1]\n"
Ismael Miguel

1
Yeni $bbir satır eklendiğinde, uzunluğu> = 1 olduğu sürece her zaman acımasız olacaktır ""<.
user59178

Atama substr()yerine bir terner kullanarak başka bir baytı kaydedebilirsiniz $b.
user59178

@ user59178 Seni orada gerçekten yakalamadım: substrhem durum hem de sonuç için sonuca ihtiyacım var print; bu yüzden bir yere atamalıyım. Ama sen bana ilham verdin.
Titus,

Demek istediğim, for(;$b=substr($b?:".$argv[1]\n",1);)ama şimdi sahip oldukların daha da iyi.
user59178 21:16

3

05AB1E, 26 24 23 bayt

2 bayt için @Kade teşekkürler!
1 bayt için @Emigna teşekkürler!

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

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!

y²k0Êolabilir y²Êama "karışıklık o kadar.

Bu muhtemelen «iki kez tekrarlandığından daha fazla golf oynayabilir . Daha fazla golf oynamak için herhangi bir öneriniz veya yolunuz varsa lütfen yorum bırakın.


3

Java 10, 155 140 139 124 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

Eski 139 bayt özyinelemeli cevap:

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 sayesinde -1 bayt . (Bir dahaki sefere başkasının gönderisini düzenlemek yerine, lütfen yorum yapın.)

Çevrimiçi deneyin.

Açıklama:

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

Bir karakter [] ile uğraşmamak ve sadece s.charAt () kullanmak çok daha kısa olmaz mıydı?
dpa97 21:16

@ dpa97 Ah, tamamen haklısın. Başlangıçta bir foreach döngüsü kullandım, ancak bunu normal for döngüsü için değiştirdim. Karakter dizisini kaldırmayı unuttum. Teşekkürler.
Kevin Cruijssen

2

C #, 122 117 112 bayt

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

Ungolfed:

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

Bir dizi dizeyi döndürür.


1
Genel koleksiyon değil kullanarak güzel bir numara. Ama son karakter özel karakter değilse, işe yaramaz c. Bu durumda döngü sonsuza dek çalışacak.
paldir

1
@ paldir Woops, haklısın! Beynimi bu sefer açmak, daha iyi (ve daha kısa!) Bir yol buldu.
psikopat

2 bayttan tasarruf etmek için for döngüsünün parantezini kaldırabilirsiniz.
PmanAce

@PmanAce Üzgünüz, ne demek istiyorsun? Hangi parantez?
psiko

public IEnumerable F (string s, char c) {((int i = 0; i <s.Length; ++ i) için (i <1 || s [i]! = c) verimi i> 0 döndürür mü? s = s.Remove (i--, 1): s; }
PmanAce

2

TSQL, 127 bayt (değişken tanımları hariç)

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

biçimlendirilmiş:

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

İyi kullanımı patindex, ancak alphabetörnek pek doğru görünmüyor, aaphabetaşağı doğru gösteriyor aaa. Ayrıca, büyük / küçük harfe duyarlı bir harmanlama ile bir sunucuda veya veritabanında çalıştırılmalı, aksi takdirde upperCASEörnek ueE, son satırında görüntülenmeden başarısız olur .
BradC

2

C #, 135 138 :( 137 bayt

golfed:

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

Ungolfed:

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

İşlev, dizelerin toplanmasını döndürür.

EDIT1: @psycho, algoritmanın doğru bir şekilde uygulanmadığını fark etti.

EDIT2: için yaratılan değişken s.Length. @TheLethalCoder sayesinde bir bayt kaydedildi.


1
Giriş karakteri bir defada bir kereden fazla mevcutsa işe yaramaz. Ör: yerine codeegolf everecekti . cecee
psiko

@ psycho ifile değiştim whileve işe yarıyor.
paldir

Daha iyi ! Ancak daha kısa olabilir. Kendim gönderirim!
psiko

1
s.LengthBir bayt kaydetmek için bir değişken oluşturun :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 Bayt

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

Ve bir 76 bayt özyinelemeli çözümü, firt seferkinden daha uzun olmasına rağmen, sanki daha iyi böyle çünkü:

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

Raket 194 bayt

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

Ungolfed:

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

Test yapmak:

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

Çıktı:

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

Yeni satırlarla tek bir dize döndürme

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>


İki argüman almaz, bir argüman alır ve daha sonra ikinci argümanı vermeniz gereken başka bir işlevi döndürür. Beklenen davranış bu olduğundan emin değilim.
MT0

@ MT0 Garip ama 1 bayt kaydettiği için 2 argümanlı bir fonksiyon için kabul edildi. Bir tane bulduğumda size bir referans vereceğim. İşte meta.codegolf.stackexchange.com/a/8427/21348
edc65 21:16

Harika bir teknik, üçüncü argümanı değiştirmenin .mapbirikimli olduğunu bilmiyordum . Gördüm .map().filter()ve "Bu büyük bir dizi anlama yapacak!", Ama dizi comprehensions içinde endeks eksikliği öldürdüler ve o aynı uzun uzadıya sona erdi: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](. Btw Bunları hepsi için 68 byte)
ETHproductions

1
Aslında, ([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
paragrafları

@ETHproductionste yine byte sayımda yanlış olduğuma inanamıyor . Her neyse, beni tekrar düşündürdüğüm için teşekkürler, bu yüzden 64: ES6
edc65 23-26

2

Swift 3 - 151 147 bayt

Swift, özellikle dizginin indekslenmesiyle ilgili olduğunda golf oynamak için ideal bir dil değildir. Yapabileceğim en iyisi bu:

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

Ne yazık ki, Swift'in etrafında boşluklar gerekiyor !=(bunun için değil ==) ve Swift 3 ++operatörü düşürdü . Bunların her ikisi için trick tamsayı indeksleme sağlayan bir karakter dizisine dönüştürmek için, bir karakter dizisi interpolasyon kullanarak bir geri dönüştürmek için String( "\(c)").

Ungolfed:

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

Önceki, özyinelemeli olmayan çözüm

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'ye Hoşgeldiniz! Kodun sonuna doğru boşlukların bir kısmı kaldırılabilir mi?
ETHProductions

@ETHProductions ne yazık ki, üçlü operatör ve whilederlemek için gerekli boşluklar. Ayrıca typealiasing ile Stringve printbir kapanmaya ayarlamaya çalışırken de oynadım , ancak yer tasarrufu sağlamadılar.
rabidaudio

2

Pyke, 26 19 17 bayt

jljjhF3<Q/Q*jih>s

Burada dene!

                  - Q = input
j                 - j = input_2
 ljjhF3           - for (i, j, j[0]) for i in range(len(j))
       <          -     j[:i]
        Q/        -    ^.count(Q)
          Q*      -   ^*Q
                s -  sum(j[0], ^, V)
            jih>  -   j[i+1:]

Bir açıklama ekler misiniz?
Esolanging Fruit

@ Challenger5 2 bayt golf oynadı!
Blue

1

Mathematica, 78 bayt

Kahretsin Martin Ender, neredeyse ilk ben oldum: p

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

Adsız işlev; bir Whiledöngü ve birkaç geçici değişken ile basit uygulama .


Hadi ama, biz de Mathematica şart olmadığını biliyoruz
LegionMammal978

1
<beyaz bayraklı dalgalar>
Greg Martin

1

JavaScript ES6, 89 bayt

Bunun kolay bir meydan okuma olacağını düşünmüştüm, ancak burada bir şeyleri özlediğimden eminim ..

Özyineleme kullanır ve bir dizi dizge döndürür

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.