Avec une chaîne composée de caractères imprimables ASCII , produisez une sortie composée de ses caractères uniques dans l'ordre d'origine . En d'autres termes, la sortie est la même que l'entrée, sauf qu'un caractère est supprimé s'il est apparu précédemment.
Aucune fonctionnalité intégrée permettant de rechercher des éléments uniques dans un tableau ne peut être utilisée (par exemple, MATLAB a une unique
fonction qui le fait). L'idée est de le faire manuellement.
Plus de détails:
- Les fonctions ou les programmes sont autorisés.
- L'entrée et la sortie peuvent être sous la forme d' arguments de fonction, stdin / stdout (même pour des fonctions), ou un mélange de ceux-ci.
- Si stdin ou stdout sont utilisés, une chaîne est comprise comme une simple séquence de caractères . Si des arguments de fonction sont utilisés, il peut être nécessaire de placer la séquence de caractères entre guillemets ou symboles équivalents utilisés par le langage de programmation choisi pour définir les chaînes.
- La sortie doit être une chaîne contenant uniquement les caractères uniques de l'entrée. Donc, pas de sauts de ligne, d'espaces, etc. La seule exception est que si la sortie est affichée en stdout, la plupart des fonctions d'affichage ajoutent un fin
\n
(pour séparer la chaîne de ce qui va suivre). Donc, une fuite\n
est acceptable en stdout . - Si possible, poster un lien vers un ligne interprète / compilateur afin que les autres peuvent essayer votre code.
C'est le code de golf , donc le code le plus court en octets gagne.
Quelques exemples , en supposant que stdin et stdout:
Chaîne d'entrée:
Type unique chars!
Chaîne de sortie:
Type uniqchars!
Chaîne d'entrée
"I think it's dark and it looks like rain", you said
Chaîne de sortie
"I think'sdarloe,yu
Chaîne d'entrée
3.1415926535897932384626433832795
Chaîne de sortie
3.14592687
Réponses:
GolfScript, 2 octets
Ou bien:
Je l'ai posté il y a quelque temps dans les astuces pour jouer au golf dans le fil GolfScript . Cela fonctionne en dupliquant la chaîne d'entrée (qui est automatiquement mise sur la pile par l'interpréteur GolfScript, et qui se comporte généralement comme un tableau de caractères), puis en prenant l'intersection (
&
) ou l'union (|
) avec elle-même. L'application d'un opérateur de jeu à un tableau (ou une chaîne) réduit tout doublon, mais conserve l'ordre des éléments.la source
CJam, 3 octets
Setwise ou de l'entrée avec une liste vide. CJam les opérations sur les ensembles préservent l’ordre des éléments.
Essayez-le en ligne
la source
C # 6, 18 + 67 = 85 octets
Nécessite cette
using
déclaration:La méthode actuelle:
Cette méthode enregistre certains caractères en définissant la fonction en tant que lambda , qui est prise en charge en C # 6. Voici comment cela se présenterait en C # pré-6 (mais non golfé):
Comment ça marche: J'appelle la
Where
méthode sur la chaîne avec un lambda avec deux arguments:x
représentant l'élément en cours,i
représentant l'index de cet élément.IndexOf
renvoie toujours le premier index du caractère qui lui est passé, donc sii
n'est pas égal au premier index dex
, il s'agit d'un caractère en double et ne doit pas être inclus.la source
static void Main
etc.).Rétine , 14 octets
Chaque ligne doit aller dans son propre fichier séparé, ou vous pouvez utiliser l'
-s
indicateur pour lire à partir d'un fichier.Pour l'expliquer, nous allons utiliser cette version plus longue mais plus simple:
La première ligne est la regex avec laquelle faire correspondre (
+`
est la chaîne de configuration qui continue à s'exécuter jusqu'à ce que tous les remplacements aient été effectués). La regex recherche un caractère (nous l'appellerons C), suivi de zéro ou de plusieurs caractères arbitraires, suivi de C. Les parenthèses désignent les groupes capturés. Nous remplaçons donc la correspondance par C ($1
) et les caractères entre ($2
), enlever la copie de C.Par exemple, si la chaîne d'entrée était
unique
, la première exécution correspondraituniqu
avec, avecu
etniq
comme$1
et$2
, respectivement. Il remplacerait alors la sous-chaîne correspondante dans l'entrée d'origine avecuniq
, en donnantuniqe
.la source
Perl, 21 (20 octets +
-p
)Usage:
la source
$h{$&}
et en utilisant une logique ET à la place d'un opérateur ternaire:s/./!$h{$&}++&&$&/eg
1
s dans la sortie, mais ce n'est pas le cas! Merci, mise à jour!s/./$h{$&}++||$&/eg
(je suis tombé amoureux de ça aussi au début). Dommage car cela aurait été un autre octet enregistré.Macaroni 0.0.2 , 233 octets
Ceci est un programme complet, qui entre à partir de STDIN et qui sort sur STDOUT.
Version enveloppée, pour la valeur esthétique:
Et une version fortement "commentée" et non-golfée (il n'y a pas de commentaire dans Macaroni, je n'utilise donc que des littéraux de chaîne nue):
(Ceci est le premier vrai programme Macaroni (qui fait quelque chose)! \ O /)
la source
JavaScript ES7,
373325 octetsApproche assez simple en utilisant ES6
Set
et ES7multidisque compréhensionsOPERATEUR:22 octets de moins que l'
indexOf
approche. Travaillé sur une poignée de cas de test.la source
for
l'expression « ne sont pas nécessaires et vous pourriez le faire fonctionner anonyme que d'autres solutions ont:s=>[for(c of Set(s))c].join``
. (Mise à jour de Pale: pas sûr à 100%, mais lenew
mot clé semble également inutile.)new
résultatUncaught TypeError: Constructor Set requires 'new'
dans Google Chrome.C # 6 - 18 + 46 = 64
et alors
La
Enumerable.Union
méthode d'extension spécifie que les éléments sont renvoyés dans l'ordre d'origine:Les opérations sur les ensembles qui ne sont pas spécifiquement destinées à rechercher des valeurs uniques semblent être autorisées à en juger par les autres réponses.
la source
string u(string s)=>String.Join("",s.Distinct());
mais c'est un peu plus long.Distinct()
déjà été utilisée , mais elle a été supprimée car elleDistinct()
n'est pas autorisée dans ce défi, car il s'agit d'une méthode spécifiquement conçue pour rechercher des valeurs uniques.s => string.Concat(s.Union(s))
valide? Ce serait le délégué passé à unFunc<string, string>
comme argument.JavaScript ES6, 47 octets
Le test ci-dessous fonctionne sur tous les navigateurs.
la source
<i?'':e
partie?e
est antérieure à l'index actueli
, elle renvoie une chaîne vide, éliminant ainsi le caractère. S'il s'agit de la première instance, elle retourne simplemente
et aucune modification n'est apportée.MATLAB, 23 ans
Est-ce que "set union" de la chaîne d'entrée avec lui-même, en utilisant la méthode 'stable' qui ne trie pas, puis imprime.
Cela fonctionne car
union
renvoie uniquement les valeurs non dupliquées après la fusion. Donc, essentiellement, si vousunion
la chaîne avec elle-même, elle produit d'abord une chaîne commeType unique chars!Type unique chars!
, puis supprime tous les doublons sans trier.Pas besoin de
unique
:)la source
unique
non autorisé, désolé! C'est dans la définition du défisetdiff
avec l''stable'
option?disp
car vous avez alors une fonction qui renvoie une chaîne, ce qui est autoriséintersect
avec'stable'
pour obtenir le même effet. J'allais écrire ça, mais vu cette réponse, ce n'est plus l'original lol.> <> , 16 octets
> <> n'a pas de chaînes, nous utilisons donc la boîte à code. En raison de la nature toroïdale de> <>, les opérations suivantes tournent en boucle:
Notez que cela utilise le fait que l'entrée ne contient que de l'ASCII imprimable, car cela ne fonctionnerait pas si l'ASCII 0 était présent.
la source
Faisceau ,
2318 octetsEssayez-le en ligne!
la source
Element ,
221918 octetsExemple d'entrée / sortie:
hello world
->helo wrd
Cela fonctionne simplement en traitant la chaîne un caractère à la fois et en gardant une trace de ceux qu’il a vus auparavant.
la source
Python 2, 42 octets
Utilise quelques fonctions anonymes et
reduce
.Essayez-le en ligne
la source
Python 3, 44
Construit la chaîne de sortie
r
caractère par caractère, y compris le caractèrec
de l'entrée uniquement si nous ne l'avons pas encore vue.Python 2 aurait 47 ans, perdant 4 caractères avec
raw_input
et en sauvegardant 1 sans avoir besoin de parersprint
.la source
input
Python 2, vous pouvez donc raccourcir votre octet.APL, 3
Ceci s'applique à l'union () entre chaque élément du vecteur, obtenant une itération ayant pour effet de supprimer les doublons.
Testez-le sur tryapl.org
Le vieux:
Ceci utilise ~ (avec les arguments inversés, en utilisant ⍨) appliqué entre chaque élément de l'argument. Le résultat est que pour chaque élément, s'il est déjà dans la liste, il est effacé.
la source
Perl,
54 à27 octetsTester:
la source
print exists($h{$_})?"":$_
→$h{$_}||print
$h{$_}||=print
utilisation<>=~/./g
devrait également vous aider à économiser un peu plus!map
améliorerait également l'économie:map{$h{$_}||=print}<>=~/./g
PHP, 72 octets
84 octetsUtilise les caractères comme clés pour un tableau associatif, puis imprime les clés. L'ordre des éléments du tableau est toujours l'ordre d'insertion.
Merci Ismael Miguel pour cette
str_split
suggestion.la source
<?foreach(str_split($argv[1])as$c)$a[$c]=0;echo join('',array_keys($a));
Plus court et fait la même chose.while($c=$argv[1][$i++*1])
. Cela remplace le toutforeach
. Tout le reste est pareil"0"
. Essayez "abc0def" comme entrée.Pyth, 7 octets
Pseudocode:
z = entrée
somme de l'index de classement dans z sur N sur l'ensemble de z.
la source
Julia,
4542 octetsAncienne version:
Le code construit la nouvelle chaîne en y ajoutant de nouveaux caractères, puis
join
les regroupe en une chaîne appropriée à la fin. La nouvelle version enregistre certains caractères en effectuant une itération via la compréhension du tableau. Enregistre également un octet en utilisant?:
plutôt que||
(car cela supprime le besoin de crochets autour de l'affectation).Solution alternative, 45 octets, utilisant la récursivité et regex:
Julia, 17 octets
(Version alternative)
Cela
union
remplace fondamentalementunique
- je ne considère pas cela comme la "vraie" réponse, car j'interprète "ne pas utiliserunique
" comme signifiant "n'utilise pas une seule fonction intégrée qui a pour effet de renvoyer l'unique éléments".la source
Java, 78 octets
Une boucle simple lors de la vérification de la sortie pour les caractères déjà présents. Accepte l’entrée en tant que
char[]
.la source
C, 96 octets
Ceci utilise un tableau d'entiers, indexé par le nombre de caractères ASCII. Les caractères ne sont imprimés que si cet endroit du tableau est défini sur FALSE. Une fois que chaque nouveau caractère est trouvé, cet emplacement du tableau est défini sur TRUE. Cela prend une ligne de texte à partir de l'entrée standard, terminée par une nouvelle ligne. Il ignore les caractères non-ASCII.
Ungolfed:
la source
C - 58
Merci à @hvd et @AShelly pour avoir sauvegardé de nombreux personnages. Il y avait plusieurs façons de le rendre beaucoup plus court que l'original:
Comme vous pouvez le constater, la modification en place semble être la plus courte (à ce jour!). Le programme de test compile sans avertissements à l'aide de
gcc test.c
Merci pour votre aide. J'apprécie tous les conseils donnés pour raccourcir autant!
la source
r
queint
(sans indiquerint
) pour enregistrer quelques octets:f(s,r)char*s;{...}
. Mais cela limite votre code aux plates-formes oùchar*
la taille est la mêmeint
, et bien sûr où les compilateurs sont aussi indulgents que les vôtres et les miens.if(x)y
parx?y:0
f(char*s){int a[128]={0};for(;*s;s++)a[*s]++?0:putchar(*s);}
*q
, et seulement incrémenterq
si le personnage est apparu plus tôt, ce qui permet la farce un peu plus ensemble:void f(char*s,char*r){for(char*q=r;*q=*s;strchr(r,*s++)<q||q++);}
(Notez questrchr(r,*s++)<q
toujours bien définie, il n'y a pas UB là, parce questrchr
ne peut pas revenirNULL
dans cette version.) A l' exception du type de retour, c'est même plus court que la version de @ AShelly.Ruby,
3024 caractères(Code de 23 caractères + option de ligne de commande de 1 caractère.)
Échantillon échantillon:
la source
CJam, 9
Cela ne convertit pas une chaîne en un jeu, mais une sorte de différence pour déterminer si un caractère est trouvé dans une chaîne. Essayez-le en ligne
Explication:
Une autre version, 13 octets:
Cela ne fait rien lié aux ensembles. Essayez-le en ligne
Explication:
la source
TI-BASIC, 49 octets
Les variables d'équation sont rarement utiles, car elles nécessitent 5 octets à stocker, mais elles s'avèrent utiles
Y₁
ici en tant queX
caractère de la chaîne, ce qui permet d'économiser 3 octets. Comme nous ne pouvons pas ajouter de chaînes vides dans TI-BASIC, nous commençons la chaîne par le premier caractère de Str1, puis nous parcourons le reste de la chaîne en ajoutant tous les caractères non encore rencontrés.la source
Matlab, 46 octets
Il utilise une fonction anonyme, avec des arguments de fonction en entrée et en sortie:
(Je ne pouvais pas faire fonctionner cela avec un interprète en ligne Octave.)
Exemple d'utilisation:
la source
,1
deany
, avec .1
c'est pourtriu
(je dois enlever la diagonale), pas pourany
Befunge -93, 124 octets
Testez-le dans cet interprète en ligne .
C'était plus difficile que prévu. Je publierai une explication plus détaillée demain si quelqu'un le souhaite, mais voici un aperçu de ce que fait mon code.
2,0
la droite et en s’étendant à droite. Ceci est vérifié pour voir si le caractère actuel est un doublon.0,0
et le compteur de boucles de recherche de doublons est stocké1,0
.0,0
entré est incrémenté.la source
PHP,
5654Évinçant @ de fschmengler réponse en utilisant
array_flip
deux fois - deuxième version utilise la méthode variable et repose sur la coulée de la chaîne à true, annihilant à faux, puis le jeter de nouveau à la chaîne vide dans le premier argument pour sauver un couple d'octets dans le second. Pas cher!la source
Haskell , 29 octets
Une doublure emboîtable sans nom de variable:
Même compte, enregistré dans une fonction nommée
f
déclaration de niveau supérieur:Notez qu’il existe une optimisation légèrement trompeuse que je n’ai pas faite dans un esprit de gentillesse: techniquement, les règles de ce défi autorisent toujours l’utilisation d’un codage d’entrée et de sortie différent pour une chaîne. En représentant any
string
par son codage Church partiellement appliqué\f -> foldr f [] string :: (a -> [b] -> [b]) -> [b]
(avec l’autre côté de la bijection fourni par la fonction($ (:))
)($ \x->(x:).filter(x/=))
, on ne voit que 24 caractères.J'ai évité d'afficher la réponse de 24 caractères comme étant la réponse officielle, car la solution ci-dessus pourrait être testée sur l'interprète ci-dessus, alors
foldr(\x->(x:).filter(x/=))[]"Type unique chars!"
que la solution avec golf serait écrite à la place:comme un raccourci pour la déclaration littérale qui serait le plus aliéné:
Mais c'est une version parfaitement valide de la structure de données représentée sous forme de fonctions pures. (Bien sûr, vous pouvez
\f -> foldr f [] "Type unique chars!"
aussi utiliser , mais cela est probablement illégitime, car il utilise des listes pour stocker les données. Par conséquent, sa partie repliée devrait alors être composée dans la fonction "réponse", ce qui donne plus de 24 caractères.)la source