Diberikan satu baris yang hanya terdiri dari huruf, proses sebagai berikut:
- Anda mempertahankan string yang kosong di awal.
- Jika karakter input berikutnya ada di dalam string, hapus dari string.
- Jika karakter input berikutnya tidak ada dalam string, tambahkan ke string.
Keluarkan status akhir string.
Anda dapat dengan aman menganggap input terdiri setidaknya satu karakter (yaitu tidak kosong), tetapi tidak ada jaminan bahwa output tidak kosong.
Pseudocode (Jangan ragu untuk bermain golf ini):
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
Masukan cocok dengan ekspresi reguler ^[A-Za-z]+$
.
Contoh uji kasus:
ABCDBCCBE -> ADCBE
ABCXYZCABXAYZ -> A
aAABBbAbbB -> aAbB
GG -> (empty)
Input dapat diberikan dengan cara apa pun yang berlaku, tetapi harus diperlakukan sebagai string, dan sama untuk output. Program seharusnya tidak keluar dengan kesalahan.
Program terpendek di setiap bahasa menang!
Ekstra (Opsional): Tolong jelaskan bagaimana program Anda bekerja. Terima kasih.
Jawaban:
Haskell ,
4442 byteCobalah online! Sunting: -2 bytes berkat Zgarb!
Penjelasan:
Baris kedua mendefinisikan fungsi
(#)
yang mengambil strings
dan karakterx
dan melakukan penghapusan atau penambahan. Ini dicapai denganfilter
memasukkan setiap kejadianx
dalams
, menghasilkan stringz
. Jikax
tidak munculs
, makaz
sama dengans
danz++[x|z==s]
menghasilkan string asli denganx
ditambahkan. Kalau tidak,[x|z==s]
menghasilkan string kosong dan hanya string yang difilter dikembalikan.foldl(#)""
adalah fungsi anonim yang mengambil string dan menambahkan satu karakter setelah yang lain string awalnya kosong""
dengan fungsi(#)
.sumber
Jelly , 3 byte
Cobalah online!
Program lengkap.
sumber
œ^/
tidak cukup?the input is never empty
Nah, sekarang sudah berfungsi.J ,
2119 byteBagaimana itu bekerja:
=/~
- membuat tabel persamaan karakter dalam string:1#.
- jumlah setiap baris dengan konversi basis 1 (berapa kali huruf itu muncul)~:&.|
- membalikkan, kemudian menerapkan nub saringan (adalah karakter unik) dan membalikkan lagi. Jadi saya menemukan kejadian terakhir dari karakter dalam string:*
- mengalikan hitungan dengan 1 untuk posisi terakhir karakter dalam sring, dengan 0 jika tidak, dihitung dengan di atas~:&.|
2|
- modulo 2 (set ke 0 posisi karakter yang memiliki jumlah genap):#~
- salin argumen kanan ke kiri. kali (~ membalikkan tempat args)]f # a A
Cobalah online!
sumber
Brainfuck, 95 byte
Cobalah secara Online
Bagaimana itu bekerja
sumber
Haskell , 47 byte
Satu lagi memotong debu berkat Bruce Forte.
Cobalah online!
Mengambil daftar String.
Perbedaan simetris menyebalkan ...
sumber
++
menghemat 2 byte lebihunion
dengan metode ini.Retina , 16 byte
Cobalah online!
sumber
R ,
928477 byteCobalah online!
-15 byte berkat djhurio
Penjelasan
djhurio memberikan jawaban R yang sangat baik untuk menghindari
for
perulangan - seperti yang dilakukan oleh programmer R sebagai aturan (termasuk saya sendiri). Inilah jawaban R yang menggunakanfor
loop (dan menyimpan beberapa byte dalam proses).x=scan(,'');
- tetapkan input ke dalam variabelx
y='';
- buat string kosong dalam variabel yang disebuty
for(i in el(strsplit(x,'')))
- untuk setiap karakteri
dalamx
y=c(y[y!=i],if(!i%in%y)i)
- tetapkan key
setiap elemeny
yang tidak sama dengani
, tambahkani
jikai
belum masuky
cat(y,sep='')
- cetak elemeny
tanpa spasi di antara merekaCatatan
Jika Anda mengklik tautan TIO di atas, Anda akan menemukannya di tajuk
library(methods)
; ini untuk mengatasi kesalahan yang dialami djhurio mengenaiel()
fungsi - fungsi ini disediakan olehmethods
paket, yang dalam versi R apa pun yang saya gunakan, dimuat secara default, tetapi untuk alasan apa pun bukan oleh TIO. Jikalibrary(methods)
dihapus dari header danunlist
digantiel
, saya memperoleh empat byte, tetapi begitu juga djhurio , menempatkan byte kami masing-masing sebesar9688 dan 99.sumber
for(i in el(strsplit(scan(,y<-''),y)))y=c(y[y!=i],if(!i%in%y)i);cat(y,sep='')
....[[1]]
lebih panjang dariel(...)
tetapi lebih pendek dariunlist(...)
, asalkan itu...
adalah daftar panjang 1.0
adalahnul
karakter dan akan dikonversi menjadi string kosong.MATL , 6 byte
Tidak bekerja di lingkungan TIO, tetapi berfungsi dengan baik pada implementasi MATLAB, dan berkat tambalan baru, Anda dapat mencobanya di MATL Online
X~
samasetxor
, atau perbedaan simetris, yang melakukan apa yang diminta tantangan. Sisanya hanya mengulangi inputi"@
dan mulai dengan string kosong dengan menyatukan seluruh tumpukan yang kosong di awal (terima kasih Luis Mendo).sumber
Python 2 , 56 byte
-2 byte terima kasih kepada xnor. -3 bytes terima kasih kepada ovs.
Cobalah online!
Secara harfiah hanya golf kodesemu. : P
sumber
s=(s+c).replace(c,c[c in s:])
.s=s.replace(c,'')+c[c in s:]
JavaScript (ES6), 60 byte
Uji kasus
Tampilkan cuplikan kode
sumber
q , 38 byte
sumber
APL + WIN, 19 byte
Logika mirip dengan solusi J Galen.
sumber
Bahasa Wolfram (Mathematica) , 36 byte
Cobalah online!
Mengambil input dan output sebagai daftar karakter.
Bagaimana itu bekerja
Menggunakan
//.
(aliasReplaceRepeated
) untuk menemukan dua karakter yang diulang dan menghapus keduanya, sampai tidak ada lagi karakter yang diulang. Jika karakter muncul lebih dari dua kali, Mathematica akan selalu menghapus dua kejadian pertama. Jadi, jika sebuah karakter muncul beberapa kali ganjil, contoh terakhirnya akan selalu menjadi yang bertahan.sumber
Prolog 81 byte
Versi tidak dikaburkan:
delete/3
memastikan bahwa argumen ketiga menyatu dengan argumen pertama, dengan semua contoh argumen kedua dihapus dari itu.append/3
sesuai namanya, menambahkan elemen ke daftar.[]
(daftar kosong), pada titik mana hasil antara akan menyatukan dengan hasil yang diinginkan.Uji:
Beberapa Prolog memperlakukan string dalam tanda kutip ganda sebagai daftar, SWI dapat dikonfigurasi untuk melakukan hal yang sama, tetapi demi kesederhanaan, saya terbiasa
string_codes/2
memformat output dengan baik.sumber
Perl 5, 28 + 2 (-pF) = 30 byte
Cobalah online
sumber
R , 84 byte
Cobalah online!
Solusi lain, tetapi ada jawaban R yang lebih baik di sini.
R , 88 byte
Cobalah online!
Terima kasih kepada Giuseppe untuk -7 byte!
Ada jawaban yang lebih pendek dari duckmayr .
scan(,"")
baca input dari stdin.y<-el(strsplit(scan(,""),""))
pisahkan input dengan karakter dan simpan sebagaiy
.z=table(y<-el(strsplit(scan(,""),"")))
menghitung frekuensi masing-masing karakter dan menyimpan tabel yang dihasilkan sebagaiz
;unique(y,,T)
ambil karakter unik dari sisi kanan.names(z[!z%%2])
pilih hanya hitungan genap dan ekstrak nama.setdiff(unique(y,,T),names(z[!z%%2]))
hapus karakter dengan jumlah genap.cat(setdiff(unique(y,,T),names(z[!z%%2])),sep="")
cetak hasilnya.sumber
el()
berasal darimethods
paket, yang walaupun biasanya dimuat secara default, bukan oleh TIO (dibahas dalam jawaban saya di bawah ini)rev(unique(rev(y)))
? Tidak hanyaunique(y)
bekerja? ooohhh tunggu, saya mengerti, Anda ingin karakter unik dari kanan ke kiri. Dalam hal iniunique(y,,T)
(pengaturanfromLast=T
) akan menjadi 88 byte .Alice , 9 byte
Cobalah online!
Penjelasan
Pada dasarnya port jawaban Erik . Terlepas dari sedikit pengalihan IP, kodenya benar-benar hanya:
yang tidak:
sumber
APL (Dyalog) , 16 byte
Cobalah online!
Jika kesalahan dibolehkan, ini akan menjadi 9 byte:
sumber
DOMAIN ERROR
jika string kosong, karena(,⍨~∩)
tidak memiliki elemen identitas yang telah ditentukan.Pyth , 15 byte
Cobalah online!
sumber
Ruby , 53 byte
Cobalah online!
Input dan output keduanya adalah array karakter. Tes panggilan kode
.chars
dan.join
untuk kenyamanan.Penjelasan
Menggunakan fakta bahwa huruf-huruf dalam string yang dihasilkan muncul beberapa kali dan dalam urutan dari kanan ke kiri.
sumber
Pyth, 13 byte
Dimasukkan dalam input sebagai daftar karakter. Uji itu!
sumber
Rosda , 34 byte
Cobalah online!
Ini adalah terjemahan langsung dari pseudocode. Ini memperlakukan input dan output sebagai aliran karakter.
Penjelasan:
sumber
Python 3 , 73 byte
Bukan yang terpendek, tapi saya suka pendekatan ini.
Cobalah online!
Lewati string, simpan hanya karakter-karakter itu di tempat:
(s.count(c)%2) == 0
- Karakter muncul beberapa kali.(i==s.rfind(c))
- Indeks saat ini adalah penampilan terakhir dari karakter yang dimaksud.sumber
REXX , 102 byte
Cobalah online!
Cara kerjanya: Ambil huruf paling kanan, lihat apakah jumlah kemunculannya genap atau ganjil (yang juga berfungsi ganda sebagai nilai kebenaran) dan jika ganjil, tambahkan ke string output. Kemudian hapus semua kemunculan huruf dari string input. Ulangi sampai input habis.
sumber
Perl 5 , 22 + 1 (
-p
) = 23 byteCobalah online!
sumber
Java 8, 93 byte
Seekor lambda dari
String
keString
. Hanya implementasi kodesemu dalam pertanyaan.Cobalah secara Online
Java 8, 182 byte
Inilah lambda lain dari jenis yang sama yang menggunakan stream! Mungkin lebih efisien.
Cobalah secara Online
Tidak disatukan
sumber
R , 70 byte
Cobalah online!
Saya didorong oleh djhurio untuk mengirim solusi ini; Jawaban djhurio dapat ditemukan di sini .
Ini menggunakan ide yang sama dengan jawaban duckmayr , tetapi memanfaatkan pendekatan numerik dengan mengubah string ke codepoint-nya daripada membaginya menjadi karakter, dan merupakan fungsi daripada program penuh sehingga dapat mengembalikan string baru daripada mencetak ke stdout .
Satu pengamatan penting adalah itu
F
diinisialisasi keFALSE
atau0
danutf8ToInt(0)==""
, jadi ini akan berhasil untuk string kosong serta dengan benar menciutkan codepoints.sumber
PHP, 71 +1 byte
Jalankan sebagai pipa dengan
-nR
atau coba online .sumber
Python 3.6 , 69 byte
Cobalah online!
Urutan penyisipan Dict dipertahankan dalam Python 3.6.
sumber
SNOBOL4 (CSNOBOL4) ,
9795 byteCobalah online!
sumber