Quine rodzaju


30

Biorąc pod uwagę ciąg x, wypisz znaki xposortowane zgodnie z kolejnością pojawiania się w kodzie źródłowym.

Przykłady

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:

Zasady

  • Obowiązują standardowe luki i zasady we / wy
  • Dane wejściowe i wyjściowe mogą być łańcuchem, listą znaków lub listą bajtów.
  • Jeśli znak jest używany wiele razy w źródle, użyj pierwszego wystąpienia.
  • Jeśli jeden lub więcej znaków nie pojawia się w źródle, powinny znajdować się na końcu; ich kolejność nie ma znaczenia, ani nie musi być spójna.
  • Źródło musi być niepuste
  • Nowe linie są traktowane tak samo jak inne znaki.
  • Kolejność wykonywania kodu nie ma znaczenia; tylko surowy ciąg.
  • Dane wejściowe mają takie samo kodowanie jak kod.
  • Dane wejściowe są sortowane według znaków, a nie według bajtów.
  • W sortowaniu rozróżniana jest wielkość liter
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach dla każdego języka!


2
@negativeseven Należy uwzględnić wszystkie znaki z kodowania kodu źródłowego, w tym spacje.
tjjfvi


3
Prawdopodobnie powinieneś wyraźnie zaznaczyć w specyfikacji, że w dopasowaniu rozróżniana jest wielkość liter.
Kudłaty

1
Czy możemy zostać xzakodowane w UTF-8 lub UTF-16, jeśli nasze rozwiązanie w ogóle nie jest zakodowane w Unicode, a znaki Unicode w xreprezentują znaki na stronie kodowej rozwiązania? Na przykład niektóre języki gry w golfa używają niestandardowych stron kodowych w celu zmniejszenia liczby bajtów, ale nadal są czytelne gołym okiem.
Erik the Outgolfer

1
@tjjfvi Nie mówię tu o braku operacji (co z pewnością byłoby nieprawidłowe); przynajmniej kilka poniższych odpowiedzi, zamiast brać dane w postaci zwykłych bajtów (0x00-0xFF), weź dane wejściowe jako ciąg UTF-8, który reprezentuje sekwencja bajtów (np. kiedy publikujemy odpowiedź, zwykle publikujemy UTF -8 wersja naszego kodu, a nie zrzut heksowy), a następnie użyj reprezentacji kodu źródłowego UTF-8 do posortowania danych wejściowych. Czy to jest dozwolone? Wydaje mi się, że powinna to być również opcja (obok zwykłego strumienia bajtów), ponieważ w przeciwnym razie rozwiązania w językach golfowych z niestandardowymi stronami kodowymi byłyby znacznie utrudnione.
Erik the Outgolfer

Odpowiedzi:


13

Python 3.8 (wersja wstępna) , 102 100 96 85 79 76 68 61 59 60 bajtów

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

Wypróbuj online!

-2 bajty za pomocą tego

-4 bajty, wiedząc, że <0== ==-1i usuwając niepotrzebne+1

-11 bajtów dzięki Neilowi

-6 bajtów dzięki dzaima

-3 bajty dzięki wędce

-8 bajtów dzięki ujemnej siódemce wskazującej, że program może wypisać listę znaków

-7 bajtów ze względu na przejście Embodiment of Ignorance do Python 3.8 i użycie :=

-2 bajty z powodu przełączenia przez Jo King nazwy zmiennej s dla c, abyśmy mogli pominąć ;c

+1 bajtów, ponieważ siedem ujemne wskazało, że nie filtruje ;poprawnie


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

@Neil Czy obecne rozwiązanie jest nieprawidłowe i zastąpienie ('s=%r;exec(s)'%s).find(x)go kodem sprawi, że będzie ono ważne?
MilkyWay90

@ Nee Och, czekaj, widzę twojego golfa
MilkyWay90

Możesz przełączyć input()i zapisać 4 bajty
Rod

4
;nie jest poprawnie posortowane w bieżącej wersji
negatywne siedem

7

APL (Dyalog Unicode) , 14 bajtów SBCS

Anonimowa ukryta funkcja prefiksu.

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

 dołącz argument (aby działać na nim jako całości)

⊃¨ Z tego wybierz po jednym znaku dla każdego z następujących wskaźników:

∘⍋ indeksy, które posortowałyby argument w kolejności podanej przez następujący ciąg (wszyscy nie-członkowie idą w kolejności pojawienia się na końcu):

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

Wypróbuj online!





3

Rubinowy , 57 bajtów

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

Wypróbuj online!

Dość proste, zakładając, że nie przegapiłem sztuczki golfowej. Pobierz listę znaków i posortuj według ich indeksu w ciągu zawierającym wszystkie znaki uniq w kodzie w kolejności ich wyglądu. Często ich pierwszy występ pojawia się w tym samym szeregu, ale to nie zmienia kolejności.


3

05AB1E , 24 22 21 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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

Po raz pierwszy próbuję rzeczy w 05AB1E, więc prawdopodobnie wiele do ocalenia


Czy jesteś pewien, że to prawda? Ciąg, który teraz sortuje, to }krR«'«. UWAGA: 'jest pojedynczym znakiem, więc po prostu '"wystarczy (w przeciwieństwie do C #, gdzie wymaga dodatkowego końcowego '). Obecnie twój kod najpierw wypycha ciąg Σ, potem ciąg ", potem ciąg «, potem ciąg '«Rrk}, a następnie wykonuje dołączanie, odwracanie, odwracanie stosu, indeks. Jednak sprytne użycie rewersu łańcucha i na końcu! Zobaczę, czy mogę znaleźć odpowiedź na twoją odpowiedź, a potem ją usunę.
Kevin Cruijssen

@kevincruijssen Więc nie mogę się pozbyć drugiego ”
Data wygasła

1
Tak, naprawdę możesz. :) Następnie poprawnie się sortuje }krR«'"Σ. PS: =Czasami używam (drukuję bez otwierania) do celów debugowania. Możesz również dodać --debug-stackjako argument, ale to trochę dziwne w nowej wersji imho 05AB1E.
Kevin Cruijssen

3

Galaretka , 16 14 bajtów (strona kodu galaretki), 25 bajtów (UTF8)

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

Wypróbuj online!

Pełny program, który pobiera pojedynczy argument, ciąg znaków do posortowania.

Dzięki @JonathanAllan za wskazanie błędu!

Zgodnie z @EriktheOutgolfer, chociaż kod można wprowadzić za pomocą strony kodowej Jelly, posortowane znaki są odpowiednikami UTF-8, a nie bajtów źródła. Jako taki, uwzględniłem także wynik w bajtach UTF-8. Uwaga: to samo prawdopodobnie dotyczy wszystkich języków z niestandardowymi stronami kodowymi.

Wyjaśnienie

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

Powyższy ciąg jest oceniany jako:

Ṿ          | 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` jest tutaj opcją skuteczną, ale istnieje, aby zapewnić reprezentację wszystkich postaci.


Więc ... wysłałem odpowiedź Jelly, a następnie kliknęła na mnie: interpreter konwertuje kod bajtowy na UTF-8 przed jego wykonaniem , dlatego albo należy zwiększyć liczbę bajtów, albo zmienić kod, aby pasował do strony kodowej.
Erik the Outgolfer

@EriktheOutgolfer Nie rozumiem, co tu dostajesz. Czym różni się w tym względzie od innych wyzwań związanych z hodowlą koni?
Nick Kennedy

Samoreferencyjny aspekt jest inny, więc w rzeczywistości kod sortuje znaki UTF-8, a nie bajty, które powinien.
Erik the Outgolfer

3

Galaretka , 14 bajtów

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

Pełny program akceptujący (sformatowany w języku Python) ciąg znaków (znaków strony kodowej Jelly ), który wypisuje dane wyjściowe.
(jako monadyczny link daje listę list znaków)

Wypróbuj online!

W jaki sposób?

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

Więc ... wysłałem odpowiedź Jelly, a następnie kliknęła na mnie: interpreter konwertuje kod bajtowy na UTF-8 przed jego wykonaniem , dlatego albo należy zwiększyć liczbę bajtów, albo zmienić kod, aby pasował do strony kodowej.
Erik the Outgolfer

@EriktheOutgolfer Myślę, że ten jest bezpieczny pod tym względem, ponieważ ta metoda nie wymaga sortowania i spełnia kryteria wejścia / wyjścia w tych samych kryteriach kodowania (strona kodowa Jelly).
Jonathan Allan

Eh ... Myślę, że fi pracuję na znakach Unicode, ponieważ takie znaki faktycznie mają w sobie łańcuch. Na przykład ”ĿOzwraca, 319jeśli został przetestowany lokalnie zakodowany w JELLY, więc widzi ĿC7, a nie C7.
Erik the Outgolfer

Myślę też fi pracuję na Unicode, ale czy to jest problem? Podaję ograniczony zestaw znaków Unicode, które pojawiają się na stronie kodowej Jelly (to znaczy bajty zakodowane przy użyciu tego kodowania, spełniając „Dane wejściowe są takie same jak kod”); filtruj je poprawnie (ponieważ te wprowadzone bajty zostały zakodowane jako Unicode), a następnie wyślij je poprawnie. Następnie liczę bajty kodu (spełniając „Dane wejściowe są sortowane według znaków, a nie według bajtów” i „wygrywa najkrótsza odpowiedź w bajtach dla każdego języka”).
Jonathan Allan

1
@JonathanAllan Wydaje mi się, że „zostałem zakodowany dla niektórych znaków przy użyciu strony kodowej Jelly”, o czym mówię w poprzednim komentarzu. Ponieważ kodowanie kodu składa się z pojedynczych bajtów od 0x00 do 0xFF, na tym powinno również składać się kodowanie argumentu. Zamiast tego argument jest przekazywany po zmapowaniu z JELLY na UTF-8, więc każdy z jego znaków niekoniecznie jest pojedynczym bajt już. Zasadniczo kod znajduje się w JELLY, podczas gdy argument znajduje się w UTF-8, mimo że został odwzorowany na ten z JELLY. Chociaż zwracane jest prawidłowe wyjście UTF-8, powinno ono przez cały czas być JELLY.
Erik the Outgolfer

2

Węgiel drzewny , 37 bajtów

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

Wypróbuj online!Wyjaśnienie:

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

Istnieją dwa sposoby cytowania znaków w Charcoal; ´cytuje dowolny pojedynczy znak, podczas gdy ”y... cytuje dowolny znak oprócz, a także liczy się jako osobny ciąg. Okazuje się, że narzut związany z koniecznością radzenia sobie z tym oznacza, że ​​nie kończy się to na golfie.

FηΦθ⁼ικ

Z kolei zapętlaj znaki, wypisując z nich wszystkie pasujące znaki. To posortuje dane wejściowe.

Φθ¬№ηι

Wypisuj dowolne niedopasowane znaki na wejściu.


2

J , 14 bajtów

Anonimowa ukryta funkcja prefiksu.

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

Wypróbuj online!

] argument

i: Ostatnie wystąpienie (osoby niebędące członkami uzyskują indeks poza koniec ciągu wyszukiwania) każdego znaku w:

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

/: Użyj tego do sortowania:

] argument


Czy cztery wiodące spacje są wynikiem echa lub kodu?
tjjfvi

1
@tjjfvi Tak konfiguruje się TIO. Naprawiono teraz.
Adám

2

Java 10, 129 100 bajtów

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

-29 bajtów przez przeniesienie odpowiedzi C #+c z @EmbodimentOfIgnorance .

Wypróbuj online.

Wyjaśnienie:

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

UWAGA: Zazwyczaj jest to tańsze używać s.sort((a,b)->Long.compare(a,b))zamiast s.sort(java.util.Comparator.comparing(c->c), ale w tym przypadku byłoby to 11 bajtów dłużej:

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

Wypróbuj online.


2

05AB1E , 31 26 19 bajtów

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

-7 bajtów, czerpiąc inspirację z podejścia @ EmbodimentOfIgnorance w jego odpowiedzi w języku C # dodania bieżącego znaku przed indeksowaniem.

Wypróbuj online lub wypróbuj z dodaną linią debugowania, aby zobaczyć ciągi, które są indeksowane .

Wyjaśnienie:

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

Wydaje się, że w wyjaśnieniu występuje literówka („y” zamiast „s”)
ArBo

@ArBo Naprawiono, dziękuję
Kevin Cruijssen

1
Ściśle mówiąc, miałem tę inspirację ponad 12 godzin wcześniej, kiedy grałem w golfa 11 bajtów odpowiedzi @ MilkyWay90 ...
Neil

To jest dobre! Widziałem to, ale nie mogłem znaleźć sposobu, aby zmienić mój w to, oszczędzając bajty
Data wygasła

2

PowerShell , 68 bajtów

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

Wypróbuj online!


2
1) sort instead sort-object works too. 2) the variable $b defined out of scope your code. the Standard loopholes requires a complete answer. For Powershell it means: any person can wirte the code to a file as a powershell script and run it in a terminal. Your code does not work from script file. Sorry.
mazzy

1
@mazzy, thank you very much. 1) the sort alias does not work in pwsh on Ubuntu 18.04 2) yes, this is my fault, but I corrected myself, and as a result, the code became longer, of course :)
Andrei Odegov

(oO)! Utworzyłem alias sortowania dla programu Powershell . code became longer- oto wyzwanie :)
mazzy

1
Tak masz rację. Każdy indywidualny znak $pjest dołączany na końcu łańcucha z kodem źródłowym i otrzymuje indeks równy $src.Length, ale ponieważ „ich kolejność nie ma znaczenia i nie powinna być spójna”, nie ma znaczenia. W tej odpowiedzi cały ciąg wejściowy jest dołączany na końcu ciągu wraz z kodem źródłowym.
Andrei Odegov

1
@dfeuer, nie rozumiem twojego pytania. Przepraszam.
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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.