ผนวกและลบ


14

รับหนึ่งบรรทัดที่ประกอบด้วยตัวอักษรเท่านั้นดำเนินการดังต่อไปนี้:

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

เอาต์พุตสถานะสุดท้ายของสตริง

คุณสามารถสันนิษฐานได้อย่างปลอดภัยว่าอินพุตประกอบด้วยอักขระอย่างน้อยหนึ่งตัว (เช่นไม่ว่างเปล่า) แต่ไม่มีการรับประกันว่าเอาต์พุตจะไม่ว่างเปล่า

Pseudocode (รู้สึกอิสระที่จะเล่นกอล์ฟนี้):

str = EMPTY
for each character ch in input
  if ch exists in str
    remove all ch from str
  else
    append ch to str
print str

^[A-Za-z]+$การป้อนข้อมูลที่ตรงกับการแสดงออกปกติ

กรณีทดสอบตัวอย่าง:

ABCDBCCBE -> ADCBE
ABCXYZCABXAYZ -> A
aAABBbAbbB -> aAbB
GG -> (empty)

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

โปรแกรมที่สั้นที่สุดในแต่ละภาษาชนะ!

พิเศษ (ไม่บังคับ): โปรดอธิบายว่าโปรแกรมของคุณทำงานอย่างไร ขอขอบคุณ.


บรรทัดว่างเปล่าหรือไม่
user202729

1
@ user202729 ไม่ฉันเปลี่ยนไปเล็กน้อย (ไม่ได้ทำให้คำตอบใด ๆ ไม่ถูกต้อง) ดังนั้นอินพุตจะไม่ว่างเปล่า
iBug

1
ดังนั้นคุณจึงไม่ปฏิเสธ ais523 ของการแก้ไขข้อเสนอแนะว่าทำไม(ลิงค์) ?
user202729

คำตอบ:


10

Haskell , 44 42 ไบต์

foldl(#)""
s#x|z<-filter(/=x)s=z++[x|z==s]

ลองออนไลน์! แก้ไข: -2 ไบต์ขอบคุณ Zgarb!

คำอธิบาย:

บรรทัดที่สองกำหนดฟังก์ชั่น(#)ที่รับสตริงsและตัวอักษรxและทำการลบหรือต่อท้าย นี้จะทำได้โดยfilterไอเอ็นจีออกจากการเกิดขึ้นของทุกคนxในที่เกิดในสตริงs zหากxไม่เกิดขึ้นแสดงsว่าzมีค่าเท่ากับsและz++[x|z==s]ให้ค่าสตริงเดิมxต่อท้าย มิฉะนั้น[x|z==s]จะให้สตริงว่างและสตริงที่ถูกกรองเท่านั้นที่จะถูกส่งคืน

foldl(#)""เป็นฟังก์ชั่นที่ไม่ระบุชื่อซึ่งจะใช้เวลาสตริงและเพิ่มตัวละครตัวหนึ่งหลังจากที่อื่น ๆ สตริงแรกที่ว่างเปล่าที่มีฟังก์ชั่น""(#)


2
42 ไบต์โดยใช้ตัวกรองซ้ำ
Zgarb


8

J , 21 19 ไบต์

#~~:&.|.(2|*)1#.=/~

มันทำงานอย่างไร:

=/~ - สร้างตารางความเท่าเทียมกันของตัวละครในสตริง:

   a =. 'ABCXYZCABXAYZ'
   ]b =: =/~ a 
1 0 0 0 0 0 0 1 0 0 1 0 0
0 1 0 0 0 0 0 0 1 0 0 0 0
0 0 1 0 0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0 0 0 0 0 1
0 0 1 0 0 0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 1 0 0 1 0 0
0 1 0 0 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 1 0 0 1 0 0
0 0 0 0 1 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0 0 0 0 0 1

1#. - ผลรวมของแต่ละแถวโดยการแปลง 1 ฐาน (จำนวนตัวอักษรเกิดขึ้นกี่ครั้ง)

   ]c =: 1#. b
3 2 2 2 2 2 2 3 2 2 3 2 2

~:&.|- reverse จากนั้นใช้ nub sieve (เป็นตัวอักษรที่ไม่ซ้ำกัน) และย้อนกลับอีกครั้ง ดังนั้นฉันพบการเกิดขึ้นครั้งสุดท้ายของตัวละครในสตริง:

   ]d =. ~:&.|. a
0 0 0 0 0 0 1 0 1 1 1 1 1

* - ทวีคูณการนับ 1 สำหรับตำแหน่งสุดท้ายของตัวละครใน sring โดย 0 มิฉะนั้นคำนวณโดยข้างต้น ~:&.|

   ]e =. c * d
0 0 0 0 0 0 2 0 2 2 3 2 2

2| - modulo 2 (ตั้งค่าเป็น 0 ตำแหน่งของตัวอักษรที่นับได้):

   ]f =. 2| e 
0 0 0 0 0 0 0 0 0 0 1 0 0

#~- คัดลอกอาร์กิวเมนต์ที่ถูกต้องไปทางซ้ายหาเรื่อง ครั้ง (~ กลับด้านของส่วนโค้ง)

]f # a A

ลองออนไลน์!


6

Brainfuck, 95 ไบต์

,[<<<[[->+>>>+<<<<]>>>[-<+<->>]<<[[-]<]>[[-]>>[-]>[[-<+>]>]<<[<]<<]<<]<[->>>>[-]<<<]>>>>[->+<]>>[>]>>,]<<<[.<]

ลองออนไลน์

มันทำงานอย่างไร

, Gets first input
[ Starts loop
    <<< Go to start of string
    [ Loop over the string
        [->+>>>+<<<<] Duplicates the current char of the string
        >>>[-<+<->>] Duplicates and subtracts the inputted char from the duplicate of the string char
        <<[[-]<] If the char is different to the input, remove the difference
        > If the char is the same
        [
            [-]>>[-]>[[-<+>]>]<<[<]<< Remove the char from the string and sets the inputted char to 0
        ]
        << Moves to the next char of the string
    ]
    >>>[->+<] adds the inputted char to the string
    >>[>]>>, gets the next input
]
<<<[.<] prints the string



2

R , 92 84 77 ไบต์

for(i in el(strsplit(scan(,y<-''),y)))y=c(y[y!=i],if(!i%in%y)i);cat(y,sep='')

ลองออนไลน์!

-15 ไบต์ขอบคุณ djhurio

คำอธิบาย

djhurioให้คำตอบ R ที่ยอดเยี่ยมโดยหลีกเลี่ยงการforวนรอบ - เนื่องจากโปรแกรมเมอร์ R ทำตามกฎ (โดยรวมอยู่ด้วย) นี่คือคำตอบ R ที่ใช้forลูป (และบันทึกสองสามไบต์ในกระบวนการ)

  • x=scan(,''); - กำหนดอินพุตให้เป็นตัวแปร x
  • y=''; - สร้างสตริงว่างในตัวแปรที่เรียกว่า y
  • for(i in el(strsplit(x,'')))- สำหรับตัวละครทุกตัวiในx
  • y=c(y[y!=i],if(!i%in%y)i)- กำหนดให้กับyทุกองค์ประกอบของyที่ไม่เท่ากับiโดยผนวกiถ้าiไม่ได้อยู่ในy
  • cat(y,sep='')- พิมพ์องค์ประกอบของyไม่มีช่องว่างระหว่างพวกเขา

บันทึก

ถ้าคุณคลิกลิงก์ TIO ข้างต้นคุณจะพบในส่วนหัวlibrary(methods); นี่คือการจัดการกับข้อผิดพลาดที่พบdjhurioเกี่ยวกับel()ฟังก์ชั่น - ฟังก์ชั่นที่ให้บริการโดยmethodsแพคเกจซึ่งในรุ่นใด ๆ ของฉันได้ใช้ R ถูกโหลดโดยค่าเริ่มต้น แต่ด้วยเหตุผลใดก็ตามไม่ได้โดย TIO หากlibrary(methods)ถูกลบออกจากส่วนหัวและunlistถูกแทนที่elด้วยฉันจะได้รับสี่ไบต์ แต่djhurioจะทำให้จำนวนไบต์ของเราอยู่ที่96 88 และ 99 ตามลำดับ


ทำได้ดีนี่. ไม่เคยคิดเลยว่าลูปจะสั้นลง for(i in el(strsplit(scan(,y<-''),y)))y=c(y[y!=i],if(!i%in%y)i);cat(y,sep='')คุณสามารถทำให้มันยิ่งสั้นลงโดยเลี่ยงคำสั่งอื่น
djhurio

@djhurio - ฉันรู้ว่ามันแทบจะไม่เคยมีกรณีที่ใน R สำหรับห่วงจะช่วยอะไร เกี่ยวกับข้อเสนอแนะของคุณ: ความคิดที่ดี! ข้อเสนอแนะรวมอยู่ในคำตอบแล้ว
duckmayr

1
@djhurio - ยุติธรรมเพียงพอ; ฉันกำลังยุ่งอยู่กับการมองหาความแตกต่างจากการละเว้นคำสั่งอื่นฉันไม่เห็นว่าคุณเปลี่ยนจุดเริ่มต้นอย่างไร กำลังแก้ไขในขณะนี้ การทำงานที่ดี!
duckmayr

1
@djhurio @duckmayr มีวิธีแก้ปัญหา 73 ไบต์ที่โดยทั่วไปใช้วิธีนี้และใช้วิธีแตกต่างกันเล็กน้อยเพื่อแยกอักขระ ฉันไม่รู้สึกอยากโพสต์เป็นคำตอบแยกต่างหาก นอกจากนี้โปรดทราบว่า...[[1]]ยาวกว่าel(...)แต่สั้นกว่าunlist(...)โดยมีเงื่อนไขว่า...เป็นรายการความยาว 1
Giuseppe

1
เกาที่ฉันพบคำตอบ 70 byeเนื่องจาก0เป็นnulตัวละครและได้รับการแปลงเป็นสตริงว่าง
Giuseppe

2

MATL , 6 ไบต์

vi"@X~

ไม่สามารถใช้งานได้ในสภาพแวดล้อม TIO แต่ทำงานได้ดีกับการใช้งาน MATLAB และด้วยแพตช์ใหม่คุณอาจลองใช้งานบนMATL Online

X~เท่ากับsetxorหรือความแตกต่างสมมาตรซึ่งทำสิ่งที่ท้าทายถาม ส่วนที่เหลือเป็นเพียงการวนรอบอินพุตi"@และเริ่มต้นด้วยสตริงว่างโดยเชื่อมต่อสแต็กทั้งหมดซึ่งว่างเปล่าในตอนเริ่มต้น (ขอบคุณ Luis Mendo)


2

Python 2 , 56 ไบต์

-2 ไบต์ขอบคุณ xnor -3 ไบต์ขอบคุณ ovs

lambda s:reduce(lambda a,c:a.replace(c,'')+c[c in a:],s)

ลองออนไลน์!

แท้จริงเพียงแค่ปลอม pseudocode : P


1
บันทึก 2 s=(s+c).replace(c,c[c in s:])ไบต์:
xnor

@ xnor นั่นคือพื้นฐานการเล่นกอล์ฟที่ดำเนินการอย่างชาญฉลาดมาก ขอบคุณ!
สิ้นเชิงมนุษย์

1
-1 ไบต์ :s=s.replace(c,'')+c[c in s:]
ovs


1

JavaScript (ES6), 60 ไบต์

s=>[...s].map(c=>s=s.match(c)?s.split(c).join``:s+c,s='')&&s

กรณีทดสอบ


ฉันตอบคำถามเกี่ยวกับจอประสาทตาของ @ MartinEnder และมันก็แค่ 45 ไบต์ ...
Neil



1

ภาษา Wolfram (Mathematica)ขนาด 36 ไบต์

#//.{a___,x_,b___,x_,c___}:>{a,b,c}&

ลองออนไลน์!

รับอินพุตและเอาต์พุตเป็นรายการของอักขระ

มันทำงานอย่างไร

ใช้//.(นามแฝงReplaceRepeated) เพื่อค้นหาอักขระซ้ำสองตัวและลบทั้งสองจนกว่าจะไม่มีอักขระซ้ำอีก หากตัวละครเกิดขึ้นมากกว่าสองครั้ง Mathematica จะลบเหตุการณ์ที่เกิดขึ้นสองครั้งแรกเสมอ ดังนั้นหากตัวละครเกิดขึ้นจำนวนครั้งคี่อินสแตนซ์สุดท้ายของมันจะเป็นตัวที่อยู่รอด


1

อารัมภบท 81 ไบต์

a([],O,O).
a([I|J],K,O):-delete(K,I,F),(K=F->append(K,[I],M),a(J,M,O);a(J,F,O)).

รุ่นที่ไม่ยุ่งเหยิง:

append_and_eraze([], Output, Output).
append_and_eraze([I | Input], Interim, Output) :-
    delete(Interim, I, Filtered),
    ( Interim = Filtered ->
      append(Interim, [I], Interim1),
      append_and_eraze(Input, Interim1, Output)
    ;
    append_and_eraze(Input, Filtered, Output)
    ).
  1. delete/3 ตรวจสอบให้แน่ใจว่าอาร์กิวเมนต์ที่สามของมันรวมเป็นหนึ่งเดียวกับอาร์กิวเมนต์แรกโดยมีอินสแตนซ์ทั้งหมดของอาร์กิวเมนต์ที่สองถูกลบออกจากมัน
  2. หากสิ่งเหล่านั้นกลายเป็นเหมือนเดิมเราจะผนวกองค์ประกอบ (มันไม่ได้ถูกลบออก)
  3. append/3 ตามชื่อของมันผนวกองค์ประกอบในรายการ
  4. เราเกิดขึ้นอีกครั้งในองค์ประกอบของอินพุตจนกว่าเราจะตี[](รายการที่ว่างเปล่า) ที่จุดที่ผลกลางจะรวมกันกับผลลัพธ์ที่ต้องการ

ทดสอบ:

?- append_and_eraze(`ABCDBCCBE`, [], X), string_codes(Y, X).
X = [65, 68, 67, 66, 69],
Y = "ADCBE".

?- append_and_eraze(`ABCXYZCABXAYZ`, [], X), string_codes(Y, X).
X = [65],
Y = "A".

?- append_and_eraze(`aAABBbAbbB`, [], X), string_codes(Y, X).
X = [97, 65, 98, 66],
Y = "aAbB".

?- append_and_eraze(`GG`, [], X), string_codes(Y, X).
X = [],
Y = "".

Prologs บางตัวจัดการสตริงในเครื่องหมายคำพูดคู่เป็นรายการ SWI สามารถกำหนดค่าให้ทำเช่นเดียวกัน แต่เพื่อความเรียบง่ายฉันจึงใช้string_codes/2รูปแบบเอาต์พุตเป็นอย่างดี



1

R , 84 ไบต์

y=el(strsplit(scan(,""),""));cat(unique(y[colSums(outer(y,y,"=="))%%2>0],,T),sep="")

ลองออนไลน์!

วิธีอื่น แต่มีคำตอบR ที่ดีกว่าที่นี่

R , 88 ไบต์

z=table(y<-el(strsplit(scan(,""),"")));cat(setdiff(unique(y,,T),names(z[!z%%2])),sep="")

ลองออนไลน์!

ขอบคุณ Giuseppe สำหรับ -7 ไบต์!

มีคำตอบที่สั้นลงโดย duckmayr

  1. scan(,"") อ่านอินพุตจาก stdin
  2. y<-el(strsplit(scan(,""),""))yการป้อนข้อมูลแยกจากตัวอักษรและบันทึกเป็น
  3. z=table(y<-el(strsplit(scan(,""),"")))คำนวณความถี่ของแต่ละตัวละครและบันทึกตารางผลลัพธ์zดังนี้;
  4. unique(y,,T) นำตัวละครที่ไม่ซ้ำกันจากด้านขวา
  5. names(z[!z%%2]) เลือกได้เฉพาะการนับและแยกชื่อ
  6. setdiff(unique(y,,T),names(z[!z%%2])) ลบตัวละครที่มีการนับคู่
  7. cat(setdiff(unique(y,,T),names(z[!z%%2])),sep="") พิมพ์ผลลัพธ์

เหตุผลข้อผิดพลาดของคุณคือที่el()มาจากmethodsแพคเกจซึ่งในขณะที่โหลดโดยทั่วไปตามค่าเริ่มต้นไม่ได้โดย TIO (กล่าวถึงในคำตอบของฉันด้านล่าง)
duckmayr

เหตุผลที่คุณจะใช้rev(unique(rev(y)))? จะไม่unique(y)ทำงานเหรอ ooohhh รอฉันเห็นแล้วคุณต้องการตัวละครที่เป็นเอกลักษณ์จากขวาไปซ้าย ในกรณีที่unique(y,,T)(การตั้งค่าfromLast=T) จะเป็น88 ไบต์
Giuseppe

0

อลิซ 9 ไบต์

/X&@
\io/

ลองออนไลน์!

คำอธิบาย

โดยทั่วไปพอร์ตของคำตอบของเอริค นอกเหนือจากการเปลี่ยนเส้นทางบิตรหัสเป็นเพียง:

i&Xo@

ซึ่งทำ:

i   Read all input.
&X  Fold symmetric multiset difference over the input.
o   Output the result.
@   Terminate.

0

APL (Dyalog)ขนาด 16 ไบต์

{(,⍨~∩)/⍣(≢⍵)⊖⍵}

ลองออนไลน์!

หากอนุญาตข้อผิดพลาดสิ่งนี้จะเป็น 9 ไบต์:

(,⍨~∩)/∘⊖

คุณหมายถึงข้อผิดพลาดอะไร
FrownyFrog

@FrownyFrog เวอร์ชัน 9 ไบต์จะส่งDOMAIN ERRORหากสตริงว่างเปล่าเนื่องจาก(,⍨~∩)ไม่มีองค์ประกอบข้อมูลเฉพาะตัวที่กำหนดไว้ล่วงหน้า
Erik the Outgolfer


0

Ruby , 53 ไบต์

->s{s.reverse.uniq.select{|c|s.count(c)%2>0}.reverse}

ลองออนไลน์!

อินพุตและเอาต์พุตเป็นทั้งอาร์เรย์ของตัวอักษร ทดสอบการโทร.charsและ.joinเพื่อความสะดวก

คำอธิบาย

ใช้ข้อเท็จจริงที่ว่าตัวอักษรในสตริงผลลัพธ์ปรากฏเป็นจำนวนคี่และในลำดับจากขวาไปซ้าย

->s{                # lambda function taking char-array argument
    s.reverse           # reverse the input
    .uniq               # get unique characters
    .select{|c|         # select only those which...
        s.count(c)%2>0      # appear in the input array an odd number of times
    }.reverse           # reverse back and return
}

0

Pyth, 13 ไบต์

{_xD_Qf%/QT2Q

รับอินพุตเป็นรายการของอักขระ ทดสอบสิ!

      f     Q            (f)ilter input (Q)
        /QT              On how many times (/) each character (T) appears in the 
                           input (Q)
       %   2             Only allow odd numbers of occurences (when x % 2 = 1)
 _xD_Q                   Sort (D) descending (the first _) by the location (x) of 
                           the last (the second _) inde(x) of the target character
                           in the input (Q)
{                        Remove duplicates

0

Röda , 34 ไบต์

{a=[]a-=_ if[_1 in a]else a+=_1;a}

ลองออนไลน์!

นี่คือการแปลโดยตรงของ pseudocode จะถือว่าอินพุตและเอาต์พุตเป็นสตรีมของอักขระ

คำอธิบาย:

{                    /* Anonymous function                   */
    a=[]             /* initialize a                         */
                     /* For each character _1 in the stream: */
    a-=_ if[_1 in a] /*  Remove it from a if a contains it   */
    else a+=_1;      /*  Otherwise append it to a            */
    a                /* Push characters in a to the stream   */
}

0

Python 3 , 73 ไบต์

ไม่ใช่สั้นที่สุด แต่ฉันชอบวิธีนี้

lambda s:''.join(c*(s.count(c)%2)*(i==s.rfind(c))for i,c in enumerate(s))

ลองออนไลน์!

วนรอบสตริงรักษาเฉพาะอักขระเหล่านั้นโดยที่:

  • (s.count(c)%2) == 0 - ตัวละครปรากฏจำนวนครั้ง
  • (i==s.rfind(c)) - ดัชนีปัจจุบันคือการปรากฏตัวครั้งสุดท้ายของตัวละครที่เป็นปัญหา

0

REXX , 102 ไบต์

a=arg(1)
s=''
do while a>''
  b=right(a,1)
  if countstr(b,a)//2 then s=b||s
  a=changestr(b,a,'')
  end
say s

ลองออนไลน์!

วิธีการทำงาน: จดตัวอักษรที่ถูกต้องดูว่าจำนวนครั้งที่เกิดขึ้นเป็นเท่าหรือคี่ (ซึ่งยังเป็นค่าความจริงเป็นสองเท่า) และหากคี่ให้เพิ่มลงในสตริงเอาต์พุต จากนั้นลบจดหมายทั้งหมดที่เกิดขึ้นจากสายป้อน ทำซ้ำจนกว่าจะหมดอินพุต



0

Java 8, 93 ไบต์

แลมบ์ดาจากไปString Stringเพียงการใช้งานของรหัสเทียมในคำถาม

s->{String o="";for(char c:s.toCharArray())o=o.indexOf(c)<0?o+c:o.replace(c+"","");return o;}

ลองออนไลน์

Java 8, 182 ไบต์

นี่คือแลมบ์ดาประเภทเดียวกันที่ใช้สตรีม! มันอาจมีประสิทธิภาพมากกว่า

s->s.join("",s.chars().mapToObj(c->(char)c+"").filter(c->s.replaceAll("[^"+c+"]","").length()%2>0).distinct().sorted((c,d)->s.lastIndexOf(c)-s.lastIndexOf(d)).toArray(String[]::new))

ลองออนไลน์

Ungolfed

s ->
    s.join(
        "",
        s.chars()
            .mapToObj(c -> (char) c + "")
            .filter(c -> s.replaceAll("[^" + c + "]", "").length() % 2 < 0)
            .distinct()
            .sorted((c, d) -> s.lastIndexOf(c) - s.lastIndexOf(d))
            .toArray(String[]::new)
    )

0

R , 70 ไบต์

function(s){for(i in utf8ToInt(s))F=c(F[F!=i],i*!i%in%F);intToUtf8(F)}

ลองออนไลน์!

ฉันได้รับการสนับสนุนจาก djhurio เพื่อโพสต์โซลูชันนี้ คำตอบของ djhurio สามารถพบได้ที่นี่ที่นี่

สิ่งนี้ใช้แนวคิดเดียวกันกับคำตอบของ duckmayrแต่ใช้ประโยชน์จากวิธีการเชิงตัวเลขโดยการแปลงสตริงเป็น codepoints แทนที่จะแยกเป็นอักขระและเป็นฟังก์ชันแทนที่จะเป็นโปรแกรมเต็มรูปแบบดังนั้นจึงสามารถส่งคืนสตริงใหม่แทนที่จะพิมพ์ไปยัง stdout .

function(s) {
 for(i in utf8ToInt(s))           # convert string to codepoints and iterate over it
  F=c(F[F!=i],                    # remove duplicates and append
      i*!i%in%F)                  # 0 if in F, i otherwise
 intToUtf8(F)                     # collapse from codepoints to string
}

หนึ่งสังเกตที่สำคัญคือการที่Fจะเริ่มต้นการFALSEหรือ0และutf8ToInt(0)==""ดังนั้นนี้จะประสบความสำเร็จสำหรับสตริงที่ว่างเปล่าเช่นเดียวกับการได้อย่างถูกต้องยุบ codepoints


0

PHP, 71 + 1 ไบต์

while(~$c=$argn[$i++])$s=strstr($s,$c)?strtr($s,[$c=>""]):$s.$c;echo$s;

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์



0

SNOBOL4 (CSNOBOL4) , 97 95 ไบต์

	S =INPUT
N	S LEN(1) . C REM . S :F(O)
	O C :S(R)
	O =O C :(N)
R	O C =:S(R)F(N)
O	OUTPUT =O
END

ลองออนไลน์!

	S =INPUT			;* read input
N	S LEN(1) . C REM . S :F(O)	;* take the first character of S and assign it to C,
					;* assign the remainder to S, and if S has no characters left, goto O
	O C :S(R)			;* if C matches anything in O, goto R, otherwise go to next line
	O =O C :(N)			;* append C to O and goto N
R	O C =:S(R)F(N)			;* as long as C matches O, replace it with ''
					;* (unassigned variables default to the null string)
					;* then goto N once it fails to match
O	OUTPUT =O			;* output the string
END					;* terminate the program
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.