Lepaskan string

39

Banyak bahasa memiliki cara bawaan untuk menghilangkan duplikat, atau "deduplicate" atau "uniquify" daftar atau string. Tugas yang kurang umum adalah "melumpuhkan" sebuah string. Artinya, untuk setiap karakter yang muncul, dua kejadian pertama disimpan.

Berikut adalah contoh di mana karakter yang harus dihapus diberi label dengan ^:

aaabcbccdbabdcd
  ^    ^ ^^^ ^^
aabcbcdd

Tugas Anda adalah untuk mengimplementasikan operasi ini dengan tepat.

Aturan

Input adalah string tunggal, mungkin kosong. Anda dapat berasumsi bahwa itu hanya berisi huruf kecil dalam rentang ASCII.

Keluaran harus berupa string tunggal dengan semua karakter yang dihapus yang telah muncul setidaknya dua kali dalam string (sehingga dua kejadian paling kiri disimpan).

Alih-alih string Anda dapat bekerja dengan daftar karakter (atau string tunggal), tetapi formatnya harus konsisten antara input dan output.

Anda dapat menulis program atau fungsi dan menggunakan salah satu metode standar kami untuk menerima input dan memberikan output.

Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.

Ini adalah , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.

Uji Kasus

Setiap pasangan garis adalah satu test case, input diikuti oleh output.



xxxxx
xx
abcabc
abcabc
abcdabcaba
abcdabc
abacbadcba
abacbdc
aaabcbccdbabdcd
aabcbcdd

Papan peringkat

Cuplikan Stack di bagian bawah posting ini menghasilkan papan peringkat dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai papan peringkat keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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

Martin Ender
sumber
5
String singleton ... tali senar?
dkudriavtsev

Jawaban:

15

JavaScript (ES6), 42 48

Sunting 6 byte kekalahan disimpan thx @Nil

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

Penjelasan: Saya menggunakan properti 'a' ... 'z' objek kuntuk menyimpan info untuk setiap karakter (objek k adalah regexp dalam hal ini hanya untuk menyimpan byte). Properti ini awalnya undefined. Dalam javascript menambahkan angka untuk undefinedmemberi NaN(cukup masuk akal), tetapi menambahkan string 'X' memberi "undefinedX"- string dengan panjang 10 (konyol). Menambahkan lebih banyak karakter Anda mendapatkan string lebih lama. Jika string yang diperoleh untuk karakter yang diberikan lebih panjang dari 11, karakter itu tidak akan disalin ke output.

Uji

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)

edc65
sumber
Sebenarnya, garis kosong adalah salah satu kasus uji.
Neil
@Neil ok menambahkan tes string kosong
edc65
Jika Anda beralih ke input dan output array, Anda dapat menggunakan .filter untuk menyimpan 12 karakter lainnya. v=>v.filter(x=>!(v[x]+=x)[11]). Kudos pada hack "tidak terdefinisi".
Grax32
@ Gex thanx tetapi terlalu berbeda. Harus mempostingnya sendiri
edc65
14

Python 2, 48 byte

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

c[r.count(c)/2:]adalah alternatif dengan panjang yang sama c*(r.count(c)<2).


49 byte:

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

Retina , 17 byte

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

Cobalah online!

Ganti regex sederhana - cocokkan karakter jika sudah muncul dua kali, dan hapus.

Kobi
sumber
Saya juga mencoba loop , dan grup yang diulang dengan{2} , keduanya dengan 18 byte.
Kobi
1
Saya punya 14 menggunakan fitur yang baru ditambahkan. ;)
Martin Ender
Saya tahu ada sesuatu. Saya melihat batas, mungkin bukan itu. Saya akan periksa lagi.
Kobi
3
Ah, kurasa aku menemukan jawaban Martin. Saya mempunyai beberapa masalah ketika saya mencoba sebelumnya, saya pikir karena saya tidak mempertimbangkan bagaimana deduplicate akan bekerja pada input multi-line. Spoiler (dengan 5 byte ditambahkan untuk mengaktifkan mode per-line): retina.tryitonline.net/…
FryAmTheEggman
@FryAmTheEggman - Bagus, saya tidak menemukan yang ini. Jangan ragu untuk menambahkan jawaban - saya pikir ini terlalu berbeda dari jawaban saya dan saya merasa tidak nyaman mengeditnya :P. Terima kasih!
Kobi
6

Brachylog , 25 byte

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

Cobalah online! atau verifikasi semua kasus uji .

Penjelasan

Ini berfungsi karena s - Subsetakan menyatukan dengan himpunan bagian yang lebih besar terlebih dahulu, jadi misalnya untuk "aaa"itu akan mencoba "aa"sebelumnya "a".

  • Predikat utama:

      .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
    
  • Predikat 1: Periksa bahwa semua karakter hanya muncul paling banyak dua kali. Input =[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
    
  • Predikat 2: Dapatkan kemunculan karakter. Input =[String:Char]

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

> <> , 22 byte

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

Cobalah online! Menggunakan kotak kode untuk melacak jumlah sejauh ini.

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]
Sp3000
sumber
6

J, 20 15 byte

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

Ini mendefinisikan fungsi monadik yang mengambil dan mengembalikan string. Coba di sini . Pemakaian:

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

Penjelasan

Saya beralih ke algoritma yang sama yang menggunakan beberapa solusi lain, karena ternyata lebih pendek ...

#~(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.
Zgarb
sumber
6

Haskell, 40 39 byte

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

Contoh penggunaan: foldl(\s c->s++[c|filter(==c)s<=[c]])"" "aaabcbccdbabdcd"-> "aabcbcdd".

Simpan char berikutnya cjika string semua csejauh ini kurang leksikografis atau sama dengan string tunggal [c].

Sunting: @xnatau menyimpan byte dengan beralih dari pemahaman daftar ke filter. Terima kasih!

nimi
sumber
Alternatif Anda bisa lakukan filter(==c)s<=[c]untuk menghemat satu byte.
xnor
5

Perl, 22 byte

21 byte kode +1 untuk -p.

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

Pemakaian

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

C, 57 byte

Panggil f()dengan string untuk melumpuhkan. Fungsi memodifikasi parameternya. Membutuhkan C99 karena fordeklarasi -loop.

f(char*p){for(char*s=p,m[256]={0};*s=*p;s+=++m[*p++]<3);}
owacoder
sumber
Tidak bisakah Anda menempatkan deklarasi ske dalam pernyataan pertama for?
Martin Ender
Di C99 Anda bisa. Saya hanya tidak melakukannya karena saya ingin menjaga agar golf tetap kompatibel.
owacoder
5

JavaScript (ES6), 35 byte

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

Mengambil array karakter sebagai input dan mengembalikan array detriplicated.

cPu1
sumber
Bagus. Anda dapat melakukannya c=>(s[c]=-~s[c])<3untuk menghemat beberapa byte.
ETHproduk
Saya melewatkan bahwa Anda dapat menggunakan array sebagai input dan menulis fungsi menggunakan map. Golf itu pada dasarnya tampak seperti milikmu. perbedaan utama adalah penugasan, yang jika Anda beralih akan menghemat beberapa byte. Coba s.filter(c=>(s[c]=s[c]+1|0)<3)selama 33 byte. EDIT: Ups, merindukan komentar di atas saya, yang bahkan lebih baik :)
Jan
4

PowerShell v2 +, 31 byte

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

Menggunakan regex yang sama dengan jawaban Retina Kobi , hanya dienkapsulasi di -replaceoperator PowerShell . Bekerja karena keduanya menggunakan .NET-flavor regex di latar belakang.

Atau, tanpa regex, 56 byte

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

Membuat array pembantu yang $bdiisi sebelumnya dengan 0s. Melemparkan string input $args[0]sebagai char-array, mengirimkannya melalui loop |%{...}. Setiap iterasi mengeluarkan karakter saat ini $_sebagai string "$_"dikalikan dengan Boolean yang hanya $TRUE(secara implisit dilemparkan ke 1sini) jika titik yang sesuai dalam array pembantu kurang dari 2(yaitu, kita belum melihat karakter ini dua kali). Koleksi string yang dihasilkan dienkapsulasi dalam parens dan diedit -joinbersama untuk membentuk string output tunggal. Yang tersisa pada pipa dan output tersirat.

AdmBorkBork
sumber
regex tidak terkalahkan. :) Saya beleave hashtable lebih baik maka array untuk varian tanpa regex: $b=@{};-join($args|% t*y|?{++$b.$_-lt3}).
mazzy
1
@ Mazzy Untuk varian tanpa regex dan kode Anda, itu harus versi yang lebih baru dari PowerShell 2. Sebagai hasilnya, saya pikir saya akan menyimpan jawaban ini tanpa perubahan. Anda dapat memposting kode Anda sebagai jawaban terpisah!
AdmBorkBork
apakah hashtable muncul di versi 3.0? Baik. Terima kasih.
mazzy
4

Mathematica, 39 byte

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

Fungsi anonim. Mengambil daftar karakter sebagai input, dan mengembalikan daftar yang dilumpuhkan sebagai output. Menggunakan metode melipat daftar dan menolak elemen rangkap tiga, itu tidak terlalu rumit.

LegionMammal978
sumber
4

05AB1E, 12 byte

vyˆ¯y¢O3‹iy?

Penjelasan

v            # for each char in input
 yˆ          # push to global array
   ¯y¢O3‹i   # if nr of occurrences are less than 3
          y? # print it

Cobalah online

Emigna
sumber
4

MATL , 8 byte

t&=Rs3<)

Cobalah online!

Penjelasan

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

Contoh

Dengan asumsi input 'aaababbc', stack berisi yang berikut ini setelah pernyataan yang ditunjukkan:

  • 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'
    
Luis Mendo
sumber
4

Retina , 14 byte

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

Verifikasi semua kasus uji. ( %Mode per-line diaktifkan)

Gunakan tahap "Deduplicate" baru untuk menyelamatkan beberapa byte dari pendekatan Kobi . Deduplicate mengumpulkan daftar semua pertandingan ke regex dan mengganti semua kecuali yang pertama dengan string kosong. Regex cocok dengan karakter yang sudah muncul sekali dalam string, yang berarti bahwa dua yang pertama akan disimpan.

FryAmTheEggman
sumber
3

K, 18 Bytes

  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 tersedia untuk diunduh gratis ; K6 sedang dalam pengembangan . Jika Anda telah mengunduh KDB, Anda dapat menggunakan K dengan backslash .

Mungkin paling mudah untuk melihat ini terpecah, tetapi pertama-tama beberapa sintaks: g:xset gke x. {x+1}adalah fungsi yang mengambil argumen x . Dalam K argumen pertama ke suatu fungsi adalah x(yang kedua adalah ydan yang ketiga adalah z. Tidak perlu yang keempat).

Sekarang:

x:"aaabcbccdbabdcd"

=xberarti grup x , yang menghasilkan:

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

2#'berarti dua diambil (dari) masing-masing yang menghasilkan

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

Seperti yang Anda lihat, ini adalah offset dari dua pertandingan pertama dari setiap karakter. The 2 bisa digeneralisasi.

,/artinya gabung masing - masing dan sering disebut raze . Ini akan memberi kita nilai-nilai kamus kita. Jadi, ,/"abcd"!(0 1;3 5;4 6;8 12)menghasilkan:

0 1 3 5 4 6 8 12

yang perlu kita sortir. {x@<x}@adalah idiom yang sering dilihat oleh pemrogram K (Q menyebutnya asc ), yang mengatakan x saat naik kelas x . Pisahkan:

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

mengembalikan indeks array yang diurutkan, yang kami inginkan diambil dari array asli. x@yberarti x at y jadi ini mengindeks array dengan indeks semacam itu (jika itu masuk akal).

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

yang sekarang kita indeks ke array asli kami. Kita dapat mengatakan di x@sini, tetapi K mendukung konsep yang sangat kuat yang dapat kita manfaatkan di sini: aplikasi fungsi sedang diindeks. Itu berarti bahwa a[0]bisa mencari slot nol aatau bisa menerapkan 0fungsi yang disebut a. Alasan kami membutuhkan yang @sebelumnya {x@<x}adalah karena x<yberarti x kurang dari ys : Operator di K memiliki bentuk diad (dua argumen) dan bentuk monadik (satu argumen) yang berasal dari APL. Q tidak memiliki "ambivalensi" ini.

geocar
sumber
Selamat datang di PPCG! Jawaban pertama yang bagus. :)
Martin Ender
Saya punya beberapa pertanyaan. 1. Apakah K4 bahasa yang sama dengan yang Anda tautkan (Q / kdb +)? 2. Bisakah Anda menunjukkan cara memanggil fungsi Anda pada input atau bagaimana item dalam testVectors.txt harus diformat?
Dennis
@Dennis 1. Ya. Tekan backslash untuk mendapatkan dari Q ke K. 2. Sama seperti yang muncul dalam pertanyaan: pastebin.com/ftHe0bpE contoh panggilan:g"aaabcbccdbabdcd"
geocar
Ok terima kasih. Tidak dapat membuat bagian file berfungsi, tetapi g"..."lakukan triknya. Sayangnya, kode Anda kembali aabbccuntuk input abc.
Dennis
@ Dennis Anda mungkin telah melakukan sesuatu yang salah: {x{?x@<x}@,/2#'=x}"abc"pasti kembali "abc". Ini akan kembali "aabbcc"jika Anda melewatkan ?perbedaan.
geocar
2

Python 2, 51 byte

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

Uji di Ideone .

Dennis
sumber
2

Java 8 lambda, 90 karakter

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

Versi tidak disatukan:

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

Membuat array untuk semua karakter ascii. Jika sebuah karakter muncul, penghitung yang sesuai akan ditingkatkan. Jika lebih dari 2 karakter tidak akan ditambahkan ke string hasil. Sangat mudah, sangat singkat;)

Frozn
sumber
2

Perl 6, 27 byte

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

Penjelasan:

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

(Catatan: Perl 6 tidak "berorientasi golf" seperti saudara perempuannya Perl 5 ... Jadi ya, ruang sebelum <diperlukan. Ini %.{}adalah hash anonim).

Yang Mulia
sumber
24 byte
Jo King
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

Dijelaskan:

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
12Me21
sumber
Selamat datang di ppcg! Posting pertama yang bagus!
R
1

Common Lisp, 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)

Dicetak cantik

(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)
coredump
sumber
1

Q , 52 Bytes

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

K , 27 Bytes

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

Ruby , 79 62 57 byte

Ini cukup sulit, tapi saya tidak yakin saya bisa bermain golf ini jauh lebih baik saat ini. Saran bermain golf dipersilakan. Cobalah online!

Sunting: -17 bytes berkat Value Ink dengan menyarankan cara golfier untuk menghapus karakter rangkap tiga. -5 byte dari menghapus .uniqmetode ini.

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

Tidak Disatukan:

def g(s)
 s.chars.each do |a|
  while s.count(a) > 2
   i = s.rindex(a)
   s[i] = ""
  end
 end
 return s
end
Sherlock9
sumber
62 byte:->s{s.chars.uniq.map{|a|s[s.rindex a]=""while s.count(a)>2};s}
Nilai Tinta
1

JavaScript, 30 byte

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

Menggunakan metode yang @ edc65 buat untuk menghitung tetapi dengan filter array. Karakter pertama kali muncul, nilai objek mendapat "tidak terdefinisi" ditambah karakter (yaitu "undefinedx"). Lain kali nilai objek menjadi "undefinedxx".

Setelah itu, v [x] [11] mengembalikan nilai true dan ketika dikombinasikan dengan karakter not operator, false, yang berarti telah muncul dua kali akan disaring.

Grax32
sumber
0

Javascript (menggunakan perpustakaan eksternal) (80 byte)

Ini bagus! Tidak menang tapi itu menyenangkan

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

Tautan ke lib: https://github.com/mvegh1/Enumerable/

Penjelasan kode: Metode menerima string, pustaka mem-parsingnya sebagai array char, dan klausa Where adalah predikat pemfilteran kompleks yang memeriksa hashmap 'a' untuk keberadaan char saat ini. Jika ada, penghitung kenaikan, yang lain diatur ke 1. Jika <2, predikat (dan karakter saat ini) lewat, yang lain gagal

masukkan deskripsi gambar di sini

applejacks01
sumber
Anda dapat menghindari menggunakan returntetapi membuat fungsi Anda daftar ekspresi yang dipisahkan koma dalam tanda kurung:n=>(a={},_From(n)....) . Ekspresi terakhir adalah nilai balik. Dalam Anda Wherefungsi, Anda dapat menghilangkan menengah bseluruhnya dengan membandingkan terhadap hasil dari tugas atau kenaikan: x=>(a[x]?a[x]++:a[x]=1)<2.
apsillers
Akhirnya, Anda dapat menghindari menggunakan perpustakaan eksternal sama sekali (dan menyimpan byte) menggunakan ellipsis string-split dan filterdenganjoin : [...n].filter(...).join(""). Balikkan logika benar / salah saat mengubah Whereke filter.
apsillers
Ahh pengamatan bagus! Saya akan melihat lebih dekat nanti saran Anda
applejacks01
0

Clojure, 72 byte

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

Begitu banyak byte ...

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

Cobalah online!

Penjelasan:

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