จัดทำโปรแกรม“ Ceeeeeeee”


95

เมื่อฉันเขียนโปรแกรม JavaScript ที่จะใช้เป็นตัวป้อนสตริงและตัวอักษรและจะลบตัวอักษรทั้งหมดยกเว้นตัวแรกและตัวอักษรที่ได้รับเป็นตัวป้อนข้อมูลทีละตัว

ตัวอย่างเช่นการคำนวณสิ่งนี้ด้วยอินพุตcodegolf.stackexchange.comและeสำหรับอักขระที่ให้ผลลัพธ์:

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

มันทำให้ตัวละครตัวแรกและทุกeตัว ตัวละครอื่น ๆ ทั้งหมดจะถูกลบทีละตัว

งานของคุณคือการเขียนโปรแกรม (หรือฟังก์ชั่น) ที่ใช้สองอินพุตและเอาต์พุต (หรือส่งคืน) สตริงที่ทำให้เกิดผลกระทบนี้

ข้อมูลจำเพาะ

  • คุณสามารถสันนิษฐานได้ว่าสตริงจะไม่มีการขึ้นบรรทัดใหม่
  • อินพุตที่สองจะเป็นอักขระหนึ่งตัวเสมอ
  • หากคำตอบนั้นอยู่ในรูปแบบของฟังก์ชั่นคุณอาจส่งคืนอาร์เรย์ของสตริงที่มีแต่ละบรรทัดในเอาต์พุต
  • เอาต์พุตสามารถมีการขึ้นบรรทัดใหม่ที่ต่อท้าย

กรณีทดสอบ

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

นี่คือดังนั้นโค้ดที่สั้นที่สุด (เป็นไบต์) จะชนะ



25
+1 สำหรับMeeeeeeeeegram
FlipTack

ในกรณีที่มันส่งกลับอาร์เรย์แต่ละองค์ประกอบจะต้องมีการขึ้นบรรทัดใหม่ต่อท้าย?
แบรดกิลเบิร์ต b2gills

@ BradGilbertb2gills ไม่
เสาะหาผลไม้

4
Meeeeeeeeeeeeem
Mathime

คำตอบ:


5

V , 12 ไบต์

òYpó.“„a]òd

ลองออนไลน์!

hexdump:

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

ฉันได้ทดสอบสิ่งนี้ด้วยV เวอร์ชันล่าสุดที่มีให้ก่อนการท้าทายและทุกอย่างทำงานอย่างถูกต้องทำให้คำตอบนี้แข่งขันกัน

คำอธิบาย:

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

regex ที่ถูกบีบอัดแปลเป็น

.\zs[^e]

ซึ่งหมายความว่า

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

รุ่นที่ไม่ใช่การแข่งขัน (11 ไบต์)

รุ่นนี้ใช้ทางลัดสำหรับYpสิ่งที่ไม่สามารถใช้ได้เมื่อมีการโพสต์ความท้าทายนี้


@ challenger5 เยี่ยมมาก! ฉันจะตรวจสอบรุ่นเก่าและตรวจสอบว่ามันทำงานอย่างถูกต้อง ฉันอาจต้องแก้ไขมันเล็กน้อย ฉันจะ ping คุณเมื่อฉันอัพเดท
DJMcMayhem

@ Challenger5 ฉันแก้ไขคำตอบแล้วและตรวจสอบว่าเวอร์ชันนี้ใช้งานได้เมื่อมีการโพสต์ความท้าทาย
DJMcMayhem

ฉันจะรันคำสั่ง Vim จำนวนมากที่เก็บไว้ในไฟล์บนระบบ Linux ได้อย่างไร? ฉันcat filename | vimจะทำอย่างอื่นหรือไม่?
ckjbgames

31

เป็นกลุ่ม, 27, 26 , 25 ไบต์

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

ลองออนไลน์!

อินพุตมาในรูปแบบนี้:

e
codegolf.stackexchange.com

แนวทางแรกที่ไร้เดียงสาของฉันมีความยาวสามไบต์:

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

ฉันมีความสุขกับคำตอบนี้เพราะมันเริ่มต้นด้วยชื่อของฉัน

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

เห็นความคล้ายคลึงกัน? ใช่มั้ย?

วิธีการที่ประสบความสำเร็จน้อยลง:

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

คำอธิบาย:

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

1
ฉันคิดว่าคุณได้พิมพ์ผิดมีการป้อนข้อมูลที่จะได้รับมีkมากเกินไป :)
geisterfurz007

@ geisterfurz007 ฉันไม่แน่ใจว่าฉันได้รับสิ่งที่คุณหมายถึงอะไร?
DJMcMayhem

มันบอกว่า(...)comkในบรรทัดที่ 5 ในขณะนี้
geisterfurz007

ไม่มีเหตุผลที่จะใช้:tที่นี่ ปกติYpจะบันทึกเป็นไบต์ คุณจะต้องเปลี่ยนไปใช้<C-R>-แน่นอน กฎ PPCG ทั่วไปนั้นน่าหงุดหงิดเพราะสำหรับกรณีทดสอบที่สมเหตุสมผลไม่ว่าจะ:t.|sด้วย99@:หรือ999@:อาจจะถูกต้อง แต่ก็ไม่มีวิธีที่ดีในการทำซ้ำแบบไม่มีที่สิ้นสุด คุณถูกบังคับให้ใช้ strats ที่น่าสนใจน้อยลง
udioica

22

MATL , 20 16 ไบต์

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบ: 1 , 2 , 3 , 4 , 5

โบนัส

รหัสดัดแปลงเพื่อดูสตริงที่ค่อยๆหด (คอมไพเลอร์ออฟไลน์):

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

ป้อนคำอธิบายรูปภาพที่นี่

หรือลองที่MATL Online!

คำอธิบาย

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

3
GIFS! gifs เจ๋งมาก!
Brain Guider

20

Haskell, 50 ไบต์

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

กำหนดฟังก์ชั่น(%)กลับรายการของสตริง

คำอธิบาย

(%)ถูกเรียกว่าw%cด้วยwการเป็นสายป้อนและcตัวละครที่จะเก็บ กล่าวโดยย่อคำจำกัดความนี้ทำงานโดยการแยกwอักขระตัวแรก ( a) และส่วนที่เหลือ ( x) แยกออกxจากการปรากฏตัวครั้งแรกของอักขระอื่นที่ไม่ใช่cและเรียกตัวเองซ้ำด้วยอักขระตัวนั้นซ้ำ

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

3
คุณอธิบายรหัสได้หรือไม่
bli

1
@bli เสร็จแล้ว! หวังว่านี่จะช่วยได้?
dianne

14

เรติน่า28 28ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

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

ลองออนไลน์!

คำอธิบาย

;{G*1`

มีการกำหนดค่ามากมายที่นี่ เวทีของตัวเองเป็นจริงเพียงG1`ซึ่งจะเก็บเพียงบรรทัดแรกทิ้งตัวละครอินพุต *เปลี่ยนเป็นระยะแห้งซึ่งหมายความว่าผลลัพธ์ (เช่นบรรทัดแรกของสตริง) ถูกพิมพ์โดยไม่ต้องเปลี่ยนสตริงจริง {บอกให้ Retina รันทั้งสองสเตจในลูปจนกว่าสตริงจะหยุดการเปลี่ยนแปลงและ;ป้องกันเอาท์พุทเมื่อสิ้นสุดโปรแกรม

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

สิ่งนี้จะละทิ้งอักขระตัวแรกซึ่ง a) ไม่ได้อยู่ที่จุดเริ่มต้นของอินพุต b) ไม่เท่ากับอักขระอินพุตแยกต่างหาก


10

Pip , 22 26 24 22 ไบต์

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

รับสายเป็นอาร์กิวเมนต์บรรทัดคำสั่งแรกตัวละครเป็นที่สอง ลองออนไลน์!

คำอธิบาย

วนซ้ำอักขระของอินพุต ถ้าตัวละครเท่ากับตัวอักษรพิเศษให้ย้ายไปที่ตัวต่อไป; ถ้าไม่ลบและพิมพ์สตริง

รุ่น ungolfed ( a, bรับ args cmdline; oเริ่มต้นด้วยมูลค่าของ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
 }

เทคนิคการตีลูกกอล์ฟ:

  • ส่วนหัวของห่วงสำหรับ Lประเมินผลเพียงครั้งเดียวเพื่อให้เราสามารถแอบพิมพ์เริ่มต้นในนั้น #Pa-1จะไม่ทำงานเพราะPมันมีลำดับความสำคัญต่ำ (มันจะแยกเป็น#P(a-1)) แต่เราสามารถจัดเรียงใหม่v+#Paโดยใช้vตัวแปรกำหนดค่าเริ่มต้นให้-1เป็น
  • RA:ผู้ประกอบการส่งกลับค่าใหม่aเพื่อให้เราสามารถพิมพ์แสดงออกว่าแทนที่จะต้องแยกPaคำสั่ง
  • ตอนนี้ทั้งสองคำสั่ง if เป็นนิพจน์เดียวดังนั้นเราจึงสามารถใช้ตัวดำเนินการ?แทนได้

10

Perl 5, 29 ไบต์

ฉันได้ 35 bytes โดยใช้ Strawberry Perl: 31 bytes, บวก 1 -nEแทน-e, บวก 3 สำหรับ space + -i(ใช้สำหรับการป้อนตัวอักษรตัวเดียว; สตริงที่ยาวกว่ามาจาก STDIN)

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

อย่างไรก็ตามฉันไม่ต้องสงสัยเลยว่าสิ่งนี้สามารถทำได้โดยไม่chomp;ใช้<<<ซึ่งก็คือ 29 ไบต์แม้ว่าฉันจะไม่สามารถทดสอบด้วยตัวเองโดยใช้ Strawberry

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

ดังนั้น:

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

คุณสามารถระบุ "ไม่มีการขึ้นบรรทัดใหม่ในอินพุต" (ซึ่งเป็นวิธีที่โปรแกรมที่สองทำงาน) หากคุณต้องการลบบรรทัดใหม่ในอินพุตให้ดู-lตัวเลือกซึ่งเปิดโหมดการจัดการบรรทัดใหม่อัตโนมัติซึ่งprintพิมพ์บรรทัดใหม่เพิ่มเติม (ไม่เกี่ยวข้องที่นี่) และ-p/ -nอินพุตจะลบบรรทัดใหม่ (เกี่ยวข้องมาก) นอกจากนี้มันเลิกใช้แล้ว แต่ฉันคิดว่าคุณสามารถแทนที่^Iด้วยตัวควบคุมแบบตัวอักษร - ฉันเพื่อเพิ่มการประหยัดแบบไบต์ สุดท้ายผมคิดว่าs/.\K[^$^I]/redo/eจะเป็นตัวละครตัวหนึ่งที่สั้นกว่าถึงแม้ว่าฉันไม่แน่ใจ 100% redoว่าเป็นสถานที่ตามกฎหมายที่จะใส่

@ ais523 ขอบคุณสำหรับคำแนะนำบรรทัดใหม่ แต่ฉันเดาว่าฉันจัดการปัญหาได้ดีพออยู่แล้ว แท้จริง^Iแล้วมันเป็นเรื่องจริงสำหรับตัวแปรตัวอักษรควบคุมส่วนใหญ่ แต่ไม่ใช่ IIRC นี้ เรื่องใหม่\Kและการredoแทนที่ด้วย/eขอบคุณ! ฉันจะทดสอบเมื่อฉันมีโอกาส….
msh210

... และมันไม่ทำงาน @ ais523
msh210

8

Perl 6 ,  47 40  38 ไบต์

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

ขยาย:

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

  $^b;    # declare second parameter

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

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

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

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

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

}

เหตุผลที่...^ใช้แทน...คือ&[eq]จะไม่ส่งคืนTrueจนกว่าจะมีการทำซ้ำค่าล่าสุด


7

05AB1E ,26 25 ไบต์

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

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

ลองออนไลน์!

โปรดทราบว่า¬²k0Qสามารถเขียนใหม่¬²Qได้ แต่ด้วยเหตุผลบางอย่างมันไม่ทำงานเมื่อตัวละครปัจจุบันเป็นเครื่องหมายคำพูด: Q ส่งคืนสตริงจริงแทนที่จะเป็นบูลีนและทำให้เกิดการวนซ้ำไม่สิ้นสุด

รหัสนี้สามารถเล่นกอล์ฟเพิ่มเติมได้เนื่องจาก¯J?มีการทำซ้ำ การย้ายส่วนนี้ในลูปจะเป็นการลบการทำซ้ำและจะอนุญาตให้วางวงเล็บปิดสี่เหลี่ยม


DˆćUΔD²KRнõ.;DXìˆ}¯¨»สำหรับ 21 แต่ที่ใช้คำสั่งใหม่
Magic Octopus Urn

7

Python 2, 71 66 ไบต์:

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

โปรแกรมเต็มรูปแบบ ใช้เวลาประมาณ 2 ปัจจัยการผลิตผ่าน STDIN '<String>','<Char>'ในรูปแบบ

นอกจากนี้ต่อไปนี้เป็นโซลูชันแบบเรียกซ้ำปัจจุบันที่140 ไบต์ :

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

print(Q('<String>','<Char>'))หนึ่งนี้ควรจะเรียกว่าในรูปแบบ


ฉันไม่ใช่งูหลาม แต่ไม่ควรพิมพ์เพียงบรรทัดเดียวใช่หรือไม่
Conor O'Brien

@ ConorO'Brien ใช่ฉันอ่านผิดโพสต์ก่อน ตอนนี้ได้รับการแก้ไขแล้ว
R. Kap

7

Python 3 , 72 ไบต์

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

ลองออนไลน์!

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

ไปทานอาหาร:

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

6

JavaScript (ES6), 74 ไบต์

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

ฉันคิดว่านี่ให้ผลลัพธ์ที่ไม่ถูกต้องสำหรับf('test cases', 's')(ลงท้ายด้วยstssแทนที่จะtsss) ฉันคิดว่าเป็นเพราะreplaceลบสิ่งที่เกิดขึ้นครั้งแรกดังนั้นมันจึงลบอันแรกtมากกว่าที่สองtในการวนซ้ำครั้งที่สี่ของmapลูป
Lmis

@ Lmis ขอบคุณที่ชี้ให้เห็นว่าฉันคิดว่าฉันสามารถแก้ไขหนึ่งในรุ่นของฉันสำหรับ "เพียง" โทษ 7 ไบต์
Neil

5

ทับทิม, 148 139 97 90 83 77 62 ไบต์

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

ไม่แน่ใจว่ารหัสสมัครเล่นได้รับการยอมรับในการแลกเปลี่ยนนี้หรือไม่ แต่ฉันสนใจที่จะเรียนรู้การเขียนรหัสกอล์ฟถึงแม้ว่าฉันจะแย่ขนาดนั้นความช่วยเหลือใด ๆ

แก้ไข:

แทนที่ด้วย p

ลบช่องว่างออกหนึ่งตันและนับจำนวนไบต์อย่างถูกต้องด้วย Wheat Wizard

ขอขอบคุณที่ challenger5 ไปจากs=gets.chop;c=gets.chop;การs,c=gets.chop,gets.chop;

แทนที่thenด้วย;และgets.chopด้วยgets[0]ขอบคุณ Mhutter!

รับอินพุตเป็นตัวแปรบรรทัดคำสั่งทันทีเช่น prog.rb helloworld l

ขอบคุณการปรับปรุงจำนวนมากโดย jeroenvisser101 แทนที่a=s.dupด้วยs=""+aและก่อนหน้าถ้าคำสั่งif s[i]!=c;s[i]="";p s;else i+=1;endมี(d!=c)?(s[i]="";p s):i+=1;การปรับปรุงอย่างมาก!


ยินดีต้อนรับสู่เว็บไซต์! ฉันไม่ใช่ผู้เชี่ยวชาญในการเล่นกอล์ฟทับทิม แต่ดูเหมือนว่าคุณมีพื้นที่ว่างพิเศษ โดยเฉพาะอย่างยิ่งรอบ=s สำหรับเคล็ดลับที่ครอบคลุมมากขึ้นคุณสามารถเยี่ยมชมของเราหน้าเคล็ดลับ
Sriotchilism O'Zaic

s=gets.chompวิธีที่ง่ายที่สุดในการลบไบต์คือการกำจัดช่องว่างส่วนเกินเช่น ผมไม่แน่ใจว่าถ้าคุณสามารถทำเช่นนี้ในทับทิม a,b,c=0,1,2แต่ในบางภาษาเช่นงูหลามคุณสามารถรวมการมอบหมายงานหลายเป็นคำสั่งอย่างใดอย่างหนึ่งเช่น
แยกผลไม้

สวัสดีขอบคุณสำหรับเคล็ดลับเกี่ยวกับช่องว่างอ่านเอกสารทับทิมและอัฒภาคตระหนักสามารถแทนที่พวกเขาสำหรับงบสิ้นสุด: ') สำหรับการทำ s = gets.chop และ c = gets.chop ฉันลาดเท s, c = gets.chop หรืออะไร เช่นเดียวกับที่น่าเสียดายที่พวกเขาแน่นอนส่วนที่ใหญ่ที่สุดของรหัสและฉันต้องการที่จะลบว่าคำสั่งที่มีความยาว ..
เบน Hili

คุณยังคงมีช่องว่างพิเศษบางอย่างโดยเฉพาะอย่างยิ่งก่อนที่คำหลัก ( do, thenและend) =และรอบที่สี่
Sriotchilism O'Zaic

ดูเหมือนว่าคุณกำลังเปลี่ยนแปลงตัวเองในระยะสั้น ๆ ฉันนับ 90 ไบต์เท่านั้นเอง
Sriotchilism O'Zaic

4

c90, 129 125 ไบต์

ด้วยช่องว่าง:

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

ไม่มีช่องว่าง:

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

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

สิ่งนี้จะใช้ตัวชี้ไปที่จุดเริ่มต้นของสตริงและวนซ้ำตัวชี้นี้จนกว่าจะถึงจุดสิ้นสุดของสตริง ภายในลูปนั้นจะพิมพ์อักขระตัวแรกจากนั้นอินสแตนซ์ของอาร์กิวเมนต์ที่สองที่พบระหว่างการเริ่มต้นของสตริงและตัวชี้ หลังจากนี้จะเรียกวางบนตัวชี้พิมพ์ส่วนที่เหลือของสตริง

สิ่งนี้จะต้องรวบรวมในระบบที่ sizeof (int) == sizeof (char *) +3 ไบต์เป็นอย่างอื่น

นี่เป็นครั้งแรกที่ฉันลองเล่นกอล์ฟรหัสที่นี่ดังนั้นฉันมั่นใจว่าจะมีการปรับปรุงบางอย่าง


3

Dyalog APL ขนาด 27 ไบต์

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

เป็นอักขระที่แยกออกเป็นสตริงเริ่มต้น

อาร์กิวเมนต์พิมพ์ ค้นหาดัชนีiของไม่ใช่คนแรกหลังจากถ่านตัวแรก; หากพบให้โทรซ้ำพร้อมiลบออก


3

Mathematica, 64 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อ รับค่าสตริงที่สองเป็นอินพุตและส่งคืนรายการสตริงเป็นเอาต์พุต ทำงานโดยการลบอักขระที่ไม่ใช่อินสแตนซ์แรกของอักขระซ้ำ ๆ


ฉันจะเริ่มใช้FixedPointListอย่างแน่นอน
ngenisis

3

PHP, 88 84 86 85 82 81 78 ไบต์

บันทึก 1 ไบต์ด้วย @IsmaelMiguel, 3 ไบต์ต้องขอบคุณ @ user59178, 3 ไบต์ที่ได้แรงบันดาลใจจาก @ user59178

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

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง ทำงานด้วยphp -r <code> '<string>' <character>


  • เพิ่มบรรทัดใหม่ให้กับอินพุตสำหรับการพิมพ์ขั้นสุดท้ายโดยนัย
    ที่เพิ่ม5 4 ไบต์ของรหัส echo$a;แต่จะช่วยประหยัดการส่งออกและเพิ่มเติม

1
$argv[1]."\n"สามารถเขียนเป็น"$argv[1]\n"
Ismael Miguel

1
เมื่อ$bได้รับการขึ้นบรรทัดใหม่มันจะเป็นความจริงตราบใดที่มันมีความยาว> = 1 ดังนั้น""<จึงไม่จำเป็น
user59178

คุณสามารถบันทึกไบต์อื่นโดยใช้ ternary ในส่วนมากกว่ากำหนดsubstr() $b
user59178

@ user59178 ฉันไม่ได้จับคุณตรงนั้นจริงๆ: ฉันต้องการsubstrผลลัพธ์สำหรับทั้งเงื่อนไขและprint; ดังนั้นฉันควรกำหนดที่ใดที่หนึ่ง แต่คุณเป็นแรงบันดาลใจให้ฉัน
ติตัส

ฉันหมายถึงfor(;$b=substr($b?:".$argv[1]\n",1);)แต่สิ่งที่คุณมีตอนนี้ดียิ่งขึ้น
user59178

3

05AB1E, 26 24 23 ไบต์

ขอบคุณ @Kade สำหรับ 2 ไบต์!
ขอบคุณ @Emigna สำหรับ 1 ไบต์!

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

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!

y²k0Êอาจเป็นy²Êแต่"ยุ่งมันขึ้นมา

สิ่งนี้อาจจะเล่นกอล์ฟได้มากขึ้นเพราะ«ซ้ำสองครั้ง กรุณาแสดงความคิดเห็นหากคุณมีข้อเสนอแนะหรือวิธีที่จะตีมันลง


3

Java 10, 155 140 139 124 ไบต์

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

ลองออนไลน์

คำอธิบาย:

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

คำตอบแบบเรียกซ้ำ 139 ไบต์เก่า:

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

-1 ไบต์ขอบคุณที่@Eugene (ครั้งต่อไปให้แสดงความคิดเห็นแทนการแก้ไขโพสต์ของคนอื่นได้โปรด)

ลองออนไลน์

คำอธิบาย:

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.charAt () ใช่ไหม?
dpa97

@ dpa97 อาคุณพูดถูก ฉันใช้ foreach loop ในตอนแรก แต่เปลี่ยนเป็น for-loop ปกติ ลืมที่จะลบ char-array ขอบคุณ
Kevin Cruijssen

2

C #, 122 117 112 ไบต์

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

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

ส่งคืนชุดของสตริง


1
กลลวงดีกับการใช้ไม่ใช่คอลเล็กชันทั่วไป cแต่มันจะไม่ทำงานถ้าถ่านที่ผ่านมาไม่ได้เป็นถ่านพิเศษ ในกรณีที่วงจะพยายามทำงานตลอดไป
paldir

1
@paldir Woops คุณพูดถูก! หันสมองของฉันในเวลานี้พบวิธีที่ดีกว่า (และสั้นกว่า!)
โรคจิต

คุณสามารถลบวงเล็บของ for loop เพื่อบันทึก 2 ไบต์
PmanAce

@PmanAce ขออภัยคุณหมายถึงอะไร วงเล็บไหน?
โรคจิต

สาธารณะ IEnumerable F (สตริง s, ถ่าน c) {สำหรับ (int i = 0; i <s.Length; ++ i) ถ้า (i <1 | | s [i]! = c) ผลตอบแทน i> 0? s = s.Remove (i -, 1): s; }
PmanAce

2

TSQL, 127 ไบต์ (ไม่รวมคำจำกัดความของตัวแปร)

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

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

จัดรูปแบบ:

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

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

    PRINT @ + @1
END

การใช้งานที่ดีของpatindexแต่alphabetตัวอย่างที่ไม่ได้ดูเหมือนค่อนข้างขวาก็จะแสดงลงผ่านaaphabet aaaนอกจากนี้ควรพูดถึงสิ่งนี้ควรเรียกใช้บนเซิร์ฟเวอร์หรือฐานข้อมูลที่มีการเปรียบเทียบตามตัวพิมพ์ใหญ่ - เล็กหรือมิฉะนั้นupperCASEตัวอย่างก็จะล้มเหลวเช่นกันโดยแสดงueEในแถวสุดท้าย
BradC

2

C # 135 138 :( 137 ไบต์

แข็งแรงเล่นกอล์ฟ:

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

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

ฟังก์ชันส่งคืนคอลเลกชันของสตริง

EDIT1: @psycho สังเกตว่าอัลกอริทึมนั้นไม่ได้ใช้งานอย่างถูกต้อง

EDIT2: s.Lengthสร้างตัวแปร บันทึกหนึ่งไบต์ด้วย @TheLethalCoder


1
จะไม่ทำงานหากอินพุตถ่านมีอยู่มากกว่าหนึ่งครั้งในแถว Ex: codeegolf eจะให้แทนce cee
โรคจิต

@psycho ฉันสลับifกับwhileและใช้งานได้
paldir

ดีกว่า! แต่อาจสั้นกว่านี้ได้ ฉันจะโพสต์ของตัวเอง!
โรคจิต

1
สร้างตัวแปรสำหรับs.Lengthการบันทึกหนึ่งไบต์: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))]

และวิธีแก้ปัญหาแบบเรียกซ้ำ76 ไบต์เพราะแม้จะนานกว่าความ firt ฉันก็ชอบดีกว่า:

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

2

แร็กเก็ต 194 ไบต์

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

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

การทดสอบ:

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

เอาท์พุท:

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

2

JavaScript (ES6), 64 69

ส่งคืนสตริงเดี่ยวที่มีบรรทัดใหม่

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

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

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

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


แปลกเล็กน้อยที่ไม่มีอาร์กิวเมนต์สองตัว แต่มีอาร์กิวเมนต์หนึ่งแล้วส่งกลับฟังก์ชันอื่นที่คุณต้องการให้อาร์กิวเมนต์ที่สอง ฉันไม่แน่ใจว่านี่เป็นพฤติกรรมที่คาดหวัง
MT0

@ MT0 ฉันแปลก แต่ก็เป็นที่ยอมรับสำหรับฟังก์ชั่นที่มี 2 ข้อโต้แย้งเนื่องจากมันช่วยประหยัด 1 ไบต์ ฉันจะให้การอ้างอิงแก่คุณเมื่อฉันพบ นี่คือmeta.codegolf.stackexchange.com/a/8427/21348
edc65

เทคนิคที่ยอดเยี่ยมฉันไม่ได้ตระหนักว่าการแก้ไขอาร์กิวเมนต์ที่สาม.mapเป็นแบบสะสม ฉันเห็น.map().filter()และคิดว่า "สิ่งนี้จะทำให้เกิดความเข้าใจในอาร์เรย์ที่ยอดเยี่ยม!" แต่การขาดดัชนีในความเข้าใจของอาเรย์นั้นทำให้มันจบลงด้วยความยาวเท่ากัน: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](btw ฉันนับ 68 ไบต์สำหรับสิ่งเหล่านี้ทั้งหมด)
ETHproductions

1
ที่จริงแล้วโดยการจัดเรียง params ใหม่คุณจะสามารถเข้าใจ array ได้มากถึง 66:([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
ETHproductions

@ETHproductions ไม่สามารถเชื่อว่าฉันผิดในการนับไบต์อีกครั้ง อย่างไรก็ตามขอบคุณที่ทำให้ฉันคิดอีกครั้งเกี่ยวกับเรื่องนี้ดังนั้นฉันได้ 64 กับ ES6 มาตรฐาน
edc65

2

สวิฟต์ 3 - 151 147 ไบต์

Swift ไม่ใช่ภาษาที่เหมาะสำหรับการเล่นกอล์ฟโดยเฉพาะเมื่อเกี่ยวข้องกับการจัดทำดัชนีสตริง นี่คือสิ่งที่ดีที่สุดที่ฉันสามารถทำได้:

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

น่าเสียดายที่ Swift ต้องการช่องว่างรอบ ๆ!=(แต่ไม่ใช่สำหรับ==) และ Swift 3 ทำให้++ผู้ปฏิบัติงานลดลง เคล็ดลับสำหรับทั้งสองอย่างนี้คือการแปลงเป็นอาเรย์ตัวละครซึ่งช่วยให้การทำดัชนีจำนวนเต็มและการใช้การแก้ไขสตริงของอักขระเพื่อแปลงกลับไปเป็น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
    }
}

ก่อนหน้าโซลูชันที่ไม่เกิดซ้ำ

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

ยินดีต้อนรับสู่ PPCG! สามารถลบช่องว่างบางส่วนไปยังจุดสิ้นสุดของรหัสได้หรือไม่?
ETHproductions

@ETHproductions น่าเสียดายที่ไม่ใช่ผู้ประกอบการที่ประกอบไปด้วยไตรภาคและwhileพื้นที่ที่ต้องการรวบรวม ฉันเล่นด้วยการพิมพ์ตัวอักษรStringและพยายามprintปิดตัวลง แต่พวกเขาไม่ได้ประหยัดพื้นที่เลย
rabidaudio

2

Pyke, 26 19 17 ไบต์

jljjhF3<Q/Q*jih>s

ลองที่นี่!

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

คุณสามารถเพิ่มคำอธิบายได้ไหม?
ผลไม้แยกแยะ

@ Challenger5 เสร็จแล้วและเล่นกอล์ฟได้ 2 ไบต์!
Blue

1

Mathematica, 78 ไบต์

คุณมาร์ตินเอนเดอร์ฉันเกือบจะเป็นคนแรกแล้ว: พี

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

ฟังก์ชันที่ไม่มีชื่อ การใช้งานที่Whileไม่ซับซ้อนพร้อมลูปและตัวแปรชั่วคราวบางอย่าง


โอ้ c'monเราทั้งคู่รู้ว่า Mathematica นั้นไม่จำเป็น
LegionMammal978

1
<โบกธงขาว>
Greg Martin

1

JavaScript ES6, 89 ไบต์

ฉันคิดว่านี่จะเป็นความท้าทายที่ง่าย แต่ฉันค่อนข้างแน่ใจว่าฉันขาดอะไรบางอย่างที่นี่ ..

ใช้การเรียกซ้ำและส่งกลับอาร์เรย์ของสตริง

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

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

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

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.