Erstellen Sie bei einer Zeichenfolge aus druckbaren ASCII-Zeichen eine Ausgabe, die aus den eindeutigen Zeichen in der ursprünglichen Reihenfolge besteht . Mit anderen Worten, die Ausgabe ist dieselbe wie die Eingabe, mit der Ausnahme, dass ein Zeichen entfernt wird, wenn es zuvor aufgetreten ist.
Es können keine eingebauten Funktionen zum Auffinden eindeutiger Elemente in einem Array verwendet werden (MATLAB verfügt beispielsweise über eine unique
Funktion, die dies ermöglicht). Die Idee ist, es manuell zu tun.
Weitere Details:
- Es sind entweder Funktionen oder Programme erlaubt.
- Die Ein- und Ausgabe kann in Form von Funktionsargumenten, stdin / stdout (auch für Funktionen) oder einer Mischung aus diesen erfolgen.
- Wenn stdin oder stdout verwendet werden, wird eine Zeichenfolge als nur die verstandene Folge von Zeichen . Wenn Funktionsargumente verwendet werden, müssen die Folge von Zeichen kann sein eingeschlossen in Anführungszeichen oder eine gleichwertige Symbole , dass die Programmiersprache der Wahl Verwendungen für die Definition Saiten.
- Die Ausgabe sollte eine Zeichenfolge sein, die nur die eindeutigen Zeichen der Eingabe enthält. Also keine zusätzlichen Zeilenumbrüche, Leerzeichen usw. Die einzige Ausnahme ist: Wenn die Ausgabe in stdout angezeigt wird, fügen die meisten Anzeigefunktionen ein Trailing hinzu
\n
(um die Zeichenfolge von der nächsten zu trennen). So ein nachlauf\n
akzeptabel ist in stdout . - Stellen Sie nach Möglichkeit einen Link zu einem Online- Interpreter / -Compiler bereit, damit andere Ihren Code ausprobieren können.
Dies ist Codegolf , also gewinnt der kürzeste Code in Bytes.
Einige Beispiele unter der Annahme von stdin und stdout:
Eingabezeichenfolge:
Type unique chars!
Ausgabezeichenfolge:
Type uniqchars!
Eingabezeichenfolge
"I think it's dark and it looks like rain", you said
Ausgabezeichenfolge
"I think'sdarloe,yu
Eingabezeichenfolge
3.1415926535897932384626433832795
Ausgabezeichenfolge
3.14592687
Antworten:
GolfScript, 2 Bytes
oder alternativ:
Ich habe dies vor einiger Zeit in den Golftipps im GolfScript- Thread gepostet . Dies funktioniert, indem Sie die Eingabezeichenfolge (die vom GolfScript-Interpreter automatisch auf den Stapel gelegt wird und sich in den meisten Fällen wie ein Array von Zeichen verhält) duplizieren und dann die festgelegte Schnittmenge (
&
) oder Vereinigung (|
) mit sich selbst vornehmen . Durch das Anwenden eines Mengenoperators auf ein Array (oder eine Zeichenfolge) werden alle Duplikate reduziert, die Reihenfolge der Elemente bleibt jedoch erhalten.quelle
CJam, 3 Bytes
Setwise oder von der Eingabe mit einer leeren Liste. CJam-Set-Operationen behalten die Elementreihenfolge bei.
Probieren Sie es online aus
quelle
C # 6, 18 + 67 = 85 Bytes
Benötigt diese
using
Aussage:Die eigentliche Methode:
Diese Methode spart einige Zeichen, indem sie die Funktion als Lambda definiert , was in C # 6 unterstützt wird. So würde es in C # vor 6 aussehen (aber ungolfed):
So funktioniert es: Ich rufe die
Where
Methode für den String mit einem Lambda mit zwei Argumenten auf:x
Repräsentation des aktuellen Elements,i
Repräsentation des Index dieses Elements.IndexOf
Gibt immer den ersten Index des übergebenen Zeichens zurück. Wenn dieseri
also nicht dem ersten Index von entsprichtx
, handelt es sich um ein doppeltes Zeichen, das nicht enthalten sein darf.quelle
static void Main
usw.) einreichen .Retina , 14 Bytes
Jede Zeile sollte in einer eigenen Datei abgelegt sein, oder Sie können das
-s
Flag verwenden, um aus einer Datei zu lesen.Um es zu erklären, verwenden wir diese längere, aber einfachere Version:
Die erste Zeile ist die Regex, mit der abgeglichen werden soll (
+`
ist die Konfigurationszeichenfolge, die so lange ausgeführt wird, bis alle Ersetzungen vorgenommen wurden). Die Regex sucht nach einem Zeichen (wir nennen es C), gefolgt von null oder mehr beliebigen Zeichen, gefolgt von C. Die Klammern bezeichnen Erfassungsgruppen, also ersetzen wir die Übereinstimmung mit C ($1
) und den Zeichen dazwischen ($2
). Entfernen des Duplikats von C.Zum Beispiel, wenn die Eingabezeichenfolge war
unique
würde, der erste Lauf entsprichtuniqu
, mitu
undniq
wie$1
und$2
dargestellt. Es würde dann den übereinstimmenden Teilstring in der ursprünglichen Eingabe durchuniq
, giving ersetzenuniqe
.quelle
Perl, 21 (20 Bytes +
-p
)Verwendungszweck:
quelle
$h{$&}
und ein logisches UND anstelle eines ternären Operators verwenden:s/./!$h{$&}++&&$&/eg
1
s in der Ausgabe habe, aber das ist nicht der Fall! Vielen Dank für die Aktualisierung!s/./$h{$&}++||$&/eg
(auch darauf bin ich zuerst hereingefallen ). Schade, denn das wäre ein weiteres gespeichertes Byte gewesen.Makkaroni 0.0.2 , 233 Bytes
Dies ist ein vollständiges Programm, das Eingaben von STDIN und Ausgaben von STDOUT ausführt.
Umwickelte Version, für ästhetischen Wert:
Und eine stark "kommentierte" und ungolfederte Version (es gibt keine Kommentare in Macaroni, daher verwende ich nur bloße String-Literale):
(Dies ist das erste echte Makkaroni-Programm (das tatsächlich etwas tut)! \ O /)
quelle
JavaScript ES7,
373325 BytesZiemlich einfacher Ansatz unter Verwendung des Spread-Operators für das
Verständnis vonSet
ES6- und ES7-Arrays:22 Bytes weniger als der
indexOf
Ansatz. Arbeitete an einer Handvoll Testfällen.quelle
for
‚s Ausdruck sind nicht notwendig und man könnte es anonyme Funktion machen wie einige andere Lösungen tats=>[for(c of Set(s))c].join``
. (Blasses Update: nicht 100% sicher, aber dasnew
Schlüsselwort scheint auch unnötig.)new
ErgebnisUncaught TypeError: Constructor Set requires 'new'
in Google Chrome.C # 6 - 18 + 46 = 64
und dann
Die
Enumerable.Union
Erweiterungsmethode gibt an, dass Elemente in der ursprünglichen Reihenfolge zurückgegeben werden:Festlegen von Vorgängen, die nicht speziell zum Auffinden eindeutiger Werte vorgesehen sind, scheint nach den anderen Antworten beurteilt zu werden.
quelle
string u(string s)=>String.Join("",s.Distinct());
aber das ist ein bisschen länger.Distinct()
, diese wurde jedoch gelöscht, da sieDistinct()
in dieser Herausforderung nicht zulässig ist, da es sich um eine Methode handelt, mit der eindeutige Werte ermittelt werden sollen.s => string.Concat(s.Union(s))
gültig? Das würde der DelegierteFunc<string, string>
als Argument an a weitergeben.JavaScript ES6, 47 Bytes
Der folgende Test funktioniert auf allen Browsern.
quelle
<i?'':e
Teil?e
vor dem aktuellen Indexi
, wird eine leere Zeichenfolge zurückgegeben, wodurch das Zeichen entfernt wird. Wenn dies die erste Instanz ist, wird sie einfach zurückgegebene
und es werden keine Änderungen vorgenommen.MATLAB, 23
Führt die "Vereinigung" der Eingabezeichenfolge mit sich selbst aus, verwendet die "Stable" -Methode, sortiert nicht und druckt dann.
Dies funktioniert, da
union
nach dem Zusammenführen nur nicht doppelte Werte zurückgegeben werden. Wenn Sie also im Wesentlichenunion
die Zeichenfolge mit sich selbst verwenden, wird zunächst eine Zeichenfolge wie erzeugtType unique chars!Type unique chars!
, und anschließend werden alle Duplikate ohne Sortieren entfernt.Keine Notwendigkeit für
unique
:)quelle
unique
nicht erlaubt, sorry! Es ist in der Herausforderung Definitionsetdiff
die'stable'
Option vorschlagen ?disp
weil Sie dann eine Funktion haben, die eine Zeichenfolge zurückgibt, die zulässig istintersect
mit verwenden'stable'
, um den gleichen Effekt zu erzielen. Ich wollte das schreiben, aber angesichts dieser Antwort ist es nicht mehr original lol.> <> , 16 Bytes
> <> hat keine Zeichenketten, daher verwenden wir die Codebox. Aufgrund der Ringform von> <> läuft Folgendes in einer Schleife ab:
Beachten Sie, dass dies die Tatsache nutzt, dass die Eingabe nur druckbares ASCII enthält, da dies nicht funktionieren würde, wenn ASCII 0 vorhanden wäre.
quelle
Strahl ,
2318 BytesProbieren Sie es online!
quelle
Element ,
221918 BytesBeispiel Ein- / Ausgabe:
hello world
->helo wrd
Dies funktioniert, indem Sie die Zeichenfolge einfach zeichenweise verarbeiten und nachverfolgen, welche zuvor gesehen wurden.
quelle
Python 2, 42 Bytes
Verwendet ein paar anonyme Funktionen und
reduce
.Probieren Sie es online aus
quelle
Python 3, 44
Erstellt die Ausgabezeichenfolge zeichenweise
r
, einschließlich des Zeichensc
aus der Eingabe, sofern wir es noch nicht gesehen haben.Python 2 wäre 47, verliert 4 Zeichen
raw_input
und spart 1, wenn keine Parer benötigt werdenprint
.quelle
input
in Python 2 verwenden können, sodass Sie Ihr Byte kürzer machen können.APL, 3
Dies wendet die Vereinigung (∪) zwischen jedem Element des Vektors an, wodurch eine Iteration erhalten wird, die das Entfernen von Duplikaten bewirkt.
Teste es auf tryapl.org
Altes:
Dies verwendet ~ (mit umgekehrten Argumenten, mit ⍨), das zwischen den einzelnen Elementen des Arguments angewendet wird. Das Ergebnis ist, dass für jedes Element, wenn es bereits in der Liste enthalten ist, es gelöscht wird.
quelle
Perl,
5427 BytesPrüfung:
quelle
print exists($h{$_})?"":$_
→$h{$_}||print
$h{$_}||=print
und<>=~/./g
wenn Sie verwenden, sparen Sie auch ein paar weitere Bytes !map
würde auch die Ersparnis verbessern:map{$h{$_}||=print}<>=~/./g
PHP, 72 Bytes
84 BytesVerwendet die Zeichen als Schlüssel für ein assoziatives Array und druckt die Schlüssel aus. Die Reihenfolge der Array-Elemente ist immer die Reihenfolge der Einfügung.
Danke Ismael Miguel für den
str_split
Vorschlag.quelle
<?foreach(str_split($argv[1])as$c)$a[$c]=0;echo join('',array_keys($a));
Kürzere und macht das gleiche.while($c=$argv[1][$i++*1])
. Dies ersetzt das Ganzeforeach
. Alles andere ist das gleiche"0"
. H. Versuchen Sie "abc0def" als Eingabe.Pyth, 7 Bytes
Pseudocode:
z = Eingabe
Summe des Ordnungsindex in z von N über der Menge von z.
quelle
Julia,
4542 BytesAlte Version:
Code erstellt die neue Zeichenfolge, indem er neue Zeichen anfügt und sie
join
am Ende zu einer richtigen Zeichenfolge zusammenfügt. Die neue Version spart einige Zeichen, indem sie über das Array-Verständnis iteriert. Spart auch ein Byte durch Verwendung von?:
anstatt||
(da keine eckigen Klammern um die Zuweisung erforderlich sind).Alternative Lösung, 45 Byte, unter Verwendung von Rekursion und Regex:
Julia, 17 Bytes
(Alternative Version)
Dies dient
union
im Grunde genommen als Ersatz fürunique
- ich betrachte dies nicht als die "echte" Antwort, da ich "nicht verwendenunique
" so interpretiere , dass "keine einzige integrierte Funktion verwendet wird, die den Effekt hat, das Eindeutige zurückzugeben Elemente ".quelle
Java, 78 Bytes
Eine einfache Schleife, während die Ausgabe auf bereits vorhandene Zeichen überprüft wird. Akzeptiert Eingaben als
char[]
.quelle
C 96 Bytes
Dies verwendet ein Array von Ganzzahlen, die durch die ASCII-Zeichennummer indiziert sind. Die Zeichen werden nur gedruckt, wenn diese Stelle im Array auf FALSE gesetzt ist. Nachdem jedes neue Zeichen gefunden wurde, wird diese Stelle im Array auf TRUE gesetzt. Dies übernimmt eine Textzeile aus der Standardeingabe, die durch eine neue Zeile abgeschlossen wird. Nicht-ASCII-Zeichen werden ignoriert.
Ungolfed:
quelle
C - 58
Vielen Dank an @hvd und @AShelly für das Speichern einiger Zeichen. Es wurden mehrere Möglichkeiten vorgeschlagen, um es viel kürzer als das Original zu machen:
Wie Sie sehen können, scheint die Änderung an Ort und Stelle die kürzeste (bisher!) Zu sein. Das Testprogramm wird ohne Warnung mit kompiliert
gcc test.c
Danke für all die Hilfe. Ich schätze all die Ratschläge, die gegeben wurden, um so viel zu verkürzen!
quelle
r
wieint
(und lassen dieint
) einige Bytes speichern:f(s,r)char*s;{...}
. Aber es beschränkt Ihren Code auf Plattformen mitchar*
der gleichen Größe wieint
und natürlich mit Compilern, die so nachsichtig sind wie Ihre und meine.if(x)y
mitx?y:0
f(char*s){int a[128]={0};for(;*s;s++)a[*s]++?0:putchar(*s);}
*q
, und nur erhöhen ,q
wenn der Charakter früher erschienen, so dass zusammen mehr etwas Füllung:void f(char*s,char*r){for(char*q=r;*q=*s;strchr(r,*s++)<q||q++);}
(Beachten Sie, dassstrchr(r,*s++)<q
immer gut definiert ist, gibt es keinen gibt UB, weilstrchr
nicht zurückkehren kannNULL
in dieser Version.) Mit Ausnahme des Rückgabetyp, Es ist sogar kürzer als die Version von @ AShelly.Ruby,
3024 Zeichen(23 Zeichen Code + 1 Zeichen Befehlszeilenoption.)
Probelauf:
quelle
CJam, 9
Dadurch wird keine Zeichenfolge in eine Menge konvertiert, sondern es wird eine Art Mengenunterschied ausgeführt, um zu bestimmen, ob ein Zeichen in einer Zeichenfolge gefunden wird. Probieren Sie es online aus
Erläuterung:
Eine andere Version, 13 Bytes:
Dies hat nichts mit Mengen zu tun. Probieren Sie es online aus
Erläuterung:
quelle
TI-BASIC, 49 Bytes
Die Gleichungsvariablen sind selten nützlich, da sie 5 Bytes benötigen, um gespeichert zu werden. Sie sind hier jedoch nützlich, da sie
Y₁
dasX
dritte Zeichen der Zeichenfolge sind und 3 Bytes einsparen. Da wir in TI-BASIC keine leeren Zeichenfolgen hinzufügen können, beginnen wir die Zeichenfolge mit dem ersten Zeichen von Str1, durchlaufen dann den Rest der Zeichenfolge und fügen alle Zeichen hinzu, die noch nicht vorhanden sind.quelle
Matlab, 46 Bytes
Es verwendet eine anonyme Funktion mit Funktionsargumenten als Ein- und Ausgabe:
(In einem Octave-Online-Dolmetscher funktionierte das nicht.)
Beispiel Verwendung:
quelle
,1
mitany
.1
ist das fürtriu
(ich muss die Diagonale entfernen), nicht fürany
Befunge -93, 124 Bytes
Testen Sie es in diesem Online-Dolmetscher .
Das war schwieriger als ich erwartet hatte. Ich werde morgen eine ausführlichere Erklärung veröffentlichen, wenn jemand dies wünscht, aber hier ist eine Übersicht über die Funktionen meines Codes.
2,0
und bis nach rechts. Dies wird überprüft, um festzustellen, ob das aktuelle Zeichen ein Duplikat ist.0,0
und der Zähler für die Prüfung auf Duplikate wird in gespeichert1,0
.0,0
erhöht.quelle
PHP,
5654Wenn Sie die Antwort von @ fschmengler in der
array_flip
Version mit zwei Sekunden ausschneiden, wird eine variable Methode verwendet. Dabei wird die Zeichenfolge in true umgewandelt, in false negiert und anschließend in die leere Zeichenfolge im ersten Argument zurückgeschrieben, um ein paar Bytes in der zweiten zu speichern. Billig!quelle
Haskell , 29 Bytes
Verschachtelbarer Einzeiler ohne variablen Namen:
Dieselbe Anzahl, gespeichert in einer Funktion, die
f
als Deklaration der obersten Ebene bezeichnet wird:Beachten Sie, dass es eine geringfügig betrügerische Optimierung gibt, die ich im Geiste der Freundlichkeit nicht vorgenommen habe: Nach den Regeln dieser Herausforderung ist es technisch immer noch zulässig, eine andere Eingabe- und Ausgabecodierung für eine Zeichenfolge zu verwenden. Durch die Darstellung einer
string
von der Kirche teilweise angewendeten Codierung\f -> foldr f [] string :: (a -> [b] -> [b]) -> [b]
(mit der anderen Seite der durch die Funktion bereitgestellten Bijektion($ (:))
) werden($ \x->(x:).filter(x/=))
nur 24 Zeichen abgegolft .Ich habe es vermieden, die 24-
foldr(\x->(x:).filter(x/=))[]"Type unique chars!"
stellige Antwort als meine offizielle Antwort zu veröffentlichen, da die obige Lösung auf dem obigen Interpreter ausprobiert werden könnte, während stattdessen die Golf-Lösung geschrieben würde:als Abkürzung für die wörtliche Erklärung, die verrückter wäre:
Aber es ist eine vollkommen gültige Version der Datenstruktur, die als reine Funktionen dargestellt wird. (Natürlich können Sie auch verwenden
\f -> foldr f [] "Type unique chars!"
, aber das ist vermutlich unzulässig, da es Listen verwendet, um die Daten tatsächlich zu speichern. Daher sollte sein Foldr-Teil vermutlich in die "Antwort" -Funktion zusammengesetzt werden, was zu mehr als 24 Zeichen führt.)quelle