ตรวจสอบสตริง


39

หลายภาษามีวิธีการในการกำจัดรายการที่ซ้ำกันหรือ "deduplicate" หรือ "uniquify" รายการหรือสตริง งานทั่วไปที่น้อยกว่าคือ "detriplicate" สตริง นั่นคือสำหรับตัวละครทุกตัวที่ปรากฏขึ้นสองเหตุการณ์แรกจะถูกเก็บไว้

นี่คือตัวอย่างที่ตัวละครที่ควรลบจะมีป้ายกำกับด้วย^:

aaabcbccdbabdcd
  ^    ^ ^^^ ^^
aabcbcdd

งานของคุณคือการใช้การดำเนินการนี้อย่างแน่นอน

กฎระเบียบ

อินพุตเป็นสตริงเดี่ยวอาจว่างเปล่า คุณอาจคิดว่ามันมีตัวอักษรตัวพิมพ์เล็กในช่วง ASCII เท่านั้น

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

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

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นและใช้วิธีการมาตรฐานของเราในการรับอินพุตและให้เอาต์พุต

คุณอาจใช้ภาษาการเขียนโปรแกรมใด ๆแต่โปรดทราบว่าช่องโหว่เหล่านี้เป็นสิ่งต้องห้ามตามค่าเริ่มต้น

นี่คือดังนั้นคำตอบที่สั้นที่สุดที่ถูกต้อง - วัดเป็นไบต์ - ชนะ

กรณีทดสอบ

คู่ของเส้นทุกคู่เป็นหนึ่งกรณีทดสอบ, อินพุตตามด้วยเอาต์พุต



xxxxx
xx
abcabc
abcabc
abcdabcaba
abcdabc
abacbadcba
abacbdc
aaabcbccdbabdcd
aabcbcdd

ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างกระดานแต้มนำจากคำตอบ a) เป็นรายการโซลูชันสั้นที่สุดต่อภาษาและ b) เป็นกระดานแต้มนำ

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

## Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

## Perl, 43 + 3 (-p flag) = 45 bytes

คุณสามารถทำให้ชื่อภาษาเป็นลิงค์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


5
สายเดี่ยว ... stringletons?
dkudriavtsev

คำตอบ:



15

JavaScript (ES6), 42 48

แก้ไข A มหันต์ 6 ไบต์บันทึก thx @Neil

s=>s.replace(k=/./g,c=>(k[c]+=c)[11]?'':c)

คำอธิบาย: ฉันใช้คุณสมบัติ 'a' ... 'z' ของวัตถุkเพื่อเก็บข้อมูลสำหรับอักขระแต่ละตัว (วัตถุ k เป็น regexp ในกรณีนี้เพื่อบันทึกไบต์เท่านั้น) undefinedคุณสมบัติเหล่านี้เป็นครั้งแรก ในจาวาสคริปต์เพิ่มจำนวนที่จะundefinedให้NaN(ค่อนข้างสมเหตุสมผล) แต่เพิ่มสตริง 'X' ให้"undefinedX"- สตริงที่มีความยาว 10 (โง่) การเพิ่มตัวอักษรมากขึ้นคุณจะได้รับสายยาว หากสตริงที่ได้รับสำหรับอักขระที่กำหนดมีความยาวมากกว่า 11 อักขระนั้นจะไม่ถูกคัดลอกไปยังเอาต์พุต

ทดสอบ

F=
s=>s.replace(k=/./g,c=>(k[c]+=c)[11]?'':c)

test=`

xxxxx
xx
abcabc
abcabc
abcdabcaba
abcdabc
abacbadcba
abacbdc
aaabcbccdbabdcd
aabcbcdd`.split`\n`
for(i=0;i<test.length;)
  a=test[i++],b=test[i++],r=F(a),
  console.log(r==b?'OK':'KO',a,'->',r,b)


การพูดอย่างบรรทัดว่างเป็นหนึ่งในกรณีทดสอบ
Neil

@Neil ok เพิ่มการทดสอบสตริงที่ว่างเปล่า
edc65

หากคุณสลับไปยังอินพุตและเอาต์พุตของอาร์เรย์คุณสามารถใช้. ฟิลเตอร์เพื่อบันทึกอักขระได้อีก 12 ตัว v=>v.filter(x=>!(v[x]+=x)[11]). รุ่งโรจน์ในการแฮ็ค "undefined"
Grax32

@ Grax thanx แต่แตกต่างเกินไป ควรโพสต์ด้วยตัวเอง
edc65

14

Python 2, 48 ไบต์

lambda s:reduce(lambda r,c:r+c*(r.count(c)<2),s)

c[r.count(c)/2:]c*(r.count(c)<2)เป็นแบบเดียวกันที่มีความยาวทางเลือกในการ


49 ไบต์:

r=''
for c in input():r+=c*(r.count(c)<2)
print r

12

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

(.)(?<=\1.*\1.+)

ลองออนไลน์!

การแทนที่ regex แบบง่าย - จับคู่อักขระถ้าปรากฏขึ้นสองครั้งแล้วลบออก


ฉันยังลองวนซ้ำและกลุ่มซ้ำด้วย{2}ทั้ง 18 ไบต์
Kobi

1
ฉันมี 14 ใช้คุณลักษณะที่เพิ่งเพิ่ม ;)
Martin Ender

ฉันรู้ว่ามีบางอย่าง ฉันดูที่ขอบเขตซึ่งอาจไม่ใช่แบบนั้น ฉันจะตรวจสอบอีกครั้ง
Kobi

3
อาฉันคิดว่าฉันพบคำตอบของมาร์ตินแล้ว ฉันมีปัญหาเมื่อฉันพยายามมาก่อนฉันคิดว่าเพราะฉันไม่ได้พิจารณาว่าการซ้ำซ้อนจะทำงานกับอินพุตหลายบรรทัดได้อย่างไร สปอยเลอร์ (เพิ่ม 5 ไบต์เพื่อเปิดใช้งานโหมดต่อบรรทัด): retina.tryitonline.net/ …
FryAmTheEggman

@FryAmTheEggman - ดีฉันไม่พบอันนี้ รู้สึกฟรีเพื่อเพิ่มคำตอบ - :Pผมคิดว่านี่จะแตกต่างกันเกินไปจากคำตอบของฉันและฉันไม่ได้รู้สึกสะดวกสบายในการแก้ไข ขอบคุณ!
Kobi

6

Brachylogขนาด 25 ไบต์

.v|s.g:.z:1a
:2fl<3
he~t?

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

งานนี้เพราะs - Subsetจะรวมกันกับส่วนย่อยใหญ่ครั้งแรกจึงเช่นการ"aaa"ก็จะพยายามก่อน"aa""a"

  • ภาคแสดงหลัก:

      .v         input = Output = ""
    |          Or
      s.         Output is an ordered subset of the input
      g:.z       Zip each character of the output with the output itself
      :1a        Apply predicate 1 on each element of the zip
    
  • ภาคที่ 1: ตรวจสอบว่าตัวละครทุกตัวปรากฏได้ไม่เกินสองครั้ง อินพุต =[String:Char]

    :2f        Find all valid outputs of predicate 2 (i.e. one output per occurence
                   of the char)
    l<3        There are less than 3 occurences
    
  • ภาคที่ 2: รับตัวละคร อินพุต =[String:Char]

    he         Take a character of the string in the input
      ~t?      That character is the char of the input
    

6

> <> , 22 ไบต์

i:0(?;::9g:}2(?o{1+$9p

ลองออนไลน์! ใช้กล่องรหัสเพื่อติดตามการนับจนถึงปัจจุบัน

i                       Read a char c of input
 :0(?;                  Halt if EOF
      :                 Make a copy - stack has [c c] at the top
       :9g              Get count stored at (c, 9)
          :}            Copy the count and move to bottom of stack
            2(?o        If the count is less than 2, output c
                {1+     Move the count back to the top of the stack and increment
                   $9p  Update cell at (c, 9)
                        [Instruction pointer moves to start as ><> is toroidal]

6

J, 20 15 ไบต์

#~(3>[+/@:={:)\

สิ่งนี้นิยามฟังก์ชัน monadic ที่รับและส่งคืนสตริง ลองได้ที่นี่ การใช้งาน:

   f =: #~(3>[+/@:={:)\
   f 'abaacbb'
abacb

คำอธิบาย

ฉันเปลี่ยนไปใช้อัลกอริทึมแบบเดียวกันกับที่โซลูชันอื่นใช้เนื่องจากจะสั้นกว่า ...

#~(3>[+/@:={:)\  Input is y.
  (          )\  For each prefix of y:
          =        compute the equality vector
     [     {:      of the prefix and its last element, and
      +/@:         take its sum. Now we have a vector r such that y[i] has its
                   r[i]'th occurrence at position i.
   3>              Mark those coordinates where r[i] < 3.
#~               Remove the non-marked characters from y.

6

Haskell, 40 39 ไบต์

foldl(\s c->s++[c|filter(==c)s<=[c]])""

ตัวอย่างการใช้งาน: ->foldl(\s c->s++[c|filter(==c)s<=[c]])"" "aaabcbccdbabdcd""aabcbcdd"

เก็บถ่านถัดไปcถ้าสตริงของทุกcs เพื่อให้ห่างไกลมี lexicographical [c]น้อยกว่าหรือเท่ากับสตริงเดี่ยว

แก้ไข: @xnor filterบันทึกไบต์โดยการเปลี่ยนจากรายการที่จะเข้าใจ ขอบคุณ!


ทางเลือกของคุณสามารถทำได้filter(==c)s<=[c]เพื่อบันทึกไบต์
xnor


5

C, 57 ไบต์

โทรf()ด้วยสายอักขระเพื่อ detriplicate ฟังก์ชั่นปรับเปลี่ยนพารามิเตอร์ของมัน ต้องการ C99 เนื่องจากการforประกาศ -loop

f(char*p){for(char*s=p,m[256]={0};*s=*p;s+=++m[*p++]<3);}

คุณไม่สามารถใส่การประกาศของsลงในคำสั่งแรกของfor?
Martin Ender

ใน C99 คุณสามารถ ฉันไม่ได้เพราะฉันชอบที่จะทำให้กอล์ฟเข้ากันได้กับ C89
owacoder

5

JavaScript (ES6), 35 ไบต์

s=>s.filter(c=>(s[c]=(s[c]|0)+1)<3)

รับค่าอาร์เรย์ของอักขระเป็นอินพุตและส่งคืนอาร์เรย์ที่ตรวจพบ


ดี คุณสามารถทำได้c=>(s[c]=-~s[c])<3เพื่อบันทึกไม่กี่ไบต์
ETHproductions

ฉันพลาดที่คุณสามารถใช้อาร์เรย์เป็น input mapและได้เขียนฟังก์ชั่นการใช้ Golfed มันดูเหมือนหลักของคุณ ความแตกต่างที่สำคัญคือการกำหนดซึ่งถ้าคุณจะสลับไปมาจะบันทึกไม่กี่ไบต์ ลองs.filter(c=>(s[c]=s[c]+1|0)<3)33 ไบต์ แก้ไข: อ๊ะพลาดความคิดเห็นข้างต้นฉันดียิ่งขึ้น :)
ม.ค.

4

PowerShell v2 +, 31 ไบต์

$args-replace'(.)(?<=\1.*\1.+)'

ใช้ regex เช่นเดียวกับในคำตอบ Retina ของ Kobiเพียงแค่หุ้มในตัว-replaceดำเนินการPowerShell ทำงานได้เนื่องจากทั้งคู่กำลังใช้. NET-flavor regex ในพื้นหลัง

หรือมิฉะนั้นจะไม่มี regex ขนาด 56 ไบต์

$b=,0*200;-join([char[]]$args[0]|%{"$_"*($b[$_]++-lt2)})

สร้างอาร์เรย์ผู้ช่วยที่$bเติมไว้ล่วงหน้าด้วย0s ดุจสายป้อน$args[0]เป็นchar-array |%{...}ท่อมันผ่านห่วง การวนซ้ำแต่ละครั้งจะแสดงอักขระปัจจุบัน$_เป็นสตริงที่"$_"คูณด้วยบูลีนที่มีเฉพาะ$TRUE( เฉพาะ1ที่นี่) หากจุดที่เหมาะสมในอาร์เรย์ผู้ช่วยน้อยกว่า2(เช่นเราไม่เคยเห็นอักขระนี้สองครั้ง) คอลเลกชันผลลัพธ์ของสตริงถูกห่อหุ้มใน parens และ-joined ร่วมกันในรูปแบบสตริงออกเดียว ที่เหลืออยู่บนไปป์ไลน์และเอาท์พุทเป็นนัย


regex ไม่สามารถเอาชนะได้ :) ฉัน beleave Hashtable ดีขึ้นแล้วอาร์เรย์ที่แตกต่างโดยไม่ต้อง regex $b=@{};-join($args|% t*y|?{++$b.$_-lt3})นี้:
mazzy

1
@mazzy สำหรับตัวแปรที่ไม่มี regex และรหัสของคุณมันจะต้องเป็นเวอร์ชั่นใหม่กว่า PowerShell 2 ดังนั้นฉันคิดว่าฉันจะเก็บคำตอบนี้ไว้โดยไม่มีการเปลี่ยนแปลง คุณสามารถโพสต์รหัสของคุณเป็นคำตอบแยกต่างหากได้!
AdmBorkBork

hashtable ปรากฏในรุ่น 3.0 หรือไม่ ตกลง. ขอบคุณ
mazzy

4

Mathematica ขนาด 39 ไบต์

Fold[If[Count@##<2,Append@##,#]&,{},#]&

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



4

MATL , 8 ไบต์

t&=Rs3<)

ลองออนไลน์!

คำอธิบาย

t      % Input string implicitly. Push another copy
&=     % Matrix of all pairwise equality comparisons of string elements
R      % Keep only upper triangular part, making the rest of the entries zero
s      % Sum of each column. This gives a vector with number of occurrences
       % of the current character up to the current position
3<     % True for entries that are less than 3
)      % Use as logical index into initial copy of the input. Display implicitly

ตัวอย่าง

สมมติว่าอินพุต'aaababbc'สแต็กมีข้อมูลต่อไปนี้หลังจากคำสั่งที่ระบุ:

  • t

    'aaababbc'
    'aaababbc'
    
  • t&=

    'aaababbc'
    [ 1 1 1 0 1 0 0 0;
      1 1 1 0 1 0 0 0;
      1 1 1 0 1 0 0 0;
      0 0 0 1 0 1 1 0;
      1 1 1 0 1 0 0 0;
      0 0 0 1 0 1 1 0;
      0 0 0 1 0 1 1 0;
      0 0 0 0 0 0 0 1 ]
    
  • t&=R

    'aaababbc'
    [ 1 1 1 0 1 0 0 0;
      0 1 1 0 1 0 0 0;
      0 0 1 0 1 0 0 0;
      0 0 0 1 0 1 1 0;
      0 0 0 0 1 0 0 0;
      0 0 0 0 0 1 1 0;
      0 0 0 0 0 0 1 0;
      0 0 0 0 0 0 0 1 ]
    
  • t&=Rs

    'aaababbc'
    [ 1 2 3 1 4 2 3 1 ]
    
  • t&=Rs3<

    'aaababbc'
    [ true true false true false true false true ]
    
  • t&=Rs3<)

    'aabbc'
    

4

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

D`(.)(?<=\1.*)

ตรวจสอบกรณีทดสอบทั้งหมด ( %โหมดเปิดใช้งานต่อบรรทัด)

ใช้เวทีใหม่ "deduplicate" เพื่อบันทึกคู่ไบต์มากกว่าวิธี Kobi ของ Deduplicate รวบรวมรายการการแข่งขันทั้งหมดไปยัง regex และแทนที่ทั้งหมดยกเว้นรายการแรกด้วยสตริงว่าง regex ตรงกับตัวอักษรที่ปรากฏขึ้นหนึ่งครั้งในสตริงซึ่งหมายความว่าทั้งสองจะถูกเก็บไว้



3

K, 18 ไบต์

  g:{x{?x@<x}@,/2#'=x}
  g "abc"
"abc"
  g "aaabcbccdbabdcd"
"aabcbcdd"

  /k4 request test vectors from internet
  R:"GET /raw/ftHe0bpE HTTP/1.0\r\nHost: pastebin.com\r\n\r\n"
  t:+0N 2#t@1_&|\(0=#:)'t:1_"\r\n"\:`:http://pastebin.com:80 R 

  /k4 no internet? use a file called "t.txt" in current directory
  t:+0N 2#0:`:t.txt

  /k6?
  t:+0N 2#0:"t.txt"

  /visually inspect test cases
  g't[0]
(();"xx";"abcabc";"abcdabc";"abacbdc";"aabcbcdd")

  /do all tests pass?
  |/ t[1] {$[0=#x;0=#y;x~y]}' g't[0]
1b

K4 สามารถใช้ได้สำหรับการดาวน์โหลดฟรี ; K6 เป็นในการพัฒนา หากคุณได้ดาวน์โหลด KDB คุณสามารถได้รับใน K กับทับขวา

มันอาจจะง่ายที่สุดในการเห็นนี้แยกออกจากกัน แต่แรกไวยากรณ์บางg:xชุดจะg เป็นฟังก์ชั่นซึ่งจะนำอาร์กิวเมนต์x ใน K อาร์กิวเมนต์แรกของฟังก์ชันคือ(ตัวที่สองคือและตัวที่สามคือไม่ต้องใช้ตัวที่สี่)x{x+1}xyz

ขณะนี้:

x:"aaabcbccdbabdcd"

=xหมายถึงกลุ่ม xซึ่งผลิต:

"abcd"!(0 1 2 10;3 5 9 11;4 6 7 13;8 12 14)

2#'หมายถึงสอง (จาก) แต่ละที่ผลิต

"abcd"!(0 1;3 5;4 6;8 12)

อย่างที่คุณเห็นนี่เป็นออฟเซ็ตของสองแมชแรกของแต่ละตัวละคร 2อาจจะทั่วไป

,/วิธีการเข้าร่วมแต่ละคนและมักจะเรียกว่าRaze มันจะทำให้เราเห็นคุณค่าของพจนานุกรมของเรา ดังนั้น,/"abcd"!(0 1;3 5;4 6;8 12)ผลิต:

0 1 3 5 4 6 8 12

ซึ่งเราต้องเรียงลำดับ {x@<x}@เป็นสำนวนการเขียนโปรแกรม K มักจะเห็น (Q เรียกมันว่าASC ) ซึ่งกล่าวว่าx ที่ x แยกมันออกจากกัน:

  <0 1 3 5 4 6 8 12
0 1 2 4 3 5 6 7

ส่งกลับดัชนีของอาร์เรย์ที่เรียงลำดับซึ่งเราต้องการนำมาจากอาร์เรย์เดิม x@yหมายถึงx at yดังนั้นดัชนีนี้จึงมีดัชนีพร้อมเรียงลำดับ (ถ้ามีเหตุผล)

  {x@<x}@0 1 3 5 4 6 8 12
0 1 3 4 5 6 8 12

ซึ่งตอนนี้เราก็จัดทำดัชนีในอาร์เรย์ดั้งเดิมของเรา เราสามารถพูดได้x@ที่นี่ แต่ K สนับสนุนแนวคิดที่ทรงพลังมากซึ่งเราสามารถใช้ประโยชน์ได้จากที่นี่: แอปพลิเคชันคือการทำดัชนี นั่นหมายความว่าa[0]อาจจะมองขึ้นไปในช่องข้อที่ศูนย์ของaหรือมันอาจจะใช้ฟังก์ชั่นที่เรียกว่า0 aเหตุผลที่เราต้องการใน@ก่อนหน้า{x@<x}นี้เพราะx<yหมายถึงxs น้อยกว่า ys : ผู้ประกอบการใน K มีรูปแบบ dyadic (สองอาร์กิวเมนต์) และรูปแบบ monadic (หนึ่งอาร์กิวเมนต์) ที่มาจาก APL Qไม่มี "ความสับสน" นี้


ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี :)
Martin Ender

ฉันมีคำถามสองสามข้อ 1. K4 เป็นภาษาเดียวกับภาษาที่คุณเชื่อมโยงกับ (Q / kdb +) หรือไม่ 2.คุณสามารถแสดงวิธีเรียกใช้ฟังก์ชันในอินพุตหรือวิธีจัดรูปแบบรายการใน testVectors.txt ได้อย่างไร
Dennis

@ เดนนิส 1. ใช่ กด backslash เพื่อรับจาก Q ถึง K 2. เช่นเดียวกับที่ปรากฏในคำถาม: pastebin.com/ftHe0bpEตัวอย่างการโทร:g"aaabcbccdbabdcd"
geocar

โอเคขอบคุณ. ไม่สามารถทำให้ส่วนของไฟล์ทำงานได้ แต่g"..."หลอกลวงได้ แต่น่าเสียดายที่รหัสของคุณส่งกลับสำหรับการป้อนข้อมูลaabbcc abc
Dennis

@Dennis คุณอาจมีบางอย่างผิดปกติทำ: ผลตอบแทนที่แน่นอน{x{?x@<x}@,/2#'=x}"abc" "abc"มันจะกลับมา"aabbcc"ถ้าคุณพลาดความ?แตกต่าง
geocar


2

Java 8 lambda, 90 ตัวอักษร

i->{int[]o=new int[128];String r="";for(char c:i.toCharArray())if(++o[c]<3)r+=c;return r;}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

public class Q86503 {

    static String detriplicate(String input) {
        int[] occurences = new int[128];
        String result = "";
        for (char c : input.toCharArray()) {
            if (++occurences[c] < 3) {
                result += c;
            }
        }
        return result;
    }
}

สร้างอาร์เรย์สำหรับอักขระ ASCII ทั้งหมด หากตัวละครเกิดขึ้นเคาน์เตอร์ที่เกี่ยวข้องจะเพิ่มขึ้น หากเกิน 2 ตัวอักษรจะไม่ถูกผนวกเข้ากับสตริงผลลัพธ์ ง่ายมากสั้นมาก;)


2

Perl 6, 27 ไบต์

{.comb.grep({++%.{$_} <3})}

คำอธิบาย:

{.comb.grep({++%.{$_} <3})}
{                         } # a function
 .comb                      # get all the characters in the argument
      .grep({           })  # filter
               %.           # an anonymous hash (shared between calls to grep)
             ++  {$_}       # increment the value at the current key (current letter).
                            # if the key doesn't exist, it defaults to 0 (then gets incremented)
                      <3    # return True if it wasn't seen 3 times

(หมายเหตุ: Perl 6 ไม่เหมือนกับ "golf-oriented" ในฐานะของน้องสาว Perl 5 ... ใช่แล้วพื้นที่นั้นก่อนที่<จำเป็นต้องใช้%.{}มันคือแฮชนิรนาม)



2

SmileBASIC, 77 72 69 68 ไบต์

DIM R[#Y]READ S$WHILE""<S$Q=ASC(S$)INC R[Q]?SHIFT(S$)*(R[Q]<3);
WEND

อธิบาย:

DIM R[128] 'array to store letter frequencies
READ S$ 'get input string
WHILE""<S$ 'much shorter than LEN(S$)
 Q=ASC(S$) 'get ascii value of first character in S$
 INC R[Q]
 ?SHIFT(S$)*(R[Q]<3); 'remove the first character of S$, and print it if there are less than 3 occurrences.
WEND

ยินดีต้อนรับสู่ ppcg! โพสต์แรกที่ดี!
Rɪᴋᴇʀ

1

เสียงกระเพื่อมสามัญ, 127

(lambda(s)(map()(lambda(x)(flet((p(b)(1+(position x s :start b))))(setf s(remove x s :start(p(p 0))))))(remove-duplicates s))s)

พริตตี้พิมพ์

(lambda (s)
  (map nil
       (lambda (x)
         (flet ((p (b)
                  (1+ (position x s :start b))))
           (setf s (remove x s :start (p (p 0))))))
       (remove-duplicates s))
  s)


1

K , 27 ไบต์

    f:{x{x@<x}@,/{?2#&x}'x~'/:?x}
    testList:("xxxxx";"abcabc";"abcdabcaba";"abacbadcba";"aaabcbccdbabdcd")
    f'testList
("xx";"abcabc";"abcdabc";"abacbdc";"aabcbcdd")

1

Ruby , 79 62 57 ไบต์

นี่เป็นเรื่องที่ค่อนข้างเทอะทะ แต่ฉันไม่แน่ใจว่าฉันจะเล่นกอล์ฟได้ดีขึ้นในขณะนี้ คำแนะนำการเล่นกอล์ฟใด ๆ ยินดีต้อนรับ ลองออนไลน์!

แก้ไข: -17 ไบต์ขอบคุณ Value Ink โดยการแนะนำวิธีนักกอล์ฟที่จะลบอักขระสามเท่า -5 ไบต์จากการลบ.uniqวิธีการ

->s{s.chars.map{|a|s[s.rindex a]=""while s.count(a)>2};s}

Ungolfed:

def g(s)
 s.chars.each do |a|
  while s.count(a) > 2
   i = s.rindex(a)
   s[i] = ""
  end
 end
 return s
end

62 ไบต์:->s{s.chars.uniq.map{|a|s[s.rindex a]=""while s.count(a)>2};s}
หมึกมูลค่า

1

JavaScript ขนาด 30 ไบต์

v=>v.filter(x=>!(v[x]+=x)[11])

การใช้วิธีการที่ @ edc65 เกิดขึ้นกับการนับ แต่ด้วยตัวกรองอาร์เรย์ ตัวอักษรครั้งแรกปรากฏขึ้นค่าวัตถุจะได้รับ "undefined" บวกกับตัวอักษร (เช่น "undefinedx") ครั้งต่อไปที่ค่าวัตถุกลายเป็น "undefinedxx"

หลังจากนั้น v [x] [11] จะคืนค่าจริงและเมื่อรวมกับตัวดำเนินการที่ไม่ใช่เท็จความหมายของอักขระที่ปรากฏขึ้นแล้วสองครั้งจะถูกกรอง


0

Javascript (ใช้ไลบรารีภายนอก) (80 ไบต์)

นี่เป็นสิ่งที่ดี! ไม่ชนะ แต่มันก็สนุก

n=>{a={};return _.From(n).Where(x=>{b=a[x]?a[x]++:a[x]=1;return b<2}).Write("")}

ลิงก์ไปยัง lib: https://github.com/mvegh1/Enumerable/

คำอธิบายโค้ด: เมธอดยอมรับสตริงไลบรารีจะแยกวิเคราะห์เป็นอาร์เรย์อาเรย์และส่วนคำสั่งที่ไหนเป็นเพรดิเคตการกรองที่ซับซ้อนซึ่งตรวจสอบ hashmap 'a' เพื่อดูสถานะปัจจุบันของถ่าน ถ้ามีอยู่, ตัวเพิ่มหน่วยความจำ, ตั้งค่าเป็น 1 หาก <2, เพรดิเคต (และถ่านปัจจุบัน) ผ่านไป, อื่น ๆ จะล้มเหลว

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


คุณสามารถหลีกเลี่ยงการใช้แต่ทำให้การทำงานของคุณเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคของการแสดงออกในวงเล็บ:return n=>(a={},_From(n)....)นิพจน์สุดท้ายคือค่าส่งคืน ในคุณWhereฟังก์ชั่นที่คุณสามารถกำจัดกลางทั้งหมดโดยการเปรียบเทียบกับผลของงานหรือเพิ่มขึ้น:b x=>(a[x]?a[x]++:a[x]=1)<2
apsillers

สุดท้ายคุณก็สามารถหลีกเลี่ยงการใช้ห้องสมุดภายนอกที่ทุกคน (และประหยัด bytes) โดยใช้จุดไข่ปลาสตริงแยกและfilterด้วย:join [...n].filter(...).join("")พลิกจริง / เท็จตรรกะเมื่อมีการเปลี่ยนแปลงไปWhere filter
apsillers

ข้อสังเกตที่ดีอ่า! ป่วยลองดูคำแนะนำของคุณในภายหลัง
applejacks01


0

Pascal (FPC) , 103 ไบต์

var a:array['a'..'z']of word;c:char;begin repeat read(c);inc(a[c]);if a[c]<3then write(c)until eof end.

ลองออนไลน์!

คำอธิบาย:

var a:array['a'..'z']of word; //used for counting occurences of characters in the input
                              //array indices are accessed by chars
    c:char;
begin
  repeat
    read(c);                  //read a character from input
    inc(a[c]);                //increment the count of that character (its number in array)
    if a[c]<3 then write(c)   //if this is character's 1st or 2nd occurence, output it
  until eof                   //go back to reading if input is not read completely
end.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.