Diberikan string yang terdiri dari karakter ASCII yang dapat dicetak , menghasilkan output yang terdiri dari karakter uniknya dalam urutan asli . Dengan kata lain, outputnya sama dengan input kecuali bahwa char dihapus jika sudah muncul sebelumnya.
Tidak ada built-in untuk menemukan elemen unik dalam array yang dapat digunakan (misalnya, MATLAB memiliki unique
fungsi yang melakukan itu). Idenya adalah melakukannya secara manual.
Keterangan lebih lanjut:
- Entah fungsi atau program yang diperbolehkan.
- Input dan output dapat berupa argumen fungsi, stdin / stdout (bahkan untuk fungsi), atau gabungan dari keduanya.
- Jika stdin atau stdout digunakan, string dipahami hanya sebagai urutan karakter . Jika argumen fungsi digunakan, urutan karakter mungkin perlu dilampirkan dalam tanda kutip atau simbol yang setara yang digunakan bahasa pemrograman pilihan untuk mendefinisikan string.
- Keluaran harus berupa string yang hanya berisi karakter unik dari input. Jadi tidak ada linebreak tambahan, spasi dll. Satu-satunya pengecualian adalah: jika output ditampilkan di stdout, sebagian besar fungsi tampilan menambahkan trailing
\n
(untuk memisahkan string dari apa yang akan terjadi selanjutnya). Jadi satu trailing\n
dapat diterima di stdout . - Jika memungkinkan, poskan tautan ke juru bahasa / kompiler online sehingga orang lain dapat mencoba kode Anda.
Ini adalah kode golf , jadi kode terpendek dalam byte menang.
Beberapa contoh , dengan asumsi stdin dan stdout:
String input:
Type unique chars!
String output:
Type uniqchars!
Input string
"I think it's dark and it looks like rain", you said
Output string
"I think'sdarloe,yu
Input string
3.1415926535897932384626433832795
Output string
3.14592687
Jawaban:
GolfScript, 2 byte
atau, sebagai alternatif:
Saya memposting ini beberapa waktu lalu di Tips untuk bermain golf di utas GolfScript . Ini bekerja dengan menduplikasi string input (yang diletakkan di tumpukan secara otomatis oleh juru GolfScript, dan yang berperilaku dalam banyak cara seperti array karakter) dan kemudian mengambil persimpangan set (
&
) atau union (|
) dengan sendirinya. Menerapkan operator yang ditetapkan ke array (atau string) runtuh setiap duplikat, tetapi mempertahankan urutan elemen.sumber
CJam, 3 byte
Setwise atau input dengan daftar kosong. CJam mengatur operasi mempertahankan urutan elemen.
Cobalah online
sumber
C # 6, 18 + 67 = 85 byte
Membutuhkan
using
pernyataan ini :Metode aktual:
Metode ini menyimpan beberapa karakter dengan mendefinisikan fungsi sebagai lambda , yang didukung di C # 6. Ini adalah bagaimana itu akan terlihat di C # pra-6 (tetapi tidak disunat):
Cara kerjanya: Saya memanggil
Where
metode pada string dengan lambda dengan dua argumen:x
mewakili elemen saat ini,i
mewakili indeks elemen tersebut.IndexOf
selalu mengembalikan indeks pertama dari arang yang dilewatinya, jadi jikai
tidak sama dengan indeks pertamax
, itu adalah duplikat char dan tidak boleh dimasukkan.sumber
static void Main
dll.).Retina , 14 byte
Setiap baris harus memiliki file terpisah sendiri, atau Anda dapat menggunakan
-s
flag untuk membaca dari satu file.Untuk menjelaskannya, kami akan menggunakan versi yang lebih lama namun lebih sederhana ini:
Baris pertama adalah regex yang cocok dengan (
+`
adalah string konfigurasi yang terus berjalan sampai semua penggantian dilakukan). Regex mencari karakter (kami akan menyebutnya C), diikuti oleh nol atau lebih karakter arbitrer, diikuti oleh C. Tanda kurung menunjukkan grup penangkap, jadi kami mengganti kecocokan dengan C ($1
) dan karakter di antara ($2
), menghapus duplikat C.Misalnya, jika string input adalah
unique
, jalankan pertama akan cocok , masing-masinguniqu
denganu
danniq
sebagai$1
dan$2
. Kemudian akan menggantikan substring yang cocok di input asli denganuniq
, memberiuniqe
.sumber
Perl, 21 (20 byte +
-p
)Pemakaian:
sumber
$h{$&}
dan menggunakan logika DAN bukannya operator ternary:s/./!$h{$&}++&&$&/eg
1
s di output, tetapi tidak! Terima kasih, pembaruan!s/./$h{$&}++||$&/eg
(saya jatuh cinta juga pada awalnya). Malu karena itu akan menjadi byte lain yang disimpan.Macaroni 0,0.2 , 233 byte
Ini adalah program lengkap, yang input dari STDIN dan output pada STDOUT.
Versi yang dibungkus, untuk nilai estetika:
Dan versi "komentar" dan ungolfed (tidak ada komentar di Macaroni, jadi saya hanya menggunakan bare string literal):
(Ini adalah program Macaroni nyata pertama (yang sebenarnya melakukan sesuatu)! \ O /)
sumber
JavaScript ES7,
373325 bytePendekatan yang cukup sederhana menggunakan ES6
Set
dan ES7comprehensions Arraypenyebaran Operator:22 byte kurang dari
indexOf
pendekatan. Bekerja pada beberapa kasus uji.sumber
for
ekspresi 's tidak diperlukan dan Anda bisa membuatnya fungsi anonim karena beberapa solusi lain lakukan:s=>[for(c of Set(s))c].join``
. (Pembaruan pucat: tidak 100% yakin, tetapinew
kata kunci tampaknya juga tidak perlu.)new
menghasilkanUncaught TypeError: Constructor Set requires 'new'
Google Chrome.C # 6 - 18 + 46 = 64
lalu
The
Enumerable.Union
ekstensi metode menetapkan bahwa unsur-unsur dikembalikan dalam urutan asli:Mengatur operasi yang tidak secara khusus dimaksudkan untuk menemukan nilai-nilai unik tampaknya diizinkan menilai dengan jawaban lain.
sumber
string u(string s)=>String.Join("",s.Distinct());
tapi itu sedikit lebih lama.Distinct()
, tetapi dihapus karenaDistinct()
tidak diizinkan dalam tantangan ini, karena metode ini khusus dimaksudkan untuk menemukan nilai unik.s => string.Concat(s.Union(s))
valid Itu akan menjadi delegasi yang diteruskan keFunc<string, string>
sebagai argumen.JavaScript ES6, 47 byte
Tes di bawah ini berfungsi pada semua browser.
sumber
<i?'':e
bagian itu?e
adalah sebelum indeks saat inii
, itu mengembalikan string kosong, sehingga menghilangkan karakter. Jika itu adalah contoh pertama, itu hanya mengembalikane
dan tidak ada perubahan yang dilakukan.MATLAB, 23
Apakah "set union" dari string input dengan sendirinya, menggunakan metode 'stable' yang tidak mengurutkan, dan kemudian mencetak.
Ini berfungsi karena
union
hanya mengembalikan nilai-nilai yang tidak duplikat setelah penggabungan. Jadi intinya jika Andaunion
menggunakan string itu sendiri, pertama-tama menghasilkan string sepertiType unique chars!Type unique chars!
, dan kemudian menghapus semua duplikat tanpa menyortir.Tidak perlu
unique
:)sumber
unique
tidak diizinkan, maaf! Ada dalam definisi tantangansetdiff
dengan'stable'
opsi?disp
karena Anda memiliki fungsi yang mengembalikan string, yang diizinkanintersect
dengan'stable'
untuk mencapai efek yang sama juga. Saya akan menulis itu, tetapi diberi jawaban ini, itu bukan lagi lol asli.> <> , 16 byte
> <> tidak memiliki string, jadi kami menggunakan kotak kode. Karena sifat toroidal> <>, yang berikut berjalan dalam satu lingkaran:
Perhatikan bahwa ini menggunakan fakta bahwa input hanya berisi ASCII yang dapat dicetak, karena ini tidak akan berfungsi jika ASCII 0 hadir.
sumber
Beam ,
2318 byteCobalah online!
sumber
Elemen ,
221918 byteContoh input / output:
hello world
->helo wrd
Ini berfungsi dengan hanya memproses karakter string satu per satu dan melacak yang mana yang telah dilihat sebelumnya.
sumber
Python 2, 42 byte
Menggunakan beberapa fungsi anonim dan
reduce
.Cobalah online
sumber
Python 3, 44
Membangun
r
karakter string keluaran berdasarkan karakter, termasuk karakterc
dari input hanya jika kita belum melihatnya.Python 2 akan menjadi 47, kehilangan 4 karakter dengan
raw_input
dan menghemat 1 karena tidak membutuhkan pengupasprint
.sumber
input
Python 2, sehingga Anda dapat membuat byte Anda lebih pendek.APL, 3
Ini berlaku penyatuan (∪) antara setiap elemen vektor, mendapatkan iterasi yang memiliki efek menghilangkan duplikat.
Cobalah di tryapl.org
Yang lama:
Ini menggunakan ~ (dengan argumen terbalik, menggunakan ⍨) yang diterapkan antara setiap elemen argumen. Hasilnya adalah bahwa untuk setiap elemen, jika sudah ada dalam daftar, itu akan terhapus.
sumber
Perl,
5427 byteUji:
sumber
print exists($h{$_})?"":$_
→$h{$_}||print
$h{$_}||=print
dan penggunaan @ manatwork<>=~/./g
akan membantu menghemat beberapa byte juga!map
juga akan meningkatkan penghematan:map{$h{$_}||=print}<>=~/./g
PHP, 72 Bytes
84 BytesMenggunakan karakter sebagai kunci untuk array asosiatif, lalu mencetak kunci. Urutan elemen array selalu urutan penyisipan.
Terima kasih Ismael Miguel untuk
str_split
sarannya.sumber
<?foreach(str_split($argv[1])as$c)$a[$c]=0;echo join('',array_keys($a));
Lebih pendek dan melakukan hal yang sama.while($c=$argv[1][$i++*1])
. Ini menggantikan keseluruhanforeach
. Segala sesuatu yang lain adalah sama"0"
. Coba "abc0def" sebagai input.Pyth, 7 byte
Kodesemu:
z = input
jumlah order-by index dalam z dari N lebih dari set z.
sumber
Julia,
4542 byteVersi lama:
Kode membangun string baru dengan menambahkan karakter baru ke dalamnya, lalu
join
memasangkannya ke string yang tepat di akhir. Versi baru menyimpan beberapa karakter dengan mengulangi melalui pemahaman array. Juga menyimpan byte dengan menggunakan?:
daripada||
(karena menghilangkan kebutuhan untuk tanda kurung di sekitar tugas).Solusi alternatif, 45 byte, menggunakan rekursi dan regex:
Julia, 17 byte
(Versi alternatif)
Ini
union
pada dasarnya digunakan sebagai penggantiunique
- saya tidak menganggap ini sebagai jawaban "nyata", karena saya menafsirkan "tidak menggunakanunique
" berarti "tidak menggunakan fungsi built-in tunggal yang memiliki efek mengembalikan yang unik elemen ".sumber
Java, 78 byte
Simpul sederhana sambil memeriksa output untuk karakter yang sudah ada. Menerima input sebagai a
char[]
.sumber
C, 96 byte
Ini menggunakan array bilangan bulat, diindeks oleh nomor karakter ASCII. Karakter hanya dicetak jika tempat dalam array diatur ke FALSE. Setelah setiap karakter baru ditemukan, tempat dalam array diatur ke TRUE. Ini mengambil satu baris teks dari input standar, diakhiri oleh baris baru. Itu mengabaikan karakter non-ASCII.
Tidak Disatukan:
sumber
C - 58
Terima kasih kepada @hvd dan @AShelly karena telah menyimpan banyak karakter. Ada beberapa cara yang disarankan agar lebih pendek dari aslinya:
Seperti yang Anda lihat memodifikasi di tempat tampaknya menjadi yang terpendek (sejauh ini!) Program uji mengkompilasi tanpa peringatan menggunakan
gcc test.c
Terima kasih atas semua bantuannya. Saya menghargai semua saran yang diberikan untuk mempersingkat!
sumber
r
sebagaiint
(dan menghilangkanint
) untuk menyimpan beberapa byte:f(s,r)char*s;{...}
. Tapi itu membatasi kode Anda untuk platform di manachar*
ukurannya samaint
, dan tentu saja di mana kompiler sama ringannya dengan Anda dan milik saya.if(x)y
denganx?y:0
f(char*s){int a[128]={0};for(;*s;s++)a[*s]++?0:putchar(*s);}
*q
, dan hanya menambahq
jika karakter muncul sebelumnya, memungkinkan isian sedikit lebih bersama-sama:void f(char*s,char*r){for(char*q=r;*q=*s;strchr(r,*s++)<q||q++);}
(Perhatikan bahwastrchr(r,*s++)<q
selalu didefinisikan dengan baik, tidak ada UB di sana, karenastrchr
tidak dapat kembaliNULL
dalam versi ini.) Kecuali untuk tipe kembali, bahkan lebih pendek dari versi @ AShelly.Ruby,
3024 karakter(23 karakter kode + 1 opsi baris perintah karakter.)
Contoh dijalankan:
sumber
CJam, 9
Ini tidak mengonversi string ke set, tetapi melakukan semacam perbedaan set untuk menentukan apakah karakter ditemukan dalam string. Cobalah online
Penjelasan:
Versi lain, 13 byte:
Ini tidak melakukan apa pun yang terkait dengan set. Cobalah online
Penjelasan:
sumber
TI-BASIC, 49 byte
Variabel persamaan jarang berguna karena mereka mengambil 5 byte untuk disimpan, tetapi
Y₁
berguna di sini sebagaiX
karakter th dari string, menghemat 3 byte. Karena kita tidak dapat menambahkan string kosong dalam TI-BASIC, kita memulai string dengan karakter pertama dari Str1, kemudian mengulangi seluruh string, menambahkan semua karakter yang belum ditemukan.sumber
Matlab, 46 byte
Menggunakan fungsi anonim, dengan argumen fungsi sebagai input dan output:
(Saya tidak bisa mengaktifkan ini dalam juru bahasa online Octave.)
Contoh penggunaan:
sumber
,1
denganany
, btw.1
itu untuktriu
(saya harus menghapus diagonal), bukan untukany
Befunge -93, 124 byte
Uji dalam juru bahasa online ini .
Ini lebih sulit daripada yang saya harapkan. Saya akan memposting penjelasan yang lebih lengkap besok jika ada yang menginginkan saya, tapi di sini adalah ikhtisar dari apa yang kode saya lakukan.
2,0
dan meluas ke kanan. Ini dicentang untuk melihat apakah karakter saat ini adalah duplikat.0,0
dan penghitung loop cek-duplikat disimpan di1,0
.0,0
bertambah.sumber
PHP,
5654Menggeser jawaban @ fschmengler menggunakan
array_flip
versi dua kali - kedua menggunakan metode variabel dan bergantung pada casting string ke true, meniadakannya ke false, kemudian melemparkannya kembali ke string kosong dalam argumen pertama untuk menyimpan beberapa byte di yang kedua. Murah!sumber
Haskell , 29 byte
Satu baris yang nyaman, tanpa nama variabel:
Jumlah yang sama, disimpan ke fungsi yang disebut
f
sebagai deklarasi tingkat atas:Perhatikan bahwa ada optimasi yang sedikit curang yang belum saya lakukan dalam semangat kebaikan: secara teknis masih diizinkan oleh aturan tantangan ini untuk menggunakan input dan output pengkodean yang berbeda untuk string. Dengan mewakili siapa saja
string
dengan pengkodean Gereja yang diterapkan sebagian\f -> foldr f [] string :: (a -> [b] -> [b]) -> [b]
(dengan sisi lain dari penimbunan yang disediakan oleh fungsi($ (:))
) ini akan diturunkan menjadi($ \x->(x:).filter(x/=))
, hanya 24 karakter.Saya menghindari memposting tanggapan 24 karakter sebagai jawaban resmi saya karena solusi di atas dapat dicoba pada juru bahasa di atas
foldr(\x->(x:).filter(x/=))[]"Type unique chars!"
sementara solusi golf akan ditulis sebagai gantinya:sebagai singkatan untuk deklarasi literal yang akan menjadi lebih gila:
Tetapi ini adalah versi yang benar-benar valid dari struktur data yang direpresentasikan sebagai fungsi murni. (Tentu saja, Anda dapat menggunakan
\f -> foldr f [] "Type unique chars!"
juga, tetapi itu mungkin tidak sah karena menggunakan daftar untuk benar-benar menyimpan data, sehingga bagian foldernya kemudian dapat dikomposisikan ke dalam fungsi "jawaban", yang mengarah ke lebih dari 24 karakter.)sumber