Buat program "Ceeeeeeee"


95

Suatu kali saya menulis sebuah program JavaScript yang akan mengambil string dan karakter sebagai input dan akan menghapus semua karakter kecuali yang pertama dan karakter yang diberikan sebagai input, satu per satu.

Misalnya, menghitung ini dengan input codegolf.stackexchange.comdan euntuk hasil karakter:

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

Itu membuat karakter pertama dan semua es. Semua karakter lain dihapus satu per satu.

Tugas Anda adalah menulis program (atau fungsi) yang mengambil dua input dan output (atau mengembalikan) string yang menyelesaikan efek ini.

Spesifikasi

  • Anda dapat mengasumsikan bahwa string tidak akan mengandung baris baru.
  • Input kedua akan selalu menjadi satu karakter.
  • Jika jawabannya adalah dalam bentuk fungsi, Anda dapat mengembalikan array string yang berisi setiap baris dalam output.
  • Outputnya dapat berisi baris tambahan.

Uji Kasus

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

Ini adalah , jadi kode terpendek (dalam byte) menang.


27
Agak acak, tapi +1
TuxCrafting

25
+1 untukMeeeeeeeeegram
FlipTack

Dalam hal mengembalikan array, apakah masing-masing elemen harus menyertakan baris baru tambahan?
Brad Gilbert b2gills

@ BradGilbertb2gills No.
Buah Esolanging

4
Meeeeeeeeeeeeem
Mathime

Jawaban:


5

V , 12 byte

òYpó.“„a]òd

Cobalah online!

Hexdump:

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

Saya telah menguji ini dengan versi V terbaru yang tersedia sebelum tantangan , dan semuanya berjalan dengan benar, membuat jawaban ini bersaing.

Penjelasan:

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

Regex terkompresi diterjemahkan menjadi

.\zs[^e]

Yang berarti

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

Versi tidak bersaing (11 byte)

Versi ini menggunakan pintasan untuk Ypitu tidak tersedia ketika tantangan ini diposting.


@ challenger5 Luar Biasa! Saya akan memeriksa versi lama dan memverifikasi apakah itu berfungsi dengan benar. Saya mungkin harus memodifikasinya sedikit. Saya akan menelepon Anda setelah saya memperbarui.
DJMcMayhem

@ Challenger5 Saya telah mengedit jawaban, dan memverifikasi bahwa versi ini berfungsi ketika tantangan diposting.
DJMcMayhem

Bagaimana saya menjalankan banyak perintah Vim yang disimpan dalam file di sistem Linux? Apakah saya cat filename | vimatau saya akan melakukan sesuatu yang lain?
ckjbgames

31

Vim, 27, 26 , 25 byte

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

Cobalah online!

Masukan datang dalam format ini:

e
codegolf.stackexchange.com

Pendekatan pertama saya yang naif adalah tiga byte lebih lama:

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

Saya juga senang dengan jawaban ini karena ini dimulai dengan nama saya.

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

Lihat kesamaannya? Eh?

Pendekatan yang kurang berhasil:

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

Penjelasan:

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
Saya pikir Anda mendapat kesalahan ketik di sana di mana input yang diberikan ada kterlalu banyak :)
geisterfurz007

@ geisterfurz007 Saya tidak yakin apakah saya mengerti maksud Anda?
DJMcMayhem

Dikatakan (...)comkdalam baris 5 saat ini.
geisterfurz007

Tidak ada alasan untuk menggunakannya di :tsini. Normal Ypakan menghemat satu byte. Anda harus beralih ke <C-R>-tentu saja. Aturan PPCG yang khas membuat frustrasi, karena untuk setiap kasus uji yang masuk akal, :t.|sdengan 99@:atau bahkan 999@:akan benar, tetapi tidak ada cara yang baik untuk mendapatkan pengulangan yang tidak terbatas dengan cara itu. Anda terpaksa menggunakan strategi yang kurang menarik.
udioica

22

MATL , 20 16 byte

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

Cobalah online! Atau verifikasi kasus uji: 1 , 2 , 3 , 4 , 5 .

Bonus

Kode yang dimodifikasi untuk melihat string secara bertahap menyusut (kompiler offline):

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

masukkan deskripsi gambar di sini

Atau coba di MATL Online!

Penjelasan

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
HADIAH! gif itu keren!
Brain Guider

20

Haskell, 50 byte

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

Menentukan fungsi yang (%)mengembalikan daftar string.

Penjelasan

(%)disebut sebagai w%c, dengan wmenjadi string input, dan ckarakter untuk disimpan. Singkatnya, definisi ini berfungsi dengan memisahkan wke dalam karakter pertama ( a) dan sisanya ( x), membelah xpada kemunculan pertama karakter selain c, dan secara rekursif menyebut dirinya sendiri dengan satu karakter jatuh.

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
Bisakah Anda menjelaskan kodenya?
bli

1
@bli Selesai! Semoga ini bisa membantu?
dianne

14

Retina , 28 27 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Cobalah online!

Penjelasan

;{G*1`

Ada banyak konfigurasi di sini. Panggung itu sendiri benar-benar adil G1`, yang hanya menyimpan baris pertama, membuang karakter input. *mengubahnya menjadi run kering, yang berarti bahwa hasilnya (yaitu baris pertama dari string) dicetak tanpa benar-benar mengubah string. {memberitahu Retina untuk menjalankan kedua tahap dalam satu lingkaran sampai string berhenti berubah dan ;mencegah output di akhir program.

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

Ini membuang karakter pertama yang a) tidak di awal input, b) tidak sama dengan karakter input yang terpisah.


10

Pip , 22 26 24 22 byte

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

Mengambil string sebagai argumen baris perintah pertama, karakter sebagai yang kedua. Cobalah online!

Penjelasan

Putaran karakter input; jika karakter sama dengan karakter khusus, pindah ke yang berikutnya; jika tidak, hapus dan cetak string.

Versi ungolfed ( a, bdapatkan cmdline args; odimulai dengan nilai 1, xis ""):

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
 }

Trik golf:

  • Header loop untuk Lhanya dievaluasi sekali, jadi kita dapat menyelinap mencetak awal di sana. #Pa-1tidak akan berfungsi karena Pdiutamakan rendah (akan diuraikan sebagai #P(a-1)), tetapi kita dapat mengaturnya kembali v+#Pa, menggunakan vvariabel yang diinisialisasi sebelumnya ke-1 .
  • The RA:Operator mengembalikan nilai baru a, sehingga kami dapat mencetak ekspresi yang bukan memiliki terpisah Papernyataan.
  • Sekarang kedua cabang pernyataan if adalah ekspresi tunggal, jadi kita bisa menggunakan operator ternary ?.

10

Perl 5, 29 byte

Saya mendapat 35 byte menggunakan Strawberry Perl: 31 byte, plus 1 untuk -nEbukannya -e, ditambah 3 untuk ruang + -i(digunakan untuk input huruf tunggal; string yang lebih panjang adalah dari STDIN).

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

Namun, saya yakin ini bisa dilakukan tanpa chomp;menggunakan <<<, yaitu 29 byte, meskipun saya tidak bisa mengujinya sendiri menggunakan Strawberry.

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

Jadi:

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

Anda cukup menentukan "tidak ada baris baru di input" (yang merupakan cara kerja program kedua). Jika Anda sangat perlu menghapus baris baru di input, lihat ke -lopsi, yang mengaktifkan mode penanganan baris baru otomatis di mana printmencetak baris baru tambahan (tidak relevan di sini) dan -p/ -ninput menghapus baris baru (sangat relevan). Juga, sudah usang, tapi saya pikir Anda bisa mengganti ^Idengan kontrol literal-I untuk byte penghematan tambahan. Akhirnya, saya pikir s/.\K[^$^I]/redo/eakan menjadi satu karakter lebih pendek, meskipun saya tidak 100% yakin itu adalah tempat yang legal untuk menempatkan redo.

@ ais523, terima kasih atas saran baris baru, tapi saya kira saya sudah menangani masalah dengan cukup baik. Sebenarnya ^I, itu berlaku untuk sebagian besar variabel huruf kontrol, tetapi tidak yang ini, IIRC. Kembali \Kdan masukkan redopengganti /e, terima kasih! Saya akan mengujinya ketika saya memiliki kesempatan untuk ....
msh210

... dan itu tidak berhasil. @ ais523
msh210

8

Perl 6 ,  47 40  38 byte

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

Diperluas:

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

}

Alasannya ...^digunakan sebagai gantinya ...adalah bahwa &[eq]tidak akan kembali Truesampai nilai terakhir diulang.


7

05AB1E ,26 25 byte

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

Cobalah online!

Harap dicatat bahwa ¬²k0Qdapat ditulis ulang ¬²Q, tetapi karena alasan tertentu itu tidak berfungsi ketika karakter saat ini adalah tanda kutip: Q mengembalikan string aktual daripada boolean dan itu menyebabkan loop tak terbatas.

Kode ini dapat digulirkan lebih jauh karena ¯J?diduplikasi. Memindahkan bagian ini dalam loop akan menghapus duplikasi dan juga memungkinkan untuk menjatuhkan braket persegi penutup.


DˆćUΔD²KRнõ.;DXìˆ}¯¨»untuk 21, tetapi itu menggunakan perintah baru.
Magic Gurita Guci

7

Python 2, 71 66 byte:

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

Program lengkap. Membawa 2 input melalui STDIN dalam format '<String>','<Char>'.

Juga, berikut ini adalah solusi rekursif yang saat ini mencapai 140 byte :

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)

Yang ini harus disebut dalam format print(Q('<String>','<Char>')).


Saya bukan penggemar python, tetapi tidakkah ini hanya mencetak satu baris?
Conor O'Brien

@ ConorO'Brien Ya, saya salah membaca posting sebelumnya. Sudah diperbaiki sekarang.
R. Kap

7

Python 3 , 72 byte

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

Cobalah online!

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

Menjalani diet:

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

6

JavaScript (ES6), 74 byte

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

Saya pikir ini menghasilkan output yang salah untuk f('test cases', 's')(diakhiri dengan stss, bukan tsss). Saya pikir ini karena replacemenghilangkan kejadian pertama sehingga menghilangkan yang pertama tdaripada yang kedua tdalam iterasi keempat dari maploop.
Lmis

@Lmis Terima kasih telah menunjukkan itu, saya pikir saya dapat memperbaiki salah satu versi saya untuk "hanya" penalti 7 byte.
Neil

5

Ruby, 148 139 97 90 83 77 62 byte

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

Tidak yakin apakah kode amatir diterima di bursa ini, tetapi saya tertarik untuk belajar kode golf walaupun saya buruk dalam hal itu, ada bantuan tentang bagaimana saya membuat program ini tampak sekecil yang lain di sini?

SUNTING:

Ganti menempatkan dengan p

Menghapus satu ton spasi dan menghitung byte dengan benar berkat Wheat Wizard

Berkat penantang5 beralih dari s=gets.chop;c=gets.chop;kes,c=gets.chop,gets.chop;

diganti thendengan ;dan gets.chopdengan gets[0]terima kasih Mhutter!

Mengambil input sebagai variabel baris perintah sekarang, mis. prog.rb helloworld l

Terima kasih banyak perbaikan oleh penggantian jeroenvisser101 a=s.dupdengan s=""+adan jika sebelumnya if s[i]!=c;s[i]="";p s;else i+=1;enddengan (d!=c)?(s[i]="";p s):i+=1;perbaikan besar!


Selamat datang di situs ini! Saya bukan ahli golf Ruby, tetapi sepertinya Anda memiliki ruang kosong ekstra. Khususnya di sekitar =s. Untuk tips yang lebih komprehensif, Anda dapat mengunjungi halaman tips kami .
Wheat Wizard

Cara termudah untuk menghapus byte adalah dengan menghilangkan spasi kosong, misalnya s=gets.chomp. Saya tidak yakin apakah Anda bisa melakukan ini di Ruby tetapi dalam beberapa bahasa seperti Python Anda dapat menggabungkan beberapa tugas menjadi satu pernyataan, seperti a,b,c=0,1,2.
Buah Esolanging

Hai, terima kasih atas tip tentang spasi putih, baca dokumentasi ruby ​​dan titik koma yang direalisasikan dapat menggantikannya untuk mengakhiri pernyataan: ') seperti untuk membuat s = gets.chop dan c = gets.chop i cant do s, c = gets.chop atau apa pun seperti itu sayangnya mereka jelas-jelas bagian terbesar dari kode dan saya ingin menghapus pernyataan panjang itu ..
Ben Hili

Anda masih memiliki beberapa ruang ekstra terutama sebelum kata kunci ( do,then dan end), dan sekitar keempat =.
Wheat Wizard

Sepertinya Anda pendek mengubah diri sendiri pada jumlah byte. Saya hanya menghitung 90 byte sendiri.
Wheat Wizard

4

c90, 129 125 byte

dengan spasi putih:

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

tanpa spasi putih:

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

Ini membutuhkan pointer ke awal string, dan loop, iterasi pointer ini hingga mencapai akhir string. Di dalam loop, ia mencetak karakter pertama, kemudian setiap contoh argumen kedua yang ditemukan antara awal string dan pointer. Setelah ini, ia memanggil menempatkan pointer, mencetak sisa string.

Ini harus dikompilasi pada sistem di mana sizeof (int) == sizeof (char *). +3 byte jika tidak.

Ini adalah pertama kalinya saya mencoba kode golf di sini, jadi saya yakin ada beberapa optimasi yang dilakukan.


3

Dyalog APL , 27 byte

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

adalah karakter yang dikecualikan, adalah string awal

argumen cetak; cari indeks inon-pertama setelah char pertama; jika ditemukan, panggil secara rekursif dengan idihapus


3

Mathematica, 64 byte

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

Fungsi anonim. Mengambil dua string sebagai input, dan mengembalikan daftar string sebagai output. Berfungsi dengan berulang kali menghapus karakter non-instance pertama.


Saya pasti akan mulai menggunakan FixedPointList.
ngenisis

3

PHP, 88 84 86 85 82 81 78 byte

1 byte disimpan berkat @IsmaelMiguel, 3 byte terima kasih ke @ user59178, 3 byte terinspirasi oleh @ user59178

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

mengambil input dari argumen baris perintah; jalankan bersamaphp -r <code> '<string>' <character>


  • menambahkan baris baru ke input untuk cetakan akhir implisit.
    Itu menambahkan 5 4 byte kode, tetapi menghemat output dan tambahan echo$a;.

1
$argv[1]."\n"dapat ditulis sebagai"$argv[1]\n"
Ismael Miguel

1
Ketika $bmendapat baris baru ditambahkan ke itu, ia akan selalu dengan kebenaran selama itu memiliki panjang> = 1. Karena ""<itu tidak perlu.
user59178

Anda dapat menyimpan byte lain dengan menggunakan terner di substr()daripada menugaskan $b.
user59178

@ user59178 Saya tidak benar-benar menangkap Anda di sana: Saya butuh substrhasil untuk kondisi dan print; jadi saya harus menempatkannya di suatu tempat. Tapi Engkau mengilhami saya.
Titus

Maksud saya for(;$b=substr($b?:".$argv[1]\n",1);)tetapi apa yang Anda miliki sekarang bahkan lebih baik.
user59178

3

05AB1E, 26 24 23 byte

Terima kasih @Kade untuk 2 byte!
Terima kasih @Emigna untuk 1 byte!

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

Menggunakan pengkodean CP-1252 . Cobalah online!

y²k0Ê bisa jadi y²Ê tetapi "kekacauan itu.

Ini mungkin bisa golf lebih karena «diulang dua kali. Silakan tinggalkan komentar jika Anda memiliki saran atau cara untuk menurunkannya.


3

Java 10, 155 140 139 124 byte

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

Cobalah online.

Penjelasan:

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

Jawaban rekursif 139 byte yang lama:

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

-1 byte terima kasih kepada @Eugene . (Lain kali, buat komentar alih-alih mengedit posting orang lain.)

Cobalah online.

Penjelasan:

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

Bukankah lebih pendek untuk tidak repot dengan char [], dan cukup gunakan s.charAt ()?
dpa97

@ dpa97 Ah, Anda sepenuhnya benar. Saya menggunakan foreach loop pada awalnya, tetapi mengubahnya menjadi for-loop reguler. Lupa untuk menghapus char-array. Terima kasih.
Kevin Cruijssen

2

C #, 122 117 112 byte

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

Tidak Disatukan:

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

Mengembalikan koleksi string.


1
Trik yang bagus dengan menggunakan bukan koleksi generik. Tapi itu tidak akan berhasil, jika char terakhir bukan char spesial c. Dalam hal ini loop akan mencoba bekerja selamanya.
paldir

1
@paldir Woops, kau benar! Mengaktifkan otak saya saat ini, menemukan cara yang lebih baik (dan lebih pendek!).
psiko

Anda bisa menghapus tanda kurung for loop untuk menyimpan 2 byte.
PmanAce

@PmanAce Maaf, apa maksudmu? Kurung yang mana?
psiko

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

2

TSQL, 127 byte (Tidak termasuk definisi variabel)

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

Diformat:

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

Baik digunakan patindex, tetapi alphabetcontohnya tampaknya tidak benar, itu ditampilkan aaphabetmelalui aaa. Juga patut disebutkan bahwa ini harus dijalankan pada server atau database dengan susunan case-sensitive, jika tidak upperCASEcontohnya juga gagal, ditampilkan ueEpada baris terakhir.
BradC

2

C #, 135 138 :( 137 byte

Golf:

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

Tidak Disatukan:

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

Fungsi mengembalikan koleksi string.

EDIT1: @psycho memperhatikan bahwa algoritma tidak diterapkan dengan benar.

EDIT2: Dibuat variabel untuk s.Length. Satu byte disimpan berkat @TheLethalCoder.


1
Tidak akan berfungsi jika karakter input hadir lebih dari satu kali berturut-turut. Mis: codeegolf eakan memberi cealih-alih cee.
psiko

@psycho saya bertukar ifdengan whiledan berfungsi.
paldir

Lebih baik! Tetapi bisa lebih pendek. Saya akan memposting sendiri!
psiko

1
Buat variabel untuk s.Lengthmenyimpan satu byte: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 Bytes

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

Dan solusi rekursif 76 Bytes , karena meskipun lebih lama daripada yang pertama, saya agak suka lebih baik:

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

Racket 194 byte

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

Tidak Disatukan:

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

Pengujian:

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

Keluaran:

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

Mengembalikan string tunggal dengan baris baru

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>


Agak aneh karena tidak perlu dua argumen, tetapi satu argumen dan kemudian mengembalikan fungsi lain di mana Anda perlu memberikan argumen kedua. Saya tidak yakin ini perilaku yang diharapkan.
MT0

@ MT0 Saya aneh tapi diterima untuk fungsi dengan 2 argumen, karena menghemat 1 byte. Saya akan memberi Anda referensi ketika saya menemukannya. Ini dia meta.codegolf.stackexchange.com/a/8427/21348
edc65

Teknik hebat, saya tidak menyadari bahwa memodifikasi argumen ketiga .mapadalah kumulatif. Saya melihat .map().filter()dan berpikir "Ini akan membuat pemahaman array yang hebat!", Tetapi kurangnya indeks dalam pemahaman array membunuhnya dan berakhir pada panjang yang sama: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](btw, saya menghitung 68 byte untuk semua ini.)
ETHproductions

1
Sebenarnya, dengan mengatur ulang params Anda bisa mendapatkan pemahaman array ke 66:([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
ETHproduksi

@ ETHproductions tidak percaya saya salah dalam hitungan byte lagi . Lagi pula, terima kasih membuat saya berpikir lagi tentang hal itu, jadi saya dapat 64 dengan ES6 standar
edc65

2

Swift 3 - 151 147 bytes

Swift bukanlah bahasa yang ideal untuk bermain golf, terutama ketika itu berkaitan dengan pengindeksan string. Ini yang terbaik yang bisa saya lakukan:

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

Sayangnya, Swift membutuhkan ruang di sekitar !=(tetapi tidak untuk ==), dan Swift 3 menjatuhkan ++operator. Trik untuk keduanya adalah untuk mengkonversi ke array karakter yang memungkinkan pengindeksan bilangan bulat, dan menggunakan interpolasi string karakter untuk mengkonversi kembali ke String( "\(c)").

Tidak Disatukan:

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

Sebelumnya, solusi non-rekursif

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

Selamat datang di PPCG! Bisakah beberapa spasi putih di akhir kode dihapus?
ETHproduk

@ ETHproduk sayangnya tidak, operator ternary dan whileruang-ruang kebutuhan untuk dikompilasi. Saya juga bermain dengan typealiasing Stringdan mencoba untuk printmenutup, tetapi mereka tidak menghemat ruang.
rabidaudio

2

Pyke, 26 19 17 byte

jljjhF3<Q/Q*jih>s

Coba di sini!

                  - 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:]

Bisakah Anda menambahkan penjelasan?
Buah Esolanging

@ Challenger5 selesai dan main golf 2 byte!
Biru

1

Mathematica, 78 byte

Sial, Martin Ender, aku hampir menjadi yang pertama: hlm

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

Fungsi yang tidak disebutkan namanya; implementasi langsung dengan Whileloop dan beberapa variabel sementara.


Oh, ayolah, kita berdua tahu bahwa Mathematica tidak penting
LegionMammal978

1
<mengibarkan bendera putih>
Greg Martin

1

JavaScript ES6, 89 byte

Saya pikir ini akan menjadi tantangan yang mudah, tapi saya cukup yakin saya melewatkan sesuatu di sini ..

Menggunakan rekursi dan mengembalikan array string

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.