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 kode-golf , 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 N
ukuran 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
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 86503; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 8478; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Jawaban:
Jelly , 6 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
JavaScript (ES6), 42
48Sunting 6 byte kekalahan disimpan thx @Nil
Penjelasan: Saya menggunakan properti 'a' ... 'z' objek
k
untuk menyimpan info untuk setiap karakter (objek k adalah regexp dalam hal ini hanya untuk menyimpan byte). Properti ini awalnyaundefined
. Dalam javascript menambahkan angka untukundefined
memberiNaN
(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
sumber
v=>v.filter(x=>!(v[x]+=x)[11])
. Kudos pada hack "tidak terdefinisi".Python 2, 48 byte
c[r.count(c)/2:]
adalah alternatif dengan panjang yang samac*(r.count(c)<2)
.49 byte:
sumber
Retina , 17 byte
Cobalah online!
Ganti regex sederhana - cocokkan karakter jika sudah muncul dua kali, dan hapus.
sumber
{2}
, keduanya dengan 18 byte.:P
. Terima kasih!Brachylog , 25 byte
Cobalah online! atau verifikasi semua kasus uji .
Penjelasan
Ini berfungsi karena
s - Subset
akan menyatukan dengan himpunan bagian yang lebih besar terlebih dahulu, jadi misalnya untuk"aaa"
itu akan mencoba"aa"
sebelumnya"a"
.Predikat utama:
Predikat 1: Periksa bahwa semua karakter hanya muncul paling banyak dua kali. Input =
[String:Char]
Predikat 2: Dapatkan kemunculan karakter. Input =
[String:Char]
sumber
> <> , 22 byte
Cobalah online! Menggunakan kotak kode untuk melacak jumlah sejauh ini.
sumber
J,
2015 byteIni mendefinisikan fungsi monadik yang mengambil dan mengembalikan string. Coba di sini . Pemakaian:
Penjelasan
Saya beralih ke algoritma yang sama yang menggunakan beberapa solusi lain, karena ternyata lebih pendek ...
sumber
Haskell,
4039 byteContoh penggunaan:
foldl(\s c->s++[c|filter(==c)s<=[c]])"" "aaabcbccdbabdcd"
->"aabcbcdd"
.Simpan char berikutnya
c
jika string semuac
sejauh ini kurang leksikografis atau sama dengan string tunggal[c]
.Sunting: @xnatau menyimpan byte dengan beralih dari pemahaman daftar ke
filter
. Terima kasih!sumber
filter(==c)s<=[c]
untuk menghemat satu byte.Perl, 22 byte
21 byte kode +1 untuk
-p
.Pemakaian
sumber
C, 57 byte
Panggil
f()
dengan string untuk melumpuhkan. Fungsi memodifikasi parameternya. Membutuhkan C99 karenafor
deklarasi -loop.sumber
s
ke dalam pernyataan pertamafor
?JavaScript (ES6), 35 byte
Mengambil array karakter sebagai input dan mengembalikan array detriplicated.
sumber
c=>(s[c]=-~s[c])<3
untuk menghemat beberapa byte.map
. Golf itu pada dasarnya tampak seperti milikmu. perbedaan utama adalah penugasan, yang jika Anda beralih akan menghemat beberapa byte. Cobas.filter(c=>(s[c]=s[c]+1|0)<3)
selama 33 byte. EDIT: Ups, merindukan komentar di atas saya, yang bahkan lebih baik :)PowerShell v2 +, 31 byte
Menggunakan regex yang sama dengan jawaban Retina Kobi , hanya dienkapsulasi di
-replace
operator PowerShell . Bekerja karena keduanya menggunakan .NET-flavor regex di latar belakang.Atau, tanpa regex, 56 byte
Membuat array pembantu yang
$b
diisi sebelumnya dengan0
s. Melemparkan string input$args[0]
sebagaichar
-array, mengirimkannya melalui loop|%{...}
. Setiap iterasi mengeluarkan karakter saat ini$_
sebagai string"$_"
dikalikan dengan Boolean yang hanya$TRUE
(secara implisit dilemparkan ke1
sini) jika titik yang sesuai dalam array pembantu kurang dari2
(yaitu, kita belum melihat karakter ini dua kali). Koleksi string yang dihasilkan dienkapsulasi dalam parens dan diedit-join
bersama untuk membentuk string output tunggal. Yang tersisa pada pipa dan output tersirat.sumber
$b=@{};-join($args|% t*y|?{++$b.$_-lt3})
.Mathematica, 39 byte
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.
sumber
05AB1E, 12 byte
Penjelasan
Cobalah online
sumber
MATL , 8 byte
Cobalah online!
Penjelasan
Contoh
Dengan asumsi input
'aaababbc'
, stack berisi yang berikut ini setelah pernyataan yang ditunjukkan:t
t&=
t&=R
t&=Rs
t&=Rs3<
t&=Rs3<)
sumber
Retina , 14 byte
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.
sumber
Pyke, 16 byte
Coba di sini!
sumber
K, 18 Bytes
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:x
setg
kex
.{x+1}
adalah fungsi yang mengambil argumen x . Dalam K argumen pertama ke suatu fungsi adalahx
(yang kedua adalahy
dan yang ketiga adalahz
. Tidak perlu yang keempat).Sekarang:
=x
berarti grup x , yang menghasilkan:2#'
berarti dua diambil (dari) masing-masing yang menghasilkanSeperti 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: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:mengembalikan indeks array yang diurutkan, yang kami inginkan diambil dari array asli.
x@y
berarti x at y jadi ini mengindeks array dengan indeks semacam itu (jika itu masuk akal).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 bahwaa[0]
bisa mencari slot nola
atau bisa menerapkan0
fungsi yang disebuta
. Alasan kami membutuhkan yang@
sebelumnya{x@<x}
adalah karenax<y
berarti 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.sumber
g"aaabcbccdbabdcd"
g"..."
lakukan triknya. Sayangnya, kode Anda kembaliaabbcc
untuk inputabc
.{x{?x@<x}@,/2#'=x}"abc"
pasti kembali"abc"
. Ini akan kembali"aabbcc"
jika Anda melewatkan?
perbedaan.Python 2, 51 byte
Uji di Ideone .
sumber
Java 8 lambda, 90 karakter
Versi tidak disatukan:
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;)
sumber
Perl 6, 27 byte
Penjelasan:
(Catatan: Perl 6 tidak "berorientasi golf" seperti saudara perempuannya Perl 5 ... Jadi ya, ruang sebelum
<
diperlukan. Ini%.{}
adalah hash anonim).sumber
SmileBASIC,
77726968 byteDijelaskan:
sumber
Common Lisp, 127
Dicetak cantik
sumber
Q , 52 Bytes
sumber
K , 27 Bytes
sumber
Ruby ,
796257 byteIni 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
.uniq
metode ini.Tidak Disatukan:
sumber
->s{s.chars.uniq.map{|a|s[s.rindex a]=""while s.count(a)>2};s}
JavaScript, 30 byte
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.
sumber
Javascript (menggunakan perpustakaan eksternal) (80 byte)
Ini bagus! Tidak menang tapi itu menyenangkan
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
sumber
return
tetapi membuat fungsi Anda daftar ekspresi yang dipisahkan koma dalam tanda kurung:n=>(a={},_From(n)....)
. Ekspresi terakhir adalah nilai balik. Dalam AndaWhere
fungsi, Anda dapat menghilangkan menengahb
seluruhnya dengan membandingkan terhadap hasil dari tugas atau kenaikan:x=>(a[x]?a[x]++:a[x]=1)<2
.filter
denganjoin
:[...n].filter(...).join("")
. Balikkan logika benar / salah saat mengubahWhere
kefilter
.Clojure, 72 byte
Begitu banyak byte ...
sumber
Pascal (FPC) , 103 byte
Cobalah online!
Penjelasan:
sumber