Une sorte de quine


30

Étant donné une chaîne x, affichez les caractères dansx triés selon l'ordre d'apparition dans votre code source.

Exemples

Source: ThisIs A Test
 Input: Is it a Test?
Output: TissI   etta?

Source: Harry - yer a wizard.
 Input: I'm a what?
Output: aa  wh'?Imt

Source: Mr. H. Potter, The Floor, Hut-on-the-Rock, The Sea
 Input: 
Output:

Règles

  • Les échappatoires standard et les règles d'E / S s'appliquent
  • L'entrée et la sortie peuvent être une chaîne, une liste de caractères ou une liste d'octets.
  • Si un caractère est utilisé plusieurs fois dans la source, utilisez la première occurrence.
  • Si un ou plusieurs caractères n'apparaissent pas dans la source, ils doivent être à la fin; leur ordre n'a pas d'importance, ni ne doit être cohérent.
  • La source doit être non vide
  • Les retours à la ligne sont traités de la même manière que les autres caractères.
  • L'ordre dans lequel le code est exécuté n'a pas d'importance; juste la chaîne brute.
  • L'entrée est dans le même codage que le code.
  • L'entrée est triée par caractères et non par octets.
  • Le tri est sensible à la casse
  • Il s'agit de , donc la réponse la plus courte en octets pour chaque langue gagne!


2
@negativeseven Tous les caractères de l'encodage du code source doivent être pris en compte, y compris les espaces.
tjjfvi


3
Vous devriez probablement mentionner explicitement dans la spécification que la correspondance est sensible à la casse.
Shaggy

1
Pouvons-nous être xencodés en UTF-8 ou UTF-16 si notre solution n'est pas du tout encodée en Unicode et que les caractères Unicode xreprésentent des caractères dans la page de codes de la solution? Par exemple, certaines langues de golf utilisent des pages de codes personnalisées pour réduire leur nombre d'octets tout en restant lisibles à l'œil nu.
Erik the Outgolfer

1
@tjjfvi Je ne parle pas ici de non-opérations (ce qui serait certainement invalide); au moins quelques-unes des réponses ci-dessous, au lieu de prendre l'entrée en octets simples (0x00-0xFF), prenez l'entrée comme chaîne UTF-8 que la séquence d'octets représenterait (par exemple, lorsque nous publions une réponse, nous publions généralement l'UTF -8 de notre code, pas le hexdump), puis utilisez la représentation UTF-8 du code source pour trier l'entrée. Est-ce permis? Je pense que cela devrait également être une option (à côté du flux d'octets simples), sinon les solutions dans les langues de golf avec des pages de codes personnalisées seraient considérablement entravées.
Erik the Outgolfer

Réponses:


13

Python 3,8 (pré-presse) , 102 100 96 85 79 76 68 61 59 60 octets

c="print(sorted(x:=input(),key=('c=%r;'%c+x).find))";exec(c)

Essayez-le en ligne!

-2 octets en utilisant ceci

-4 octets en réalisant que <0== ==-1et en supprimant l'inutile+1

-11 octets grâce à Neil

-6 octets grâce à dzaima

-3 octets grâce à la tige

-8 octets grâce à sept négatifs indiquant que le programme peut afficher une liste de caractères

-7 octets en raison de l'incarnation de l'ignorance revenant à Python 3.8 et utilisant :=

-2 octets en raison de la substitution par Jo King du nom de variable s pour c, nous pourrions donc laisser de ;c

+1 octet, car sept négatifs ont indiqué qu'il ne filtrait pas ;correctement


('s=%r;exec(s)'%s+x).find(x)?
Neil

@Neil La solution actuelle est-elle invalide et la remplacer ('s=%r;exec(s)'%s).find(x)par votre code la rendrait-elle valide?
MilkyWay90

@Neil Oh, attendez, je vois votre golf
MilkyWay90

Vous pouvez basculer vers input()et enregistrer 4 octets
Rod

4
;n'est pas trié correctement dans la version actuelle
négatif sept

7

APL (Dyalog Unicode) , 14 octets SBCS

Fonction de préfixe tacite anonyme.

'''∘⍋⊃¨⊂'∘⍋⊃¨⊂

 joindre l'argument (pour agir dans son ensemble)

… À ⊃¨ partir de là, choisissez un caractère pour chacun des indices suivants:

∘⍋ les indices qui trieraient l'argument dans l'ordre donné par la chaîne suivante (tous les non-membres vont par ordre d'apparition à la fin):

'''∘⍋⊃¨⊂' les personnages '∘⍋⊃¨⊂

Essayez-le en ligne!





3

Rubis , 57 octets

->s{s.sort_by{|o|%{->s{.ort_by|%}index()9}.index(o)||99}}

Essayez-le en ligne!

Assez simple, en supposant que je n'ai pas raté un tour de golf. Prenez une liste de caractères et triez par leur index dans une chaîne composée de tous les caractères uniq du code dans l'ordre de leur apparition. Souvent, leur première apparition est dans cette même chaîne, mais cela ne change pas l'ordre.


3

05AB1E , 24 22 21 octets

Σ"Σ"'"«"'«Rrk}"«Rrk}R

Essayez-le en ligne!

Explication:

Σ                    }               # Sort
 "Σ"                                 # Σ string literal
    '"                               # " string literal
       «                             # Concatenate last two literals
        "'«Rrk}"                     # '«Rrk} another literal
                «                    # Concat again
                 R                   # Reverse literal (so: }krR'«'"Σ)
                  r                  # reverse stack 
                   k                 # find the current sorting index in our code string 
                     R               # reverse our sorted string

Première fois que vous essayez des trucs dans 05AB1E, donc probablement beaucoup à économiser


Etes-vous sûr que c'est correct? La chaîne sur laquelle il est désormais trié est }krR«'«. REMARQUE: 'est un seul caractère, il '"suffit donc (contrairement à C # où il a besoin d'un suivi supplémentaire '). Actuellement, votre code pousse d'abord la chaîne Σ, puis la chaîne ", puis la chaîne «, puis la chaîne '«Rrk}, puis il ajoute, inverse, pile inverse, index. Une utilisation intelligente de l'inverse de la chaîne et à la fin, cependant! Je vais voir si je peux trouver un correctif pour votre réponse et je supprimerai la mienne par la suite.
Kevin Cruijssen

@kevincruijssen Alors, je ne peux pas simplement me débarrasser du second '
Données expirées

1
Oui, vous pouvez en effet. :) Ensuite, il trie correctement }krR«'"Σ. PS: j'ai tendance à utiliser =(imprimer sans éclater) à des fins de débogage parfois. Vous pouvez également ajouter --debug-stackcomme argument, mais c'est un peu bizarre dans la nouvelle version 05AB1E à mon humble avis.
Kevin Cruijssen

3

Jelly , 16 14 octets (page Jelly Code), 25 octets (UTF8)

“Ṿv`Ṿ;³³i@Þ”v`

Essayez-le en ligne!

Un programme complet qui prend un seul argument, la chaîne à trier.

Merci à @JonathanAllan d'avoir signalé un bug!

Selon @EriktheOutgolfer, bien que le code puisse être entré à l'aide de la page de codes Jelly, les caractères triés sont les équivalents UTF-8 plutôt que les octets de la source. En tant que tel, j'ai également inclus le score dans les octets UTF-8. Notez que la même chose s'applique probablement à toutes les langues avec des pages de codes personnalisées.

Explication

“Ṿv`Ṿ;³³i@Þ”   | The string "Ṿv`Ṿ;³³i@Þ", referred to below as S
            v` | Evaluate this string as Jelly code using the string itself as the argument

La chaîne ci-dessus s'évalue comme:

Ṿ          | Uneval the string S (effectively wraps it in “”)
 v`        | Eval it (effectively removes the “”)
   Ṿ       | Uneval it again, adding back in the “”
    ;³     | Concatenate the input to this
      ³i@Þ | Sort the input with respect to the first occurence of each character in the “”-wrapped string S concatenated to the input

Ṿv` est un no-op effectivement ici, mais existe pour s'assurer que tous les personnages sont représentés.


Alors ... j'ai posté ma réponse Jelly, puis elle a cliqué sur moi: l'interprète convertit le bytecode en UTF-8 avant de l'exécuter , donc soit le bytecount devrait être augmenté, soit le code devrait être modifié pour s'adapter à la page de code.
Erik the Outgolfer le

@EriktheOutgolfer Je ne comprends pas ce que vous obtenez ici. En quoi est-ce différent de tout autre défi de codegolf à cet égard?
Nick Kennedy

L'aspect autoréférentiel est différent, donc, en fait, le code trie les caractères UTF-8 et non les octets qu'il est censé faire.
Erik the Outgolfer le

3

Gelée , 14 octets

“;fɓḟṾⱮ”ṾɓfⱮ;ḟ

Un programme complet acceptant une chaîne (formatée Python) (de caractères de page de code Jelly ) qui imprime la sortie.
(en tant que lien monadique, il fournit une liste de listes de caractères)

Essayez-le en ligne!

Comment?

“;fɓḟṾⱮ”ṾɓfⱮ;ḟ - Main Link: list of characters, S
“;fɓḟṾⱮ”       - list of characters = [';', 'f', 'ɓ', 'ḟ', 'Ṿ', 'Ɱ']
        Ṿ      - un-evaluate = ['“', ';', 'f', 'ɓ', 'ḟ', 'Ṿ', 'Ɱ', '”']
         ɓ     - start a new dyadic chain, F(S, T=that):
           Ɱ   - for each character, t, in T:
          f    -   (S) filter keep any of (the single character, t)
             ḟ - (S) filter discard any of (the characters in T)
            ;  - concatenate

Alors ... j'ai posté ma réponse Jelly, puis elle a cliqué sur moi: l'interprète convertit le bytecode en UTF-8 avant de l'exécuter , donc soit le bytecount devrait être augmenté, soit le code devrait être modifié pour s'adapter à la page de code.
Erik the Outgolfer le

@EriktheOutgolfer Je pense que celui-ci est sûr à cet égard puisque cette méthode n'utilise aucun tri et répond aux E / S étant dans les mêmes critères d'encodage (page de code de Jelly).
Jonathan Allan

Eh ... Je pense que fet je travaille sur les caractères Unicode, car c'est le genre de caractères que la chaîne contient réellement. Par exemple, ”ĿOrenvoie 319si testé localement codé en JELLY, il voit donc le Ŀet non le C7.
Erik the Outgolfer le

Je pense fet travaille aussi sur Unicode, mais est-ce un problème ici? Je passe le jeu restreint de caractères Unicode qui apparaissent sur la page de code de Jelly (c'est-à-dire les octets codés en utilisant ce codage, remplissant "L'entrée est dans le même codage que le code"); les filtrer correctement (car ces octets entrés ont été encodés en Unicode), puis les sortir correctement. Ce que je compte ensuite, ce sont les octets du code (remplissant "L'entrée est triée par caractères, pas par octets" et "la réponse la plus courte en octets pour chaque langue gagne").
Jonathan Allan

1
@JonathanAllan J'ai l'impression que le "ont été encodés pour certains caractères en utilisant la page de codes de Jelly" est ce à quoi je fais référence dans mon commentaire précédent. Étant donné que le codage du code se compose d'octets uniques de 0x00 à 0xFF, c'est ce que le codage de l'argument devrait également comprendre.Au lieu de cela, l'argument est passé après avoir été mappé de JELLY à UTF-8, donc chacun de ses caractères n'est pas nécessairement un seul octet plus. Fondamentalement, le code est en JELLY tandis que l'argument est en UTF-8, même s'il a été mappé à celui de JELLY. Bien que la sortie UTF-8 correcte soit renvoyée, elle devrait toujours être JELLY.
Erik the Outgolfer

2

Fusain , 37 octets

≔´≔´´´η´F´Φ´θ´⁼´ι´κ´¬´№ηFηΦθ⁼ικΦθ¬№ηι

Essayez-le en ligne!Explication:

≔´≔´´´η´F´Φ´θ´⁼´ι´κ´¬´№η

Il existe deux façons de citer des caractères dans Charcoal; ´cite n'importe quel caractère tandis que ”y... cite tout caractère sauf et compte également comme une chaîne distincte. Il s'avère que le surcoût lié à la gestion signifie qu'il ne finit pas par un golfeur.

FηΦθ⁼ικ

Faites une boucle sur les caractères à tour de rôle, en sortant tous les caractères correspondants de l'entrée. Cela trie l'entrée.

Φθ¬№ηι

Sortez tous les caractères sans correspondance dans l'entrée.


2

J , 14 octets

Fonction de préfixe tacite anonyme.

]/:']/:''i'i:]

Essayez-le en ligne!

] l'argument

i: Dernière occurrence (les non-membres récupèrent l'index au-delà de la fin de la chaîne de recherche) de chaque caractère dans:

']/:''i' les personnages ]/:'i

/: Utilisez-le pour trier:

] l'argument


Les quatre espaces de tête sont-ils le résultat de l'écho ou du code?
tjjfvi

1
@tjjfvi C'est ainsi que TIO est configuré. Fixé maintenant.
Adám

2

Java 10, 129 100 octets

s->{s.sort(java.util.Comparator.comparing(c->("s->{.ort(javuilCmpcng\"\\+)dexOf;}"+c).indexOf(c)));}

-29 octets en portant la réponse C #+c de @EmbodimentOfIgnorance .

Essayez-le en ligne.

Explication:

s->{                 // Method with char-List parameter and no return-type
  s.sort(java.util.Comparator.comparing(c->
    ("s->{.ort(javuilCmpcng\"\\+)dexOf;}"
                     //  Push a String containing the characters in the code
     +c)             //  Append the current character
        .indexOf(c)  //  And get the first index of the current character in the String

REMARQUE: il est généralement moins cher d'utiliser s.sort((a,b)->Long.compare(a,b))au lieu de s.sort(java.util.Comparator.comparing(c->c), mais dans ce cas, il serait plus long de 11 octets:

s->{var v="s->{var =\"\\;.ot(,)Lngcmpe+idxOf}";s.sort((a,r)->Long.compare((v+a).indexOf(a),(v+r).indexOf(r)));}

Essayez-le en ligne.


2

05AB1E , 31 26 19 octets

Σ'"'ÿs"Σ'ÿÿsìyk"ìyk

-7 octets en s'inspirant de l'approche de @ EmbodimentOfIgnorance dans sa réponse C # consistant à ajouter le caractère courant avant l'indexation.

Essayez-le en ligne ou essayez-le avec une ligne de débogage supplémentaire pour voir les chaînes qui sont indexées .

Explication:

Σ                 # Sort the (implicit) input-string by:
 '"              '#  Push string '"'
   'ÿ            '#  Push string "ÿ"
     s            #  Swap the order of these two strings on the stack
      "Σ'ÿÿsìyk"  #  Push string "Σ'ÿÿsìyk", where the `ÿ` are automatically filled with
                  #  the previous strings we created: `Σ'"ÿsìyk`
                  #  (top to bottom from stack; left to right in string)
       ì          #  Prepend this string in front of the character we're sorting
        yk        #  And then get the index of the character we're sorting in this string
                  # (after the sorting the resulting string is output implicitly)

Il semble y avoir une faute de frappe dans l'explication ("y" au lieu de "s")
ArBo

@ArBo Fixed, thanks
Kevin Cruijssen

1
À proprement parler, j'ai eu cette inspiration plus de 12 heures plus tôt lorsque j'ai joué au golf 11 octets de la réponse de @ MilkyWay90 ...
Neil

C'est bon! J'ai vu cela, mais je n'ai pas vu de moyen de transformer le mien en ceci tout en économisant des octets
Expired Data

2

PowerShell , 68 octets

$p=$args
&($t={$p|sort-object{"`$p=`$args
&(`$t={$t})$_"|% i*f $_}})

Essayez-le en ligne!


2
1) à la sortplace sort-objectfonctionne aussi. 2) la variable $bdéfinie hors de portée de votre code. l' Standard loopholesexige une réponse complète . Pour Powershell, cela signifie: toute personne peut câbler le code dans un fichier en tant que script powershell et l'exécuter dans un terminal. Votre code ne fonctionne pas à partir du fichier de script. Désolé.
mazzy

1
@mazzy, merci beaucoup. 1) l' sortalias ne fonctionne pas dans pwsh sur Ubuntu 18.04 2) oui, c'est ma faute, mais je me suis corrigé, et en conséquence, le code est devenu plus long, bien sûr :)
Andrei Odegov

(oO)! J'ai créé un alias de tri pour Powershell . code became longer- c'est le défi :)
mazzy

1
Oui, tu as raison. Chaque caractère individuel de $pest ajouté à la fin de la chaîne avec le code source et obtient un index égal à $src.Length, mais puisque «leur ordre n'a pas d'importance et ne doit pas être cohérent», il n'a pas d'importance. Dans cette réponse , la chaîne d'entrée entière est ajoutée à la fin de la chaîne avec le code source.
Andrei Odegov

1
@dfeuer, je ne comprends pas votre question. Désolé.
Mazzy


2

Japt, 18 bytes

ñÈi"ñÈi\"\\ bX" bX

Try it

ñÈi"ñÈi\"\\ bX" bX     :Implicit input of string or character array
ñ                      :Sort by
 È                     :Passing each X through the following function
  i                    :  Prepend X with
   "ñÈi\"\\ bX"        :    Literal string (The \s are annoying me!)
                bX     :  First index of X

1

Jelly, 26 bytes (UTF-8*)

“®³nÞṾ©V”Ṿ©VV

Try it online!

Takes input as a Python-formatted string in the 1st command-line argument.

Unique characters:

“®³nÞṾ©V”

*Note: I discovered that this doesn't work when encoded in JELLY, since it sorts the UTF-8 characters instead of its own bytes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.