Thực hiện một chương trình Ceeeeeeee trực tiếp


95

Khi tôi đã viết một chương trình JavaScript sẽ lấy đầu vào là một chuỗi và một ký tự và sẽ xóa tất cả các ký tự ngoại trừ ký tự đầu tiên và ký tự được cung cấp làm đầu vào, từng cái một.

Ví dụ, tính toán điều này với đầu vào codegolf.stackexchange.comecho năng suất ký tự:

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

Nó giữ ký tự đầu tiên và tất cả es. Tất cả các nhân vật khác được loại bỏ từng cái một.

Nhiệm vụ của bạn là viết một chương trình (hoặc hàm) có hai đầu vào và đầu ra (hoặc trả về) một chuỗi thực hiện hiệu ứng này.

Thông số kỹ thuật

  • Bạn có thể giả định rằng chuỗi sẽ không chứa bất kỳ dòng mới nào.
  • Đầu vào thứ hai sẽ luôn là một ký tự.
  • Nếu câu trả lời ở dạng hàm, bạn có thể trả về một chuỗi các chuỗi chứa mỗi dòng trong đầu ra.
  • Đầu ra có thể chứa một dòng mới.

Các trường hợp thử nghiệm

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

Đây là , vì vậy mã ngắn nhất (tính bằng byte) sẽ thắng.


27
Loại ngẫu nhiên, nhưng +1
Thiền từ

25
+1 choMeeeeeeeeegram
FlipTack

Trong trường hợp nó trả về một mảng, mỗi phần tử có phải bao gồm một dòng mới không?
Brad Gilbert b2gills

@ BradGilbertb2gills Số
Esolanging Fruit

4
Meeeeeeeeeeeeem
Mathime

Câu trả lời:


5

V , 12 byte

òYpó.“„a]òd

Hãy thử trực tuyến!

Hexdump:

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

Tôi đã thử nghiệm điều này với phiên bản V mới nhất có sẵn trước thử thách và mọi thứ chạy chính xác, khiến câu trả lời này trở nên cạnh tranh.

Giải trình:

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

Regex nén dịch thành

.\zs[^e]

Nghĩa là

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

Phiên bản không cạnh tranh (11 byte)

Phiên bản này sử dụng lối tắt Ypkhông khả dụng khi thử thách này được đăng.


@ thách thức5 Tuyệt vời! Tôi sẽ kiểm tra một phiên bản cũ và xác minh rằng nó hoạt động chính xác. Tôi có thể phải sửa đổi nó một chút. Tôi sẽ ping bạn sau khi tôi cập nhật.
DJMcMayhem

@ Challenger5 Tôi đã chỉnh sửa câu trả lời và xác minh rằng phiên bản này đã hoạt động khi thử thách được đăng.
DJMcMayhem

Làm cách nào để tôi thực thi một loạt các lệnh Vim được lưu trữ trong một tệp trên hệ thống Linux? Tôi sẽ cat filename | vimhoặc tôi sẽ làm một cái gì đó khác?
ckjbgames

31

Vim, 27, 26 , 25 byte

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

Hãy thử trực tuyến!

Đầu vào có định dạng này:

e
codegolf.stackexchange.com

Cách tiếp cận đầu tiên ngây thơ của tôi dài hơn ba byte:

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

Tôi cũng hài lòng với câu trả lời này vì nó bắt đầu bằng tên của tôi.

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

Thấy sự giống nhau không? Hở?

Cách tiếp cận ít thành công hơn:

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

Giải trình:

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
Tôi nghĩ rằng bạn có một lỗi đánh máy ở đó đầu vào được đưa ra có kquá nhiều :)
geisterfurz007

@ geisterfurz007 Tôi không chắc là tôi hiểu ý bạn chứ?
DJMcMayhem

Nó nói (...)comkTrong dòng 5 hiện tại.
geisterfurz007

Không có lý do để sử dụng :tở đây. Bình thường Ypsẽ tiết kiệm một byte. Tất nhiên bạn sẽ phải chuyển sang <C-R>-. Các quy tắc PPCG điển hình gây khó chịu, bởi vì đối với bất kỳ trường hợp thử nghiệm hợp lý nào, :t.|s99@:hoặc thậm chí 999@:sẽ chính xác, nhưng không có cách nào tốt để có được lặp lại vô hạn theo cách đó. Bạn bị buộc phải sử dụng chiến thuật ít thú vị hơn.
udioica

22

MATL , 20 16 byte

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

Hãy thử trực tuyến! Hoặc xác minh các trường hợp kiểm tra: 1 , 2 , 3 , 4 , 5 .

Thêm

Mã được sửa đổi để xem chuỗi bị thu hẹp dần (trình biên dịch ngoại tuyến):

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

nhập mô tả hình ảnh ở đây

Hoặc dùng thử tại MATL Online!

Giải trình

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
QUÀ TẶNG! gifs thật tuyệt!
Brain Guider

20

Haskell, 50 byte

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

Xác định hàm (%)trả về danh sách các chuỗi.

Giải trình

(%)được gọi là w%c, với wchuỗi đầu vào và cký tự cần giữ. Nói tóm lại, định nghĩa này hoạt động bằng cách tách wthành ký tự đầu tiên ( a) và phần còn lại ( x), tách ra xở lần xuất hiện đầu tiên của một ký tự khác c, và gọi đệ quy chính nó với một ký tự bị bỏ.

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
Bạn có thể giải thích mã?
bli

1
@bli Xong rồi! Hy vọng điều này sẽ giúp?
dianne

14

Võng mạc , 28 27 byte

Số lượng byte giả định mã hóa ISO 8859-1.

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

Hãy thử trực tuyến!

Giải trình

;{G*1`

Có rất nhiều cấu hình ở đây. Bản thân sân khấu thực sự là công bằng G1`, chỉ giữ dòng đầu tiên, loại bỏ ký tự đầu vào. *biến nó thành một hoạt động khô, có nghĩa là kết quả (tức là dòng đầu tiên của chuỗi) được in mà không thực sự thay đổi chuỗi. {yêu cầu Retina chạy cả hai giai đoạn trong một vòng lặp cho đến khi chuỗi ngừng thay đổi và ;ngăn đầu ra ở cuối chương trình.

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

Điều này loại bỏ ký tự đầu tiên mà a) không ở đầu đầu vào, b) không bằng ký tự đầu vào riêng biệt.


10

Pip , 22 26 24 22 byte

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

Lấy chuỗi làm đối số dòng lệnh đầu tiên, ký tự là thứ hai. Hãy thử trực tuyến!

Giải trình

Vòng lặp trên các ký tự đầu vào; nếu nhân vật bằng ký tự đặc biệt, chuyển sang nhân vật tiếp theo; nếu không, xóa nó và in chuỗi.

Một phiên bản ungolfed ( a, bđược args cmdline; obắt đầu với một giá trị 1, x""):

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
 }

Thủ thuật đánh gôn:

  • Tiêu đề vòng lặp cho Lchỉ được đánh giá một lần, vì vậy chúng ta có thể lén in bản in ban đầu ở đó. #Pa-1sẽ không hoạt động vì Pcó độ ưu tiên thấp (nó sẽ phân tích thành #P(a-1)), nhưng chúng ta có thể sắp xếp lại nó v+#Pa, sử dụng vbiến được preinitialized thành -1.
  • Các RA:nhà điều hành sẽ trả về giá trị mới của a, vì vậy chúng tôi có thể in biểu rằng thay vì có một riêng biệt Patuyên bố.
  • Bây giờ cả hai nhánh của câu lệnh if đều là các biểu thức đơn, vì vậy chúng ta có thể sử dụng toán tử ternary ?thay thế.

10

Perl 5, 29 byte

Tôi đã nhận được 35 byte bằng cách sử dụng Strawberry Perl: 31 byte, cộng với 1 -nEthay vì -e, cộng với 3 cho khoảng trắng + -i(được sử dụng cho đầu vào một chữ cái; chuỗi dài hơn là từ STDIN).

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

Tuy nhiên, tôi không nghi ngờ điều này có thể thực hiện được mà không cần chomp;sử dụng <<<, đó là 29 byte, mặc dù tôi không thể tự kiểm tra nó bằng Dâu.

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

Do vậy:

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

Bạn chỉ có thể chỉ định "không có dòng mới trong đầu vào" (đó là cách chương trình thứ hai hoạt động). Nếu bạn rất cần xóa dòng mới trong đầu vào, hãy xem -ltùy chọn, bật chế độ xử lý dòng mới tự động trong đó printin một dòng mới bổ sung (không liên quan ở đây) và -p/ -ninput loại bỏ dòng mới (rất phù hợp). Ngoài ra, nó không được dùng nữa, nhưng tôi nghĩ bạn có thể thay thế ^Ibằng điều khiển theo nghĩa đen-I để có thêm một byte tiết kiệm. Cuối cùng, tôi nghĩ s/.\K[^$^I]/redo/esẽ ngắn hơn một ký tự, mặc dù tôi không chắc chắn 100% đó là nơi hợp pháp để đặt redo.

@ ais523, cảm ơn vì lời khuyên về dòng mới, nhưng tôi đoán tôi đã xử lý vấn đề đủ tốt rồi. Theo nghĩa đen ^I, điều đó đúng với hầu hết các biến của chữ cái điều khiển, nhưng không phải là biến này, IIRC. Re \Kvà đưa redovào thay thế với /e, cảm ơn! Tôi sẽ kiểm tra nó khi tôi có cơ hội để khám phá.
msh210

... Và nó không hoạt động. @ 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]}

Mở rộng:

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

}

Lý do ...^đã được sử dụng thay vì ...&[eq]sẽ không trở lại Truecho đến khi giá trị cuối cùng được lặp lại.


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

Hãy thử trực tuyến!

Xin lưu ý rằng ¬²k0Q có thể được viết lại ¬²Q, nhưng vì một số lý do, nó không hoạt động khi ký tự hiện tại là dấu ngoặc kép: Q trả về chuỗi thực tế thay vì boolean và nó gây ra một vòng lặp vô hạn.

Mã này có thể được đánh gôn hơn nữa vì ¯J?được nhân đôi. Di chuyển phần này trong vòng lặp sẽ loại bỏ sự trùng lặp và cũng sẽ cho phép thả dấu ngoặc vuông đóng.


DˆćUΔD²KRнõ.;DXìˆ}¯¨»cho 21, nhưng sử dụng các lệnh mới.
Bạch tuộc ma thuật Urn

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

Một chương trình đầy đủ. Có 2 đầu vào thông qua STDIN ở định dạng '<String>','<Char>'.

Ngoài ra, đây là một giải pháp đệ quy hiện tại 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)

Điều này nên được gọi trong định dạng print(Q('<String>','<Char>')).


Tôi không có buff trăn, nhưng không nên in chỉ một dòng?
Conor O'Brien

@ ConorO'Brien Vâng, tôi đã đọc sai bài viết trước đây. Bây giờ nó đã được sửa.
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)

Hãy thử trực tuyến!

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

Ăn kiêng:

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

6

JavaScript (ES6), 74 byte

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

Tôi nghĩ rằng điều này tạo ra đầu ra không chính xác cho f('test cases', 's')(kết thúc bằng stss, chứ không phải tsss). Tôi nghĩ rằng điều này là do replaceloại bỏ lần xuất hiện đầu tiên nên nó loại bỏ lần đầu tiên tthay vì lần thứ hai ttrong lần lặp thứ tư của mapvòng lặp.
Lmis

@Lmis Cảm ơn bạn đã chỉ ra điều đó, tôi nghĩ rằng tôi đã có thể sửa một trong những phiên bản của mình vì "chỉ" một hình phạt 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

Không chắc chắn nếu mã nghiệp dư được chấp nhận trên sàn giao dịch này nhưng tôi quan tâm đến việc học mã hóa golf mặc dù tôi rất tệ với nó, có ai giúp tôi làm cho chương trình này trông nhỏ như những người khác ở đây không?

BIÊN TẬP:

Thay thế đặt với p

Đã xóa một tấn khoảng trắng và đếm byte chính xác nhờ Wheat Wizard

Cảm ơn kẻ thách thức5 đã đi từ s=gets.chop;c=gets.chop;đếns,c=gets.chop,gets.chop;

thay thế thenvới ;gets.chopvới gets[0]nhờ Mhutter!

Lấy đầu vào làm biến dòng lệnh bây giờ, ví dụ. prog.rb helloworld l

Nhờ nhiều cải tiến của jeroenvisser101 thay thế a=s.dupbằng s=""+avà tuyên bố if trước đó if s[i]!=c;s[i]="";p s;else i+=1;endvới (d!=c)?(s[i]="";p s):i+=1;sự cải tiến lớn!


Chào mừng đến với trang web! Tôi không phải là một chuyên gia về chơi golf Ruby nhưng có vẻ như bạn có thêm khoảng trắng. Đặc biệt xung quanh =s. Để biết các mẹo toàn diện hơn, bạn có thể truy cập trang mẹo của chúng tôi .
Thuật sĩ lúa mì

Cách dễ nhất để loại bỏ byte là loại bỏ khoảng trắng dư thừa, ví dụ s=gets.chomp. Tôi không chắc liệu bạn có thể làm điều này trong Ruby không nhưng trong một số ngôn ngữ như Python, bạn có thể kết hợp nhiều bài tập thành một câu lệnh, như thế nào a,b,c=0,1,2.
Trái cây Esolanging

Xin cảm ơn vì lời khuyên về khoảng trắng đọc tài liệu ruby ​​và dấu chấm phẩy nhận ra có thể thay thế chúng cho câu lệnh kết thúc: ') như để tạo s = got.chop và c = got.chop tôi không thể làm s, c = got.chop hoặc bất cứ điều gì thật không may, chúng chắc chắn là phần lớn nhất của mã và tôi muốn xóa câu nói dài dòng đó ..
Ben Hili

Bạn vẫn có một số dấu cách thêm đặc biệt trước khi từ khóa ( do, thenend), và xung quanh thứ tư =.
Thuật sĩ lúa mì

Có vẻ như bạn đang thay đổi bản thân về số byte. Tôi chỉ đếm 90 byte cho mình.
Thuật sĩ lúa mì

4

c90, 129 125 byte

với khoảng trắng:

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

không có khoảng trắng:

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

vô dụng:

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

Điều này đưa một con trỏ đến đầu chuỗi và các vòng lặp, lặp lại con trỏ này cho đến khi nó đến cuối chuỗi. Trong vòng lặp, nó in ký tự đầu tiên, sau đó bất kỳ trường hợp nào của đối số thứ hai mà nó tìm thấy giữa điểm bắt đầu của chuỗi và con trỏ. Sau này, nó gọi đặt vào con trỏ, in ra phần còn lại của chuỗi.

Điều này phải được biên dịch trên một hệ thống trong đó sizeof (int) == sizeof (char *). +3 byte nếu không.

Đây là lần đầu tiên tôi thử chơi golf ở đây, vì vậy tôi chắc chắn sẽ có một số tối ưu hóa được thực hiện.


3

APL Dyalog , 27 byte

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

là nhân vật bị loại trừ, là chuỗi ban đầu

đối số in; tìm chỉ số icủa non- sau char đầu tiên; nếu tìm thấy, hãy gọi đệ quy với iloại bỏ


3

Toán học, 64 byte

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

Chức năng ẩn danh. Lấy hai chuỗi làm đầu vào và trả về danh sách các chuỗi làm đầu ra. Hoạt động bằng cách liên tục loại bỏ trường hợp đầu tiên của ký tự.


Tôi chắc chắn sẽ bắt đầu sử dụng FixedPointList.
ngenisis

3

PHP, 88 84 86 85 82 81 78 byte

Lưu 1 byte nhờ @IsmaelMiguel, 3 byte nhờ @ user59178, 3 byte lấy cảm hứng từ @ user59178

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

lấy đầu vào từ các đối số dòng lệnh; chạy vớiphp -r <code> '<string>' <character>


  • nối thêm một dòng mới vào đầu vào cho một bản in cuối cùng ẩn.
    Điều đó thêm 5 4 byte mã, nhưng tiết kiệm đầu ra và bổ sung echo$a;.

1
$argv[1]."\n"có thể được viết là"$argv[1]\n"
Ismael Miguel

1
Khi $bcó một dòng mới được thêm vào, nó sẽ luôn luôn trung thực miễn là nó có độ dài> = 1. Như vậy ""<là không cần thiết.
dùng59178

Bạn có thể lưu một byte khác bằng cách sử dụng một ternary trong substr()thay vì gán $b.
dùng59178

@ user59178 Tôi đã thực sự bắt bạn ở đó: Tôi cần substrkết quả cho cả điều kiện và điều kiện print; vì vậy tôi nên chỉ định nó ở đâu đó Nhưng bạn đã truyền cảm hứng cho tôi.
Tít

Ý tôi là for(;$b=substr($b?:".$argv[1]\n",1);)nhưng những gì bạn có bây giờ thậm chí còn tốt hơn.
dùng59178

3

05AB1E, 26 24 23 byte

Cảm ơn @Kade vì 2 byte!
Cảm ơn @Emigna cho 1 byte!

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!

y²k0Êcó thể y²Ênhưng" điều đó làm rối tung nó lên

Điều này có lẽ có thể được đánh gôn nhiều hơn vì «được lặp lại hai lần. Vui lòng để lại một bình luận nếu bạn có bất kỳ đề nghị hoặc cách để chơi nó xuống nhiều hơn.


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

Hãy thử trực tuyến.

Giải trình:

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

Câu trả lời đệ quy 139 byte cũ:

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 nhờ @Eugene . (Lần sau hãy bình luận thay vì chỉnh sửa bài đăng của người khác.)

Hãy thử trực tuyến.

Giải trình:

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

Sẽ không ngắn hơn nhiều nếu không bận tâm với char [], và chỉ sử dụng s.charAt ()?
dpa97

@ dpa97 À, bạn hoàn toàn đúng. Tôi đã sử dụng một vòng lặp foreach lúc đầu, nhưng đã thay đổi nó thành một vòng lặp for thông thường. Quên loại bỏ mảng char. Cảm ơn.
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;}

Ung dung:

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

Trả về một bộ sưu tập các chuỗi.


1
Thủ thuật đẹp với việc sử dụng bộ sưu tập không chung chung. Nhưng nó sẽ không hoạt động, nếu char cuối cùng không phải là char đặc biệt c. Trong trường hợp đó vòng lặp sẽ cố gắng làm việc mãi mãi.
paldir

1
@paldir Woops, bạn nói đúng! Bật não của tôi vào thời điểm này, tìm thấy một cách tốt hơn (và ngắn hơn!).
tâm lý

Bạn có thể xóa dấu ngoặc đơn của vòng lặp for để lưu 2 byte.
PmanAce

@PmanAce Xin lỗi, ý bạn là gì? Dấu ngoặc nào?
tâm lý

công khai IEnumerable F (chuỗi s, char c) {for (int i = 0; i <s.Lipse; ++ i) if (i <1 || s [i]! = c) mang lại lợi nhuận i> 0? s = s.Remove (i--, 1): s; }
PmanAce

2

TSQL, 127 byte (Không bao gồm các định nghĩa biến)

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

Định dạng:

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

Sử dụng tốt patindex, nhưng alphabetví dụ có vẻ không đúng lắm, nó hiển thị aaphabetxuyên suốt aaa. Cũng đáng đề cập đến điều này nên được chạy trên một máy chủ hoặc cơ sở dữ liệu với đối chiếu phân biệt chữ hoa chữ thường, nếu không thì upperCASEví dụ này cũng bị lỗi, hiển thị ueEtrên hàng cuối cùng của nó.
BradC

2

C #, 135 138 :( 137 byte

Chơi gôn

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

Ung dung:

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

Hàm trả về tập hợp các chuỗi.

EDIT1: @psycho nhận thấy rằng thuật toán không được triển khai đúng cách.

EDIT2: Biến được tạo cho s.Length. Một byte được lưu nhờ vào @TheLethalCoder.


1
Sẽ không hoạt động nếu char đầu vào xuất hiện nhiều lần liên tiếp. Vd: codeegolf esẽ cho cethay vì cee.
tâm lý

@psycho tôi trao đổi ifvới whilevà nó hoạt động.
paldir

Tốt hơn ! Nhưng nó có thể ngắn hơn. Tôi sẽ đăng bài của riêng tôi!
tâm lý

1
Tạo một biến s.Lengthđể lưu một 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 byte

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

Và một giải pháp đệ quy 76 Byte , bởi vì mặc dù dài hơn giải pháp thứ mười một, tôi vẫn thích nó hơn:

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

Vợt 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)]))

Ung dung:

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

Kiểm tra:

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

Đầu ra:

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

Trả về một chuỗi đơn với dòng mới

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>


Hơi kỳ lạ ở chỗ nó không lấy hai đối số nhưng một đối số và sau đó trả về một hàm khác trong đó bạn cần đưa ra đối số thứ hai. Tôi không chắc đây là hành vi dự kiến.
MT0

@ MT0 Tôi là số lẻ nhưng nó được chấp nhận cho một hàm có 2 đối số, vì nó tiết kiệm được 1 byte. Tôi sẽ cung cấp cho bạn một tài liệu tham khảo khi tôi tìm thấy một. Đây là meta.codegolf.stackexchange.com/a/8427/21348
edc65

Kỹ thuật tuyệt vời, tôi đã không nhận ra rằng sửa đổi đối số thứ ba thành .maptích lũy. Tôi đã thấy .map().filter()và nghĩ rằng "Điều này sẽ tạo ra sự hiểu biết mảng tuyệt vời!", Nhưng sự thiếu chỉ số trong việc hiểu mảng đã giết chết nó và nó đã kết thúc ở cùng một độ dài: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](btw, tôi đếm 68 byte cho tất cả những điều này.)
ETHproductions

1
Trên thực tế, bằng cách sắp xếp lại các thông số, bạn có thể có được mức độ hiểu mảng xuống tới 66:([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
Sản phẩm ETH

@ETHproductions không thể tin rằng tôi đã sai về số byte một lần nữa . Dù sao, nhờ làm cho tôi suy nghĩ lại về nó, vì vậy tôi đã có 64 với ES6 tiêu chuẩn
edc65

2

Swift 3 - 151 147 byte

Swift không phải là ngôn ngữ lý tưởng để chơi gôn, đặc biệt khi nó liên quan đến lập chỉ mục chuỗi. Đây là điều tốt nhất tôi có thể làm:

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

Thật không may, Swift cần không gian xung quanh !=(nhưng không phải ==) và Swift 3 đã bỏ ++nhà điều hành. Thủ thuật cho cả hai điều này là chuyển đổi thành một mảng ký tự cho phép lập chỉ mục số nguyên và sử dụng phép nội suy chuỗi của một ký tự để chuyển đổi trở lại thành String( "\(c)").

Ung dung:

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

Trước đây, giải pháp không đệ quy

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

Chào mừng đến với PPCG! Có thể xóa một số khoảng trắng ở cuối mã không?
Sản phẩm ETH

@ETHproductions không may, không phải là toán tử ternary và whilekhông gian cần biên dịch. Tôi cũng đã chơi với typealiasing Stringvà cố gắng thiết lập printđể đóng, nhưng họ đã không tiết kiệm bất kỳ không gian.
rabidaudio


1

Toán học, 78 byte

Chết tiệt Martin Ender, tôi gần như là người đầu tiên: p

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

Chức năng chưa được đặt tên; thực hiện đơn giản với một Whilevòng lặp và một vài biến tạm thời.


Ồ, mọi người, cả hai chúng ta đều biết rằng
Mathicala

1
<vẫy cờ trắng>
Greg Martin

1

JavaScript ES6, 89 byte

Tôi nghĩ rằng đây sẽ là một thử thách dễ dàng, nhưng tôi khá chắc chắn rằng tôi đang thiếu một cái gì đó ở đây ..

Sử dụng đệ quy và trả về một chuỗi các chuỗi

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.