Làm suy yếu một chuỗi


39

Rất nhiều ngôn ngữ có các cách tích hợp để loại bỏ các bản sao hoặc "lặp lại" hoặc "duy nhất" một danh sách hoặc chuỗi. Một nhiệm vụ ít phổ biến hơn là "phá vỡ" một chuỗi. Đó là, đối với mỗi nhân vật xuất hiện, hai lần xuất hiện đầu tiên được giữ lại.

Dưới đây là một ví dụ trong đó các ký tự nên được xóa được gắn nhãn ^:

aaabcbccdbabdcd
  ^    ^ ^^^ ^^
aabcbcdd

Nhiệm vụ của bạn là thực hiện chính xác thao tác này.

Quy tắc

Đầu vào là một chuỗi, có thể trống ,. Bạn có thể cho rằng nó chỉ chứa các chữ cái viết thường trong phạm vi ASCII.

Đầu ra phải là một chuỗi với tất cả các ký tự được loại bỏ đã xuất hiện ít nhất hai lần trong chuỗi (vì vậy hầu hết hai lần xuất hiện bên trái được giữ lại).

Thay vì các chuỗi bạn có thể làm việc với danh sách các ký tự (hoặc chuỗi đơn), nhưng định dạng phải nhất quán giữa đầu vào và đầu ra.

Bạn có thể viết chương trình hoặc chức năng và sử dụng bất kỳ phương pháp tiêu chuẩn nào để nhận đầu vào và cung cấp đầu ra.

Bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào , nhưng lưu ý rằng các lỗ hổng này bị cấm theo mặc định.

Đây là , vì vậy câu trả lời hợp lệ ngắn nhất - được đo bằng byte - thắng.

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

Mỗi cặp dòng là một trường hợp thử nghiệm, đầu vào tiếp theo là đầu ra.



xxxxx
xx
abcabc
abcabc
abcdabcaba
abcdabc
abacbadcba
abacbdc
aaabcbccdbabdcd
aabcbcdd

Bảng xếp hạng

Đoạn trích Stack ở cuối bài này tạo ra bảng xếp hạng từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


5
Chuỗi đơn ... chuỗi ký tự?
dkudriavtsev

Câu trả lời:



15

JavaScript (ES6), 42 48

Chỉnh sửa 6 byte đã lưu thx @Neil

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

Giải thích: Tôi sử dụng các thuộc tính 'a' ... 'z' của đối tượng kđể lưu trữ thông tin cho từng ký tự (đối tượng k là một biểu thức chính trong trường hợp này chỉ để lưu byte). Những tính chất này ban đầu undefined. Trong javascript thêm một số để undefinedcung cấp NaN(khá hợp lý), nhưng thêm một chuỗi 'X' cho "undefinedX"- một chuỗi có độ dài 10 (ngớ ngẩn). Thêm nhiều ký tự bạn sẽ có được chuỗi dài hơn. Nếu chuỗi thu được cho một ký tự đã cho dài hơn 11, ký tự đó không được sao chép sang đầu ra.

Kiểm tra

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)


Nói đúng ra một dòng trống là một trong những trường hợp thử nghiệm.
Neil

@Neil ok đã thêm kiểm tra chuỗi trống
edc65

Nếu bạn chuyển sang đầu vào và đầu ra mảng, bạn có thể sử dụng .filter để lưu thêm 12 ký tự. v=>v.filter(x=>!(v[x]+=x)[11]). Kudos về vụ hack "không xác định".
Grax32

@Grax thanx nhưng quá khác biệt. Nên tự đăng nó
edc65

14

Python 2, 48 byte

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

c[r.count(c)/2:]là một thay thế có cùng chiều dài c*(r.count(c)<2).


49 byte:

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

12

Võng mạc , 17 byte

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

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

Thay thế regex đơn giản - khớp với một ký tự nếu nó đã xuất hiện hai lần và xóa nó.


Tôi cũng đã thử một vòng lặp và một nhóm lặp lại với{2} cả hai byte 18.
Kobi

1
Tôi đã có 14 bằng cách sử dụng một tính năng được thêm gần đây. ;)
Martin Ender

Tôi biết có một cái gì đó. Tôi nhìn vào giới hạn, có lẽ không phải cái đó. Tôi sẽ kiểm tra lại.
Kobi

3
Ah, tôi nghĩ rằng tôi đã tìm thấy câu trả lời của Martin. Tôi đã gặp một số rắc rối khi tôi đã thử trước đây, tôi nghĩ bởi vì tôi đã không xem xét việc sao chép sẽ hoạt động như thế nào trên đầu vào nhiều dòng. Spoiler (có thêm 5 byte để bật chế độ trên mỗi dòng): retina.tryitonline.net/iêu
FryAmTheEggman

@FryAmTheEggman - Thật tuyệt, tôi đã không tìm thấy cái này. Vui lòng thêm câu trả lời - Tôi nghĩ rằng điều này quá khác so với câu trả lời của tôi và tôi không cảm thấy thoải mái khi chỉnh sửa nó :P. Cảm ơn!
Kobi

6

Brachylog , 25 byte

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

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Điều này hoạt động bởi vì s - Subsetsẽ thống nhất với các tập con lớn hơn trước, do đó, ví dụ như "aaa"nó sẽ thử "aa"trước "a".

  • Vị ngữ chính:

      .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
    
  • Vị ngữ 1: Kiểm tra xem tất cả các ký tự chỉ xuất hiện tối đa hai lần. Đầu vào =[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
    
  • Vị ngữ 2: Nhận sự xuất hiện của một nhân vật. Đầu vào =[String:Char]

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

6

> <> , 22 byte

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

Hãy thử trực tuyến! Sử dụng codebox để theo dõi số lượng cho đến nay.

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 byte

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

Điều này xác định một hàm đơn âm nhận và trả về một chuỗi. Hãy thử nó ở đây . Sử dụng:

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

Giải trình

Tôi đã chuyển sang cùng một thuật toán mà một số giải pháp khác sử dụng, vì nó hóa ra ngắn hơn ...

#~(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 byte

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

Ví dụ sử dụng: foldl(\s c->s++[c|filter(==c)s<=[c]])"" "aaabcbccdbabdcd"-> "aabcbcdd".

Giữ char tiếp theo cnếu chuỗi của tất cả các cs cho đến nay là từ vựng ít hơn hoặc bằng chuỗi singleton [c].

Chỉnh sửa: @xnor đã lưu một byte bằng cách chuyển từ hiểu danh sách sang filter. Cảm ơn!


Sự thay thế của bạn có thể làm filter(==c)s<=[c]để tiết kiệm một byte.
xnor

5

Perl, 22 byte

Mã 21 byte + 1 cho -p.

s/./$&x(2>${$&}++)/ge

Sử dụng

perl -pe 's/./$&x(2>${$&}++)/ge' <<< 'aaabcbccdbabdcd'
aabcbcdd

5

C, 57 byte

Gọi f()với chuỗi để giải mã. Hàm sửa đổi tham số của nó. Yêu cầu C99 vì forkhai báo -loop.

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

Bạn không thể đưa tuyên bố svào tuyên bố đầu tiên của for?
Martin Ender

Trong C99 bạn có thể. Tôi chỉ không làm vì tôi thích giữ cho golf C89 tương thích.
owacoder

5

JavaScript (ES6), 35 byte

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

Lấy một mảng các ký tự làm đầu vào và trả về mảng bị biến dạng.


Tốt đẹp. Bạn có thể làm c=>(s[c]=-~s[c])<3để tiết kiệm một vài byte.
Sản phẩm ETH

Tôi đã bỏ lỡ rằng bạn có thể sử dụng mảng làm đầu vào và đã viết một hàm bằng cách sử dụng map. Chơi golf về cơ bản giống như của bạn. sự khác biệt chính là sự phân công, nếu bạn chuyển nó sẽ tiết kiệm được một vài byte. Hãy thử s.filter(c=>(s[c]=s[c]+1|0)<3)cho 33 byte. EDIT: Rất tiếc, bỏ lỡ những nhận xét ở trên tôi, mà thậm chí còn tốt hơn :)
Jan

4

PowerShell v2 +, 31 byte

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

Sử dụng regex giống như trong câu trả lời Retina của Kobi's , chỉ được gói gọn trong -replacetoán tử PowerShell . Hoạt động vì cả hai đang sử dụng regex hương vị .NET trong nền.

Ngoài ra, không có regex, 56 byte

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

Tạo một mảng trợ giúp $bđược điền trước bằng 0s. Diễn biến chuỗi đầu vào $args[0]dưới dạng char-array, dẫn nó qua một vòng lặp |%{...}. Mỗi lần lặp lại xuất ra ký tự hiện tại $_dưới dạng một chuỗi "$_"nhân với Boolean chỉ $TRUE(được đặt ngầm 1ở đây) nếu điểm thích hợp trong mảng trình trợ giúp nhỏ hơn 2(nghĩa là chúng ta chưa thấy char này hai lần). Tập hợp các chuỗi kết quả được gói gọn trong parens và -joined với nhau để tạo thành một chuỗi đầu ra duy nhất. Đó là còn lại trên đường ống và đầu ra là ẩn.


regex là vô địch. :) Tôi tin rằng một hashtable là tốt hơn sau đó một mảng cho biến thể không có regex : $b=@{};-join($args|% t*y|?{++$b.$_-lt3}).
mê mẩn

1
@mazzy Đối với biến thể không có regex và mã của bạn, nó sẽ cần phải là phiên bản mới hơn PowerShell 2. Kết quả là, tôi nghĩ rằng tôi sẽ giữ câu trả lời này mà không thay đổi. Bạn có thể gửi mã của bạn như là một câu trả lời riêng biệt, mặc dù!
admBorkBork

hashtable có xuất hiện trong phiên bản 3.0 không? Được. Cảm ơn.
mê mẩn

4

Toán học, 39 byte

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

Chức năng ẩn danh. Lấy danh sách ký tự làm đầu vào và trả về danh sách tách rời làm đầu ra. Sử dụng phương pháp gấp trong danh sách và từ chối các phần tử ba lần, nó không quá phức tạp.



4

MATL , 8 byte

t&=Rs3<)

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

Giải trình

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

Thí dụ

Giả sử đầu vào 'aaababbc', ngăn xếp chứa các mục sau đây sau các câu lệnh được chỉ định:

  • 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

Võng mạc , 14 byte

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

Xác nhận tất cả các trường hợp thử nghiệm. ( %Chế độ cho phép trên mỗi dòng)

Sử dụng giai đoạn "Ded repeatate" mới để lưu một vài byte theo cách tiếp cận của Kobi . Ded repeatate tập hợp một danh sách tất cả các kết quả khớp với biểu thức chính quy và thay thế tất cả trừ phần đầu tiên bằng chuỗi rỗng. Regex khớp với một ký tự đã xuất hiện một lần trong chuỗi, nghĩa là hai ký tự đầu tiên sẽ được giữ lại.



3

K, 18 byte

  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 có sẵn để tải về miễn phí ; K6 đang được phát triển . Nếu bạn đã tải xuống KDB, bạn có thể truy cập K bằng dấu gạch chéo ngược .

Có thể dễ dàng nhất để thấy điều này bị phá vỡ, nhưng trước tiên một số cú pháp: g:xđặt gthành x. {x+1}là một hàm lấy một đối số x . Trong K, đối số thứ nhất cho hàm là x(thứ hai là yvà thứ ba làz . Không cần thứ tư).

Hiện nay:

x:"aaabcbccdbabdcd"

=xcó nghĩa là nhóm x , tạo ra:

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

2#'có nghĩa là hai lấy (từ) mỗi cái tạo ra

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

Như bạn có thể thấy, đây là những điểm trừ của hai trận đấu đầu tiên của mỗi nhân vật. Các 2 có thể được khái quát hóa.

,/có nghĩa là tham gia mỗi và thường được gọi là raze . Nó sẽ giúp chúng ta chỉ là những giá trị của từ điển của chúng tôi. Do đó, ,/"abcd"!(0 1;3 5;4 6;8 12)tạo ra:

0 1 3 5 4 6 8 12

mà chúng ta cần sắp xếp. {x@<x}@là một thành ngữ K lập trình viên thường thấy (Q gọi nó là asc ), trong đó nói x ở cấp độ x . Phá vỡ nó ra:

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

trả về các chỉ số của mảng đã sắp xếp mà chúng ta muốn lấy từ mảng ban đầu. x@ycó nghĩa là x tại y nên điều này lập chỉ mục mảng với các chỉ số của sắp xếp (nếu điều đó có ý nghĩa gì).

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

mà bây giờ chúng ta chỉ cần lập chỉ mục vào mảng ban đầu của chúng tôi. Chúng ta có thể nói x@ở đây, nhưng K hỗ trợ một khái niệm thực sự mạnh mẽ mà chúng ta có thể tận dụng ở đây: ứng dụng chức năng là lập chỉ mục. Điều đó có nghĩa là a[0]có thể tìm kiếm vị trí zeroth của ahoặc nó có thể áp dụng 0chức năng được gọi a. Lý do chúng tôi cần @trước đây {x@<x}là vì x<ycó nghĩa là xs nhỏ hơn ys : Các toán tử trong K có dạng dyadic (hai đối số) và một dạng đơn âm (một đối số) xuất phát từ APL. Q không có "sự tương đồng" này.


Chào mừng đến với PPCG! Câu trả lời tuyệt vời đầu tiên. :)
Martin Ender

Tôi có một vài câu hỏi. 1. K4 có cùng ngôn ngữ với ngôn ngữ bạn liên kết đến (Q / kdb +) không? 2. Bạn có thể chỉ cho bạn cách gọi chức năng của bạn trên đầu vào không hoặc định dạng các mục trong testVector.txt như thế nào?
Dennis

@Dennis 1. Có. Nhấn dấu gạch chéo ngược để đi từ Q đến K. 2. Giống như chúng xuất hiện trong câu hỏi: pastebin.com/ftHe0bpE gọi ví dụ:g"aaabcbccdbabdcd"
geocar

Được rồi cảm ơn. Không thể làm cho phần tập tin hoạt động, nhưng g"..."thực hiện thủ thuật. Thật không may, mã của bạn trả về aabbcccho đầu vào abc.
Dennis

@Dennis Bạn có thể đã làm điều gì đó sai: {x{?x@<x}@,/2#'=x}"abc"chắc chắn trở lại "abc". Nó sẽ trở lại "aabbcc"nếu bạn bỏ lỡ sự ?khác biệt.
geocar

2

Python 2, 51 byte

f=lambda s:s and f(s[:-1])+s[-1]*(s.count(s[-1])<3)

Kiểm tra nó trên Ideone .


2

Java 8 lambda, 90 ký tự

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

Phiên bản bị đánh cắp:

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

Tạo một mảng cho tất cả các ký tự ascii. Nếu một nhân vật xảy ra, bộ đếm tương ứng sẽ được tăng lên. Nếu quá 2, ký tự sẽ không được thêm vào chuỗi kết quả. Rất dễ, rất ngắn;)


2

Perl 6, 27 byte

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

Giải trình:

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

(Lưu ý: Perl 6 không phải là "định hướng chơi gôn" như chị em của nó Perl 5 ... Vì vậy, không gian đó trước khi <cần thiết. Đây %.{}là một hàm băm ẩn danh).



2

SmileBASIC, 77 72 69 68 byte

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

Giải thích:

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

Chào mừng bạn đến với ppcg! Bài đăng đầu tiên rất hay!
Rɪᴋᴇʀ

1

Lisp thường gặp, 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)

In đẹp

(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

Q , 52 byte

q)f2:{x asc raze{distinct 2#where x}each x~'/:distinct x}
q)f2 each testList
"xx"
"abcabc"
"abcdabc"
"abacbdc"
"aabcbcdd"
q)

1

K , 27 byte

    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 byte

Điều này khá khó sử dụng, nhưng tôi không chắc là tôi có thể chơi golf tốt hơn nhiều vào lúc này. Bất kỳ đề nghị chơi golf đều được chào đón. Hãy thử trực tuyến!

Chỉnh sửa: -17 byte nhờ Value Ink bằng cách đề xuất một cách chơi gôn để loại bỏ các ký tự ba lần. -5 byte từ việc loại bỏ .uniqphương thức.

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

Ung dung:

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 byte:->s{s.chars.uniq.map{|a|s[s.rindex a]=""while s.count(a)>2};s}
Mực giá trị

1

JavaScript, 30 byte

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

Sử dụng phương pháp mà @ edc65 đã đưa ra để đếm nhưng với bộ lọc mảng. Ký tự lần đầu tiên xuất hiện, giá trị đối tượng được "không xác định" cộng với ký tự (tức là "không xác định"). Lần sau, giá trị đối tượng trở thành "không xác định".

Sau đó, v [x] [11] trả về true và khi kết hợp với toán tử không, false, nghĩa là các ký tự đã xuất hiện hai lần sẽ được lọc.


0

Javascript (sử dụng thư viện bên ngoài) (80 byte)

Đây là một trong những tốt! Không thắng nhưng thật vui

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

Liên kết đến lib: https://github.com/mvegh1/Enumerable/

Giải thích mã: Phương thức chấp nhận một chuỗi, thư viện phân tích cú pháp dưới dạng mảng char và mệnh đề Where là một biến vị ngữ lọc phức tạp để kiểm tra hàm băm 'a' cho sự hiện diện của char hiện tại. Nếu tồn tại, bộ đếm tăng, khác được đặt thành 1. Nếu <2, biến vị ngữ (và char hiện tại) vượt qua, khác không thành công

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


Bạn có thể tránh sử dụng returnnhưng làm cho hàm của bạn thành một danh sách các biểu thức được phân tách bằng dấu phẩy trong ngoặc đơn : n=>(a={},_From(n)....). Biểu thức cuối cùng là giá trị trả về. Trong Wherechức năng của bạn , bạn có thể loại bỏ bhoàn toàn trung gian bằng cách so sánh với kết quả của việc gán hoặc tăng : x=>(a[x]?a[x]++:a[x]=1)<2.
apsillers

Cuối cùng, bạn có thể tránh sử dụng một thư viện bên ngoài (và lưu byte) bằng cách sử dụng dấu chấm lửng phân tách chuỗi và filtervới join: [...n].filter(...).join(""). Lật logic đúng / sai khi thay đổi Wherethành filter.
apsillers

Ahh quan sát tốt! Tôi sẽ xem xét kỹ hơn về đề xuất của bạn
applejacks01

0

Clojure, 72 byte

#(apply str(reduce(fn[r c](if(<(count(filter #{c}r))2)(conj r c)r))[]%))

Quá nhiều byte ...


0

Pascal (FPC) , 103 byte

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.

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

Giải trình:

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