Biorąc pod uwagę ciąg znaków składający się z drukowalnych znaków ASCII , uzyskaj wynik składający się z jego unikalnych znaków w oryginalnej kolejności . Innymi słowy, dane wyjściowe są takie same jak dane wejściowe, z wyjątkiem tego, że znak jest usuwany, jeśli pojawił się wcześniej.
Nie można użyć żadnych wbudowanych funkcji wyszukiwania unikalnych elementów w tablicy (na przykład MATLAB ma unique
funkcję, która to robi). Chodzi o to, aby zrobić to ręcznie.
Dalsze szczegóły:
- Albo funkcje lub programy są dozwolone.
- Dane wejściowe i wyjściowe mogą być w postaci argumentów funkcji, stdin / stdout (nawet dla funkcji) lub ich kombinacji.
- Jeśli używane jest standardowe wejście lub standardowe wyjście, łańcuch jest rozumiany jako sekwencja znaków . Jeśli używane są argumenty funkcji, ciąg znaków, konieczne może być zamknięty w cudzysłowie lub równoważnych symboli języka programowania zastosowań wybór dla definiowania ciągów.
- Dane wyjściowe powinny być ciągiem zawierającym tylko unikalne znaki danych wejściowych. Więc nie ma żadnych dodatkowych podziałów wierszy, spacji itp. Jedynym wyjątkiem jest: jeśli wyjście jest wyświetlane w stdout, większość funkcji wyświetlania dodaje znak końcowy
\n
(aby oddzielić ciąg od tego, co będzie dalej). Więc jedno końcowe\n
jest dopuszczalne na standardowym wyjściu . - Jeśli to możliwe, opublikuj link do internetowego interpretera / kompilatora, aby inni mogli wypróbować Twój kod.
To jest kod golfowy , więc wygrywa najkrótszy kod w bajtach.
Kilka przykładów , zakładając stdin i stdout:
Ciąg wejściowy:
Type unique chars!
Łańcuch wyjściowy:
Type uniqchars!
Ciąg wejściowy
"I think it's dark and it looks like rain", you said
Łańcuch wyjściowy
"I think'sdarloe,yu
Ciąg wejściowy
3.1415926535897932384626433832795
Łańcuch wyjściowy
3.14592687
Odpowiedzi:
GolfScript, 2 bajty
lub alternatywnie:
Opublikowałem to jakiś czas temu w Poradach dotyczących gry w golfa w wątku GolfScript . Działa poprzez duplikowanie ciągu wejściowego (który jest automatycznie umieszczany na stosie przez interpreter GolfScript i który zachowuje się pod wieloma względami jak tablica znaków), a następnie zabranie ze sobą ustawionego przecięcia (
&
) lub unii (|
). Zastosowanie operatora zestawu do tablicy (lub łańcucha) powoduje zwinięcie wszelkich duplikatów, ale zachowuje kolejność elementów.źródło
CJam, 3 bajty
Ustawione lub danych wejściowych z pustą listą. Operacje na zestawach CJam zachowują kolejność elementów.
Wypróbuj online
źródło
C # 6, 18 + 67 = 85 bajtów
Wymaga tego
using
oświadczenia:Rzeczywista metoda:
Ta metoda zapisuje niektóre znaki, definiując funkcję jako lambda , która jest obsługiwana w C # 6. Oto jak wyglądałaby w C # przed 6 (ale bez golfa):
Jak to działa: wywołuję
Where
metodę na łańcuchu z lambda z dwoma argumentami:x
reprezentujący bieżący element,i
reprezentujący indeks tego elementu.IndexOf
zawsze zwraca pierwszy indeks przekazanego do niego znaku, więc jeślii
nie jest równy pierwszemu indeksowix
, jest to duplikat znaku i nie może być uwzględniony.źródło
static void Main
itp.).Siatkówka , 14 bajtów
Każda linia powinna znajdować się w osobnym pliku lub możesz użyć
-s
flagi do odczytu z jednego pliku.Aby to wyjaśnić, użyjemy tej dłuższej, ale prostszej wersji:
Pierwszy wiersz to wyrażenie regularne, z którym należy się dopasować (
+`
jest to ciąg konfiguracji, który działa do momentu dokonania wszystkich zamian). Wyrażenie regularne szuka znaku (nazywamy go C), po którym następuje zero lub więcej dowolnych znaków, a następnie C. Nawiasy oznaczają przechwytywanie grup, więc zamieniamy dopasowanie na C ($1
) i znaki pomiędzy ($2
), usunięcie duplikatu C.Na przykład, jeśli ciąg wejściowy był
unique
pierwszy bieg będzie pasowaćuniqu
, zeu
iniq
tak$1
i$2
, odpowiednio. Zastąpiłby wówczas dopasowany podciąg w oryginalnym wejściu słowemuniq
, dającuniqe
.źródło
Perl, 21 (20 bajtów +
-p
)Stosowanie:
źródło
$h{$&}
i używając logiki ORAZ zamiast operatora trójskładnikowego:s/./!$h{$&}++&&$&/eg
1
s, ale tak nie jest! Dziękuję, aktualizuję!s/./$h{$&}++||$&/eg
(na początku też na to wpadłem). Wstyd, ponieważ byłby to kolejny zapisany bajt.Makaron 0,02 , 233 bajty
Jest to pełny program, który wprowadza dane ze STDIN i wyprowadza na STDOUT.
Wersja owinięta, dla wartości estetycznej:
I mocno „skomentowana” i nie golfowa wersja (w Macaroni nie ma komentarzy, więc używam po prostu literałów „string”):
(To pierwszy prawdziwy program Macaroni (który faktycznie coś robi)! \ O /)
źródło
JavaScript ES7,
373325 bajtówCałkiem proste podejście z wykorzystaniem operatora rozprzestrzeniania się
tablicES6Set
i ES7 :22 bajty mniej niż
indexOf
podejście. Pracował nad garstką przypadków testowych.źródło
for
„s wypowiedzi nie są konieczne i można zrobić to funkcja anonimowa jak niektóre inne rozwiązania nie:s=>[for(c of Set(s))c].join``
. (Blada aktualizacja: nie w 100% pewna, alenew
słowo kluczowe wydaje się również niepotrzebne).new
skutkowałUncaught TypeError: Constructor Set requires 'new'
Google Chrome.C # 6 - 18 + 46 = 64
i wtedy
Metoda
Enumerable.Union
rozszerzenia określa, że elementy są zwracane w oryginalnej kolejności:Operacje na zestawach, które nie są specjalnie przeznaczone do znajdowania unikalnych wartości, wydają się być dozwolone na podstawie innych odpowiedzi.
źródło
string u(string s)=>String.Join("",s.Distinct());
tym, ale to trochę dłużej.Distinct()
już używana , ale została usunięta, ponieważDistinct()
jest niedozwolona w tym wyzwaniu, ponieważ jest to metoda przeznaczona specjalnie do znalezienia unikalnych wartości.s => string.Concat(s.Union(s))
ważny? Byłby to delegat przekazanyFunc<string, string>
jako argument.JavaScript ES6, 47 bajtów
Poniższy test działa na wszystkich przeglądarkach.
źródło
<i?'':e
część?e
znajduje się przed bieżącym indeksemi
, zwraca pusty ciąg znaków, w ten sposób usuwając znak. Jeśli jest to pierwsza instancja, po prostu powracae
i nie wprowadza się żadnych zmian.MATLAB, 23
Wykonuje „set union” ciągu wejściowego z samym sobą, używając metody „stabilnej”, która nie sortuje, a następnie drukuje.
Działa to, ponieważ
union
po scaleniu zwraca tylko niepowielone wartości. Zasadniczo, jeśliunion
ciąg znaków sam z sobą, najpierw tworzy ciąg podobny doType unique chars!Type unique chars!
, a następnie usuwa wszystkie duplikaty bez sortowania.Nie ma potrzeby
unique
:)źródło
unique
niedozwolone, przepraszam! Jest w definicji wyzwaniasetdiff
z'stable'
opcją?disp
ponieważ wtedy masz funkcję, która zwraca ciąg znaków, co jest dozwoloneintersect
z,'stable'
aby osiągnąć ten sam efekt. Chciałem to napisać, ale biorąc pod uwagę tę odpowiedź, nie jest to już oryginalny lol.> <> , 16 bajtów
> <> nie ma ciągów, więc korzystamy z codbox. Ze względu na toroidalny charakter> <> następujące elementy działają w pętli:
Zauważ, że wykorzystuje to fakt, że dane wejściowe zawierają tylko ASCII do wydruku, ponieważ nie działałoby to, gdyby ASCII 0 był obecny.
źródło
Belka ,
2318 bajtówWypróbuj online!
źródło
Element ,
221918 bajtówPrzykładowe wejście / wyjście:
hello world
->helo wrd
Działa to po prostu przetwarzając ciąg po jednym znaku na raz i śledząc, które widziały wcześniej.
źródło
Python 2, 42 bajty
Korzysta z kilku anonimowych funkcji i
reduce
.Wypróbuj online
źródło
Python 3, 44
Buduje ciąg wyjściowy
r
znak po znaku, w tym znakc
z danych wejściowych tylko wtedy, gdy go jeszcze nie widzieliśmy.Python 2 miałby 47 lat, tracąc 4 znaki
raw_input
i oszczędzając 1 na niepotrzebnych parersprint
.źródło
input
z Pythona 2, dzięki czemu możesz skrócić bajt.APL, 3
Dotyczy to zjednoczenia (∪) między każdym elementem wektora, uzyskując iterację, która powoduje usunięcie duplikatów.
Przetestuj na tryapl.org
Stary:
Używa ~ (z odwróconymi argumentami, używając ⍨) zastosowanych między każdym elementem argumentu. Powoduje to, że dla każdego elementu, jeśli jest już na liście, jest usuwany.
źródło
Perl,
5427 bajtówTest:
źródło
print exists($h{$_})?"":$_
→$h{$_}||print
$h{$_}||=print
a użycie<>=~/./g
powinno pomóc zaoszczędzić jeszcze kilka!map
poprawiłaby również oszczędność:map{$h{$_}||=print}<>=~/./g
PHP, 72 bajty
84 bajtówUżywa znaków jako kluczy dla tablicy asocjacyjnej, a następnie drukuje klucze. Kolejność elementów tablicy jest zawsze kolejnością wstawiania.
Dzięki Ismael Miguel za
str_split
sugestię.źródło
<?foreach(str_split($argv[1])as$c)$a[$c]=0;echo join('',array_keys($a));
Krótszy i robi to samo.while($c=$argv[1][$i++*1])
. To zastępuje całośćforeach
. Wszystko inne jest takie samo"0"
. Spróbuj „abc0def” jako danych wejściowych.Pyth, 7 bajtów
Pseudo kod:
z = wejście
suma wskaźnika uporządkowania według z z N nad zbiorem z.
źródło
Julia,
4542 bajtówStara wersja:
Kod buduje nowy ciąg, dodając do niego nowe znaki, a następnie
join
łączy je razem w odpowiedni ciąg na końcu. Nowa wersja zapisuje niektóre znaki, wykonując iterację dzięki interpretacji tablic. Zapisuje również bajt przy użyciu?:
zamiast||
(ponieważ eliminuje potrzebę stosowania nawiasów wokół zadania).Alternatywne rozwiązanie, 45 bajtów, z wykorzystaniem rekurencji i wyrażenia regularnego:
Julia, 17 bajtów
(Wersja alternatywna)
Używa się go
union
jako substytutuunique
- nie uważam tego za „prawdziwą” odpowiedź, ponieważ interpretuję „nie używajunique
” oznacza „nie używaj jednej wbudowanej funkcji, która powoduje zwrócenie unikatowej elementy".źródło
Java, 78 bajtów
Prosta pętla podczas sprawdzania wyników dla znaków już obecnych. Akceptuje dane wejściowe jako
char[]
.źródło
C, 96 bajtów
Wykorzystuje tablicę liczb całkowitych, indeksowanych według numeru znaku ASCII. Znaki są drukowane tylko wtedy, gdy to miejsce w tablicy jest ustawione na FAŁSZ. Po znalezieniu każdego nowego znaku miejsce w tablicy jest ustawione na PRAWDA. Pobiera wiersz tekstu ze standardowego wejścia, zakończony znakiem nowej linii. Ignoruje znaki spoza ASCII.
Nie golfowany:
źródło
C - 58
Dzięki @hvd i @AShelly za uratowanie wielu znaków. Sugerowano wiele sposobów, aby uczynić go znacznie krótszym niż oryginał:
Jak widać modyfikowanie w miejscu wydaje się być najkrótsze (jak dotąd!) Program testowy kompiluje się bez użycia ostrzeżeń
gcc test.c
Dzięki za wszelką pomoc. Doceniam wszystkie rady dotyczące skrócenia tak bardzo!
źródło
r
jakoint
(i pominąćint
), aby zaoszczędzić kilka bajtów:f(s,r)char*s;{...}
. Ale ogranicza twój kod do platform, na którychchar*
jest tego samego rozmiaruint
, i oczywiście tam, gdzie kompilatory są tak łagodne jak twoje i moje.if(x)y
x?y:0
f(char*s){int a[128]={0};for(;*s;s++)a[*s]++?0:putchar(*s);}
*q
i zwiększać tylko,q
jeśli postać pojawiła się wcześniej, pozwalając na upakowanie nieco więcej:void f(char*s,char*r){for(char*q=r;*q=*s;strchr(r,*s++)<q||q++);}
(Pamiętaj, żestrchr(r,*s++)<q
zawsze jest dobrze zdefiniowany, nie ma UB, ponieważstrchr
nie może wrócićNULL
w tej wersji.) Z wyjątkiem typu zwracanego, jest nawet krótszy niż wersja @ AShelly.Ruby,
3024 znaków(23-znakowy kod + 1-znakowa opcja wiersza poleceń.)
Przykładowy przebieg:
źródło
CJam, 9
To nie konwertuje ciągu na zestaw, ale wykonuje swoistą różnicę zestawu, aby ustalić, czy znak zostanie znaleziony w ciągu. Wypróbuj online
Wyjaśnienie:
Inna wersja, 13 bajtów:
Nie ma to nic wspólnego z zestawami. Wypróbuj online
Wyjaśnienie:
źródło
TI-BASIC, 49 bajtów
Zmienne równania są rzadko przydatne, ponieważ zajmują 5 bajtów, ale
Y₁
przydają się tutaj jakoX
th znak ciągu, oszczędzając 3 bajty. Ponieważ nie możemy dodawać do pustych łańcuchów w TI-BASIC, zaczynamy od pierwszego znaku Str1, a następnie zapętlamy resztę łańcucha, dodając wszystkie znaki, których jeszcze nie napotkaliśmy.źródło
Matlab, 46 bajtów
Używa anonimowej funkcji, z argumentami funkcji jako danych wejściowych i wyjściowych:
(Nie mogłem tego uruchomić w internetowym tłumaczu Octave.)
Przykładowe zastosowanie:
źródło
,1
przyany
, btw.1
jest dlatriu
(muszę usunąć przekątną), a nie dlaany
Befunge -93, 124 bajty
Przetestuj to w tym tłumaczu online .
To było trudniejsze niż się spodziewałem. Jutro opublikuję pełniejsze wyjaśnienie, jeśli ktoś tego chce, ale oto przegląd tego, co robi mój kod.
2,0
i rozciągając w prawo. Jest to sprawdzane w celu sprawdzenia, czy obecny znak jest duplikatem.0,0
a licznik pętli sprawdzania duplikatu jest przechowywany w1,0
.0,0
jest zwiększany.źródło
PHP,
5654Borta z @ fschmengler za odpowiedź używając
array_flip
dwukrotnie - drugą wersję wykorzystuje metodę zmienny i zależy od odlewania ciąg true, negując go na false, a następnie rzucając go z powrotem do pustego ciągu w pierwszym argumencie, aby zaoszczędzić kilka bajtów w drugim. Tani!źródło
Haskell , 29 bajtów
Jednowierszowy, bez nazwy o zmiennej nazwie:
Ta sama liczba zapisana w funkcji o nazwie
f
jako deklaracja najwyższego poziomu:Zauważ, że istnieje pewna optymistyczna optymalizacja, której nie poczyniłem w duchu dobroci: technicznie nadal jest dozwolone w regułach tego wyzwania użycie innego kodowania wejściowego i wyjściowego dla łańcucha. Reprezentowanie dowolnego
string
przez częściowo zastosowane kodowanie Churcha\f -> foldr f [] string :: (a -> [b] -> [b]) -> [b]
(z drugą stroną bijectionu zapewnianego przez funkcję($ (:))
) powoduje, że gra się w golfa($ \x->(x:).filter(x/=))
zaledwie 24 znaków.Unikałem opublikowania 24-znakowej odpowiedzi jako mojej oficjalnej, ponieważ powyższe rozwiązanie można wypróbować na powyższym
foldr(\x->(x:).filter(x/=))[]"Type unique chars!"
tłumaczu, ponieważ zamiast tego napisano by rozwiązanie w golfa:jako skrót od dosłownej deklaracji, która byłaby bardziej szalona:
Ale jest to całkowicie poprawna wersja struktury danych reprezentowanej jako czyste funkcje. (Oczywiście możesz również użyć
\f -> foldr f [] "Type unique chars!"
, ale jest to prawdopodobnie nielegalne, ponieważ używa list do faktycznego przechowywania danych, więc jego część składana powinna być prawdopodobnie złożona w funkcję „odpowiadania”, prowadzącą do ponad 24 znaków).źródło