Eine Art Quine

30

Wenn Sie eine Zeichenfolge angegeben haben x, geben Sie die Zeichen xsortiert nach der Reihenfolge des Auftretens in Ihrem Quellcode aus.

Beispiele

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:

Regeln

  • Es gelten Standard-Regelungslücken
  • Eingabe und Ausgabe können entweder eine Zeichenfolge, eine Liste von Zeichen oder eine Liste von Bytes sein.
  • Wenn ein Zeichen in der Quelle mehrfach verwendet wird, verwenden Sie das erste Vorkommen.
  • Wenn ein oder mehrere Zeichen nicht in der Quelle erscheinen, sollten sie am Ende stehen. Ihre Reihenfolge spielt keine Rolle und muss auch nicht konsistent sein.
  • Die Quelle darf nicht leer sein
  • Zeilenumbrüche werden wie andere Zeichen behandelt.
  • Die Reihenfolge, in der der Code ausgeführt wird, spielt keine Rolle. Nur die rohe Saite.
  • Die Eingabe erfolgt in derselben Codierung wie der Code.
  • Die Eingabe ist nach Zeichen und nicht nach Bytes sortiert.
  • Beim Sortieren wird zwischen Groß- und Kleinschreibung unterschieden
  • Das ist , also gewinnt die kürzeste Antwort in Bytes für jede Sprache!

tjjfvi
quelle
2
@negativeseven Alle Zeichen aus der Quellcode-Codierung müssen berücksichtigt werden, einschließlich Leerzeichen.
tjjfvi
2
verwandt
Rod
3
Sie sollten wahrscheinlich ausdrücklich in der Spezifikation erwähnen, dass bei der Übereinstimmung die Groß- und Kleinschreibung beachtet wird.
Shaggy
1
Können wir xin UTF-8 oder UTF-16 codiert werden, wenn unsere Lösung überhaupt nicht in Unicode codiert ist und die Unicode-Zeichen in xden Zeichen auf der Codepage der Lösung stehen? Einige Golfsprachen verwenden beispielsweise benutzerdefinierte Codeseiten, um die Anzahl der Bytes zu verringern, sind jedoch mit bloßem Auge lesbar.
Erik der Outgolfer
1
@tjjfvi Ich spreche hier nicht von No-Ops (was sicherlich ungültig wäre); Bei mindestens einigen der folgenden Antworten wird die Eingabe nicht in einfachen Bytes (0x00-0xFF), sondern als UTF-8-Zeichenfolge verwendet, für die die Bytesequenz stehen würde (z. B. wenn wir eine Antwort veröffentlichen, veröffentlichen wir normalerweise die UTF -8 Version unseres Codes, nicht der Hexdump), und sortieren Sie die Eingabe dann mit der UTF-8-Darstellung des Quellcodes. Ist das erlaubt? Ich denke, es sollte auch eine Option sein (neben dem einfachen Byte-Stream), da sonst Lösungen in Golf-Sprachen mit benutzerdefinierten Codepages stark behindert würden.
Erik der Outgolfer

Antworten:

13

Python 3.8 (Vorabversion) , 102 100 96 85 79 76 68 61 59 60 Byte

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

Probieren Sie es online!

-2 Bytes, indem Sie dies verwenden

-4 Bytes durch Erkennen <0== ==-1und Entfernen des Unnötigen+1

-11 Bytes dank Neil

-6 Bytes dank Dzaima

-3 Bytes dank Stange

-8 Bytes dank negativer Sieben, die darauf hinweisen, dass das Programm eine Liste von Zeichen ausgeben kann

-7 Bytes aufgrund der Verkörperung der Ignoranz, die zurück zu Python 3.8 wechselt und verwendet :=

-2 Bytes, da Jo King den Variablennamen s für c ausschaltet, so dass wir das weglassen könnten ;c

+1 Byte, da negative Sieben darauf hinwiesen, dass die Filterung nicht ;korrekt war

MilkyWay90
quelle
('s=%r;exec(s)'%s+x).find(x)?
Neil
@Neil Ist die aktuelle Lösung ungültig, und das Ersetzen ('s=%r;exec(s)'%s).find(x)mit Ihrem Code würde sie gültig machen?
MilkyWay90
@Neil Oh, warte, ich sehe deinen Golf
MilkyWay90
Sie können zu 4 Bytes wechseln input()und diese speichern
Rod
4
;wird in der aktuellen Version nicht richtig sortiert
negativ sieben
7

APL (Dyalog Unicode) , 14 Byte SBCS

Anonyme implizite Präfixfunktion.

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

 Argument beifügen (als Ganzes handeln)

⊃¨ Wählen Sie dann für jeden der folgenden Indizes ein Zeichen aus:

∘⍋ Die Indizes, die das Argument in der durch die folgende Zeichenfolge angegebenen Reihenfolge sortieren würden (alle Nichtmitglieder werden in der Reihenfolge ihres Erscheinens am Ende angezeigt):

'''∘⍋⊃¨⊂' die Charaktere '∘⍋⊃¨⊂

Probieren Sie es online!

Adam
quelle
5

JavaScript (Node.js) , 60 58 56 Bytes

-2 Bytes von Jo King

f=_=>_.sort((a,b)=>(p=g=>`f=${f+g}`.indexOf(g))(a)-p(b))

Probieren Sie es online!

Luis Felipe De Jesus Munoz
quelle
Ihr Code scheint nur zu funktionieren, wenn die Quelle ist f=.... Wenn dies der Fall ist, geben Sie dies bitte bei Ihrer Übermittlung und der Anzahl der Bytes an.
tjjfvi
3

Ruby , 57 Bytes

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

Probieren Sie es online!

Ziemlich einfach, vorausgesetzt, ich habe keinen Golftrick verpasst. Nehmen Sie eine Liste von Zeichen auf und sortieren Sie nach ihrem Index in einer Zeichenfolge, die aus allen eindeutigen Zeichen im Code in der Reihenfolge ihres Auftretens besteht. Oft ist ihr erster Auftritt in genau dieser Zeichenfolge, aber das ändert nichts an der Reihenfolge.

Histokrat
quelle
3

05AB1E , 24 22 21 Bytes

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

Probieren Sie es online!

Erläuterung:

Σ                    }               # 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

Das erste Mal Sachen in 05AB1E ausprobiert, also wahrscheinlich viel zu retten

Abgelaufene Daten
quelle
Sind Sie sicher, dass dies korrekt ist? Die Zeichenfolge, nach der jetzt sortiert wird, ist }krR«'«. HINWEIS: Ist 'ein einzelnes Zeichen, reicht dies '"aus (im Gegensatz zu C #, wo ein zusätzliches Trailing erforderlich ist '). Gegenwärtig schiebt Ihr Code zuerst die Zeichenfolge Σ, dann die Zeichenfolge ", dann die Zeichenfolge «, dann die Zeichenfolge '«Rrk}und dann das Anhängen, Umkehren, Umkehren des Stapels und den Index. Schlauer Umgang mit der Rückseite der Saite und am Ende! Ich werde sehen, ob ich eine Lösung für Ihre Antwort finden kann, und meine anschließend löschen.
Kevin Cruijssen
@kevincruijssen Also kann ich nicht einfach die Sekunde loswerden
Abgelaufene Daten
1
Ja, das kannst du wirklich. :) Dann sortiert es richtig weiter }krR«'"Σ. PS: Ich benutze =(drucke ohne zu poppen) manchmal für Debug-Zwecke. Sie können auch --debug-stackals Argument hinzufügen , aber es ist ein bisschen seltsam in der neuen 05AB1E-Version imho.
Kevin Cruijssen
3

Jelly , 16 bis 14 Bytes (Jelly-Code-Seite), 25 Bytes (UTF8)

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

Probieren Sie es online!

Ein vollständiges Programm, das ein einziges Argument benötigt, die zu sortierende Zeichenfolge.

Vielen Dank an @ JonathanAllan für den Hinweis auf einen Fehler!

Laut @EriktheOutgolfer kann der Code zwar über die Jelly-Codepage eingegeben werden, die sortierten Zeichen sind jedoch die entsprechenden UTF-8-Zeichen und nicht die Bytes der Quelle. Daher habe ich die Punktzahl auch in UTF-8-Bytes aufgenommen. Beachten Sie, dass dies wahrscheinlich für alle Sprachen mit benutzerdefinierten Codepages gilt.

Erläuterung

“Ṿ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

Die obige Zeichenfolge wird wie folgt ausgewertet:

Ṿ          | 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` ist hier effektiv ein No-Op, existiert aber, um sicherzustellen, dass alle Charaktere dargestellt werden.

Nick Kennedy
quelle
Also ... ich habe meine Jelly-Antwort gepostet und sie hat mich angeklickt: Der Interpreter konvertiert den Bytecode vor der Ausführung in UTF-8 , daher sollte entweder der Byte-Wert erhöht oder der Code geändert werden, um ihn an die Codepage anzupassen.
Erik der Outgolfer
@EriktheOutgolfer Ich verstehe nicht, was Sie hier st bekommen. Inwiefern unterscheidet sich das von anderen Codegolf-Herausforderungen in dieser Hinsicht?
Nick Kennedy
Der selbstreferenzielle Aspekt ist anders, so dass der Code UTF-8-Zeichen sortiert und nicht die Bytes, die er haben soll.
Erik der Outgolfer
3

Jelly , 14 Bytes

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

Ein vollständiges Programm, das eine (Python-formatierte) Zeichenfolge (aus Jelly -Codepage- Zeichen) akzeptiert, die die Ausgabe druckt.
(als monadischer Link liefert er eine Liste von Listen von Zeichen)

Probieren Sie es online!

Wie?

“;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
Jonathan Allan
quelle
Also ... ich habe meine Jelly-Antwort gepostet und sie hat mich angeklickt: Der Interpreter konvertiert den Bytecode vor der Ausführung in UTF-8 , daher sollte entweder der Byte-Wert erhöht oder der Code geändert werden, um ihn an die Codepage anzupassen.
Erik der Outgolfer
@EriktheOutgolfer Ich denke, dass dies in dieser Hinsicht sicher ist, da diese Methode keine Sortierung verwendet und die E / A mit denselben Codierungskriterien (Jellys Codepage) erfüllt.
Jonathan Allan
Ähm ... Ich denke das fund arbeite an Unicode-Zeichen, denn das ist die Art von Zeichen, die der String tatsächlich enthält. Zum Beispiel ”ĿOkehrt es zurück, 319wenn es lokal in JELLY codiert getestet wird, so dass es das Ŀund nicht das C7 sieht .
Erik der Outgolfer
Ich denke fund arbeite auch an Unicode, aber ist das hier ein Problem? Ich übergebe den eingeschränkten Satz von Unicode-Zeichen, der auf Jellys Codepage angezeigt wird (d. H. Bytes, die mit dieser Codierung codiert wurden und "Die Eingabe erfolgt in derselben Codierung wie der Code"). Filtern Sie sie korrekt (da diese eingegebenen Bytes als Unicode codiert wurden) und geben Sie sie dann korrekt aus. Was ich dann zähle, sind die Bytes des Codes (Erfüllung "Die Eingabe wird nach Zeichen sortiert, nicht nach Bytes" und "kürzeste Antwort in Bytes für jede Sprache gewinnt").
Jonathan Allan
1
@JonathanAllan Ich habe das Gefühl, dass "mit Jellys Code-Seite für einige Zeichen codiert worden sind", worauf ich mich in meinem vorherigen Kommentar beziehe. Da die Codierung des Codes aus einzelnen Bytes von 0x00 bis 0xFF besteht, sollte auch die Codierung des Arguments aus diesen bestehen. Stattdessen wird das Argument nach der Zuordnung von JELLY zu UTF-8 übergeben, sodass jedes seiner Zeichen nicht unbedingt ein einzelnes sein muss Byte mehr. Grundsätzlich ist der Code in JELLY, während sich das Argument in UTF-8 befindet, obwohl es dem von JELLY zugeordnet wurde. Während die korrekte UTF-8-Ausgabe zurückgegeben wird, sollte sie die ganze Zeit über JELLY sein.
Erik der Outgolfer
2

Kohle , 37 Bytes

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

Probieren Sie es online! Erläuterung:

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

Es gibt zwei Möglichkeiten, Zeichen in Charcoal zu zitieren. ´setzt ein beliebiges einzelnes Zeichen in Anführungszeichen, während ”y... ein beliebiges Zeichen in Anführungszeichen setzt, außer und zählt auch als separate Zeichenfolge. Es stellt sich heraus, dass der Overhead im Umgang damit bedeutet, dass es keinen Golfer gibt.

FηΦθ⁼ικ

Durchlaufen Sie die Zeichen der Reihe nach und geben Sie alle übereinstimmenden Zeichen aus der Eingabe aus. Dies sortiert die Eingabe.

Φθ¬№ηι

Geben Sie alle nicht übereinstimmenden Zeichen in der Eingabe aus.

Neil
quelle
2

J , 14 Bytes

Anonyme implizite Präfixfunktion.

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

Probieren Sie es online!

] das Argument

i: Letztes Vorkommen (Nichtmitglieder erhalten den Index über das Ende der Suchzeichenfolge hinaus) jedes Zeichens in:

']/:''i' die Charaktere ]/:'i

… Damit /: sortieren:

] das Argument

Adam
quelle
Sind die vier führenden Leerzeichen ein Ergebnis des Echos oder des Codes?
tjjfvi
1
@tjjfvi So wird TIO konfiguriert. Jetzt behoben.
Adám,
2

Java 10, 129 100 Bytes

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

-29 Bytes durch Portierung der C # - Antwort+c von @EmbodimentOfIgnorance .

Probieren Sie es online aus.

Erläuterung:

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

HINWEIS: Normalerweise ist es billiger zu verwenden s.sort((a,b)->Long.compare(a,b))als s.sort(java.util.Comparator.comparing(c->c), aber in diesem Fall wären es 11 Bytes länger:

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

Probieren Sie es online aus.

Kevin Cruijssen
quelle
2

05AB1E , 31 26 19 Bytes

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

-7 Bytes, indem er sich in seiner C # -Antwort an den Ansatz von @Ausführungsbeispiel von Ignoranz anlehnt, das aktuelle Zeichen vor der Indizierung anzuhängen.

Probieren Sie es online aus oder probieren Sie es mit der hinzugefügten Debug-Zeile, um die Strings zu sehen, in die indiziert wird .

Erläuterung:

Σ                 # 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)
Kevin Cruijssen
quelle
Es scheint ein Tippfehler in der Erklärung zu sein ("y" statt "s")
ArBo
@ArBo Behoben, danke
Kevin Cruijssen
1
Genau genommen hatte ich diese Inspiration über 12 Stunden zuvor, als ich 11 Bytes der Antwort von @ MilkyWay90 spielte ...
Neil,
Das ist gut! Ich habe das gesehen, konnte aber keine Möglichkeit finden, meine beim Speichern von Bytes in diese umzuwandeln
Abgelaufene Daten
2

PowerShell , 68 Byte

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

Probieren Sie es online!

Andrei Odegov
quelle
2
1) funktioniert sortstattdessen sort-objectauch. 2) Die Variable $bdefiniert Ihren Code außerhalb des Gültigkeitsbereichs. Das Standard loopholeserfordert eine vollständige Antwort . Für Powershell bedeutet dies: Jede Person kann den Code als Powershell-Skript in eine Datei einbinden und in einem Terminal ausführen. Ihr Code funktioniert nicht mit einer Skriptdatei. Es tut uns leid.
mazzy
1
@mazzy, vielen Dank. 1) Der sortAlias ​​funktioniert nicht in pwsh unter Ubuntu 18.04 2) Ja, das ist meine Schuld, aber ich habe mich selbst korrigiert, und infolgedessen wurde der Code natürlich länger :)
Andrei Odegov
(oO)! Ich habe einen Sortieralias für Powershell erstellt . code became longer- Dies ist die Herausforderung :)
mazzy
1
Ja, du hast recht. Jedes einzelne Zeichen von $pwird mit dem Quellcode an das Ende des Strings angehängt und erhält einen Index von gleich $src.Length, aber da „ihre Reihenfolge keine Rolle spielt und nicht konsistent sein sollte“, spielt es keine Rolle. In dieser Antwort wird die gesamte Eingabezeichenfolge mit dem Quellcode an das Ende der Zeichenfolge angehängt.
Andrei Odegov
1
@dfeuer, ich verstehe deine Frage nicht. Es tut uns leid.
mazzy
2

Python 2 , 62 Bytes

lambda a:sorted(a,key=('lambd :sorted(,ky=\'\\+).fin'+a).find)

Gleiches Konzept wie meine C # Antwort.

Probieren Sie es online!

Verkörperung der Ignoranz
quelle
\\\'sollte sein \'\\. Netter Ansatz! 23 Bytes in meiner Java-Antwort gespeichert.
Kevin Cruijssen
1
@ KevinCruijssen behoben
Verkörperung der Ignoranz
2

Japt , 18 Bytes

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

Versuch es

ñÈ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
Zottelig
quelle
1

Gelee , 26 Bytes (UTF-8 *)

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

Probieren Sie es online!

Übernimmt die Eingabe als Python-formatierte Zeichenfolge im ersten Befehlszeilenargument.

Einzigartige Charaktere :

“®³nÞṾ©V”

* Hinweis: Ich habe festgestellt, dass dies bei der Codierung in JELLY nicht funktioniert, da die UTF-8-Zeichen anstelle der eigenen Bytes sortiert werden.

Erik der Outgolfer
quelle