Uma espécie de quine

30

Dada uma sequência x, produza os caracteres xclassificados de acordo com a ordem de aparência no seu código-fonte.

Exemplos

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:

Regras

  • Aplicam-se brechas padrão e regras de E / S
  • Entrada e saída podem ser uma sequência, uma lista de caracteres ou uma lista de bytes.
  • Se um caractere for usado várias vezes na fonte, use a primeira ocorrência.
  • Se um ou mais caracteres não aparecer na fonte, eles deverão estar no final; sua ordem não importa, nem precisa ser consistente.
  • A origem não deve estar vazia
  • Novas linhas são tratadas da mesma forma que outros caracteres.
  • A ordem na qual o código é executado não importa; apenas a sequência crua.
  • A entrada está na mesma codificação que o código.
  • A entrada é classificada por caracteres, não por bytes.
  • A classificação diferencia maiúsculas de minúsculas
  • Isso é , então a resposta mais curta em bytes para cada idioma vence!

tjjfvi
fonte
2
@negativeseven Qualquer caractere da codificação do código-fonte precisa ser considerado, incluindo espaço em branco.
tjjfvi 27/06
2
relacionado
Rod
3
Você provavelmente deve fazer menção explícita na especificação de que a correspondência diferencia maiúsculas de minúsculas.
Shaggy
1
Podemos ser xcodificados em UTF-8 ou UTF-16 se nossa solução não estiver codificada em Unicode, e os caracteres Unicode em xrepresentarem caracteres na página de códigos da solução? Por exemplo, alguns idiomas de golfe usam páginas de códigos personalizadas para reduzir a contagem de bytes, mas ainda podem ser lidas a olho nu.
Erik the Outgolfer
1
@tjjfvi Não estou falando de no-ops aqui (o que certamente seria inválido); pelo menos algumas das respostas abaixo, em vez de receber a entrada em bytes simples (0x00-0xFF), aceite a entrada como a string UTF-8 que a sequência de bytes representaria (por exemplo, quando postamos uma resposta, geralmente postamos o UTF -8 do nosso código, não o hexdump) e, em seguida, use a representação UTF-8 do código-fonte para classificar a entrada. Isso é permitido? Eu sinto que deveria ser uma opção também (ao lado do fluxo de bytes simples), porque, caso contrário, as soluções em idiomas de golfe com páginas de código personalizadas seriam muito prejudicadas.
Erik the Outgolfer

Respostas:

13

Python 3.8 (pré-lançamento) , 102 100 96 85 79 76 68 61 59 60 bytes

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

Experimente online!

-2 bytes usando este

-4 bytes, percebendo que <0== ==-1e removendo o desnecessário+1

-11 bytes graças a Neil

-6 bytes graças a dzaima

-3 bytes graças ao rod

-8 bytes graças a sete negativos, indicando que o programa pode gerar uma lista de caracteres

-7 bytes devido à incorporação da ignorância voltando ao Python 3.8 e usando :=

-2 bytes devido a Jo King mudar o nome da variável s para c, para que possamos deixar de fora o ;c

+1 bytes porque sete negativos indicaram que não estava filtrando ;corretamente

MilkyWay90
fonte
('s=%r;exec(s)'%s+x).find(x)?
Neil
@ Neil A solução atual é inválida e a substituição ('s=%r;exec(s)'%s).find(x)por seu código a tornaria válida?
MilkyWay90
@ Neil Oh, espere, eu vejo o seu golfe
MilkyWay90
Você pode mudar para input()e salvar 4 bytes
Rod
4
;não está sendo classificado corretamente na versão atual
negativa sete
7

APL (Dyalog Unicode) , SBCS de 14 bytes

Função de prefixo tácito anônimo.

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

 inclua argumento (para agir sobre ele como um todo)

… A ⊃¨ partir disso, escolha um caractere para cada um dos seguintes índices:

∘⍋ os índices que classificariam o argumento na ordem dada pela seguinte sequência (todos os não membros terão a ordem de aparência no final):

'''∘⍋⊃¨⊂' os personagens '∘⍋⊃¨⊂

Experimente online!

Adão
fonte
5

JavaScript (Node.js) , 60 58 56 bytes

-2 bytes de Jo King

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

Experimente online!

Luis felipe De jesus Munoz
fonte
Seu código parece funcionar apenas quando a fonte é f=.... Se for esse o caso, inclua isso na sua contagem de bytes e envios.
tjjfvi 27/06
3

Ruby , 57 bytes

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

Experimente online!

Bastante direto, supondo que eu não tenha perdido um truque de golfe. Pegue uma lista de caracteres e classifique por seu índice em uma sequência que consiste em todos os caracteres uniq no código em ordem de aparência. Muitas vezes, sua primeira aparição é nessa mesma sequência, mas isso não muda a ordem.

histocrata
fonte
3

05AB1E , 24 22 21 bytes

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

Experimente online!

Explicação:

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

Primeira tentativa de coisas no 05AB1E, provavelmente muito a ser salvo

Dados expirados
fonte
Tem certeza de que isso está correto? A cadeia de caracteres que agora classifica é }krR«'«. OBSERVAÇÃO: 'é um caractere único e, portanto, '"basta (ao contrário do C #, quando ele precisa de um rastreamento adicional '). Atualmente, seu código empurra a string primeiro Σ, depois a string ", depois a string «, depois a string '«Rrk}e, em seguida, faz o índice append, reverse, reverse reverse. Uso inteligente do reverso da corda e no final! Vou ver se consigo encontrar uma solução para a sua resposta e depois excluir a minha.
Kevin Cruijssen 27/06
@kevincruijssen Então, não posso me livrar do segundo ''
Data de
1
Sim, você pode mesmo. :) Então ele classifica corretamente }krR«'"Σ. PS: Costumo usar =(imprimir sem aparecer) para fins de depuração, às vezes. Você também pode adicionar --debug-stackcomo argumento, mas é um pouco estranho na nova versão 05AB1E imho.
Kevin Cruijssen 27/06
3

Jelly , 16 14 bytes (página Jelly Code), 25 bytes (UTF8)

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

Experimente online!

Um programa completo que utiliza um único argumento, a sequência a ser classificada.

Obrigado a @ JonathanAllan por apontar um bug!

Conforme @EriktheOutgolfer, embora o código possa ser inserido usando a página de código Jelly, os caracteres classificados são os UTF-8 equivalentes, em vez dos bytes da fonte. Como tal, incluí a pontuação nos bytes UTF-8 também. Observe que o mesmo provavelmente se aplica a todos os idiomas com páginas de códigos personalizadas.

Explicação

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

A string acima é avaliada como:

Ṿ          | 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` é um no-op efetivamente aqui, mas existe para garantir que todos os caracteres sejam representados.

Nick Kennedy
fonte
Então ... publiquei minha resposta Jelly e ela clicou em mim: o intérprete converte o bytecode em UTF-8 antes de executá-lo ; portanto, o número de bytes deve ser aumentado ou o código alterado para caber na página de códigos.
Erik the Outgolfer
@EriktheOutgolfer Eu não entendo o que você está recebendo aqui. Como isso é diferente de qualquer outro desafio do codegolf nesse sentido?
Nick Kennedy
O aspecto autorreferencial é diferente, portanto, de fato, o código classifica caracteres UTF-8 e não os bytes que deveria.
Erik the Outgolfer
3

Gelatina , 14 bytes

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

Um programa completo que aceita uma string (formatada em Python) (de caracteres da página de código Jelly ) que imprime a saída.
(como um link monádico, ele gera uma lista de listas de caracteres)

Experimente online!

Quão?

“;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
fonte
Então ... publiquei minha resposta Jelly e ela clicou em mim: o intérprete converte o bytecode em UTF-8 antes de executá-lo ; portanto, o número de bytes deve ser aumentado ou o código alterado para caber na página de códigos.
Erik the Outgolfer
@EriktheOutgolfer Acho que este é seguro a esse respeito, pois esse método não emprega nenhuma classificação e atende à E / S no mesmo critério de codificação (página de código da Jelly).
Jonathan Allan
Eh ... Eu acho que o fe trabalho em caracteres Unicode, porque isso é o tipo de caracteres da string realmente tem dentro. Por exemplo, ”ĿOretorna 319se testado localmente codificado em JELLY, para que ele veja o Ŀe não o C7.
Erik the Outgolfer
Penso fe trabalho no Unicode também, mas isso é um problema aqui? Passo o conjunto restrito de caracteres Unicode que aparecem na página de códigos do Jelly (ou seja, bytes codificados usando essa codificação, cumprindo "A entrada está na mesma codificação que o código"); filtre-os corretamente (já que esses bytes introduzidos foram codificados como Unicode) e depois os produza corretamente. O que eu conto são os bytes do código (preenchendo "A entrada é classificada por caracteres, não por bytes" e "resposta mais curta em bytes para cada idioma vence").
Jonathan Allan
1
@ JonathanAllan Eu sinto que o "foi codificado para alguns caracteres usando a página de códigos de Jelly" é o que estou me referindo no meu comentário anterior. Como a codificação do código consiste em bytes únicos de 0x00 a 0xFF, é disso que a codificação do argumento também deve consistir. Em vez disso, o argumento é passado após ser mapeado de JELLY para UTF-8, portanto, cada um de seus caracteres não é necessariamente um único byte mais. Basicamente, o código está no JELLY enquanto o argumento está no UTF-8, mesmo que tenha sido mapeado para o do JELLY. Enquanto a saída UTF-8 correta é retornada, ela deve ser JELLY o tempo todo.
Erik the Outgolfer
2

Carvão , 37 bytes

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

Experimente online! Explicação:

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

Existem duas maneiras de citar caracteres no Charcoal; ´cita qualquer caractere único enquanto ”y... cita qualquer caractere, exceto e também conta como uma sequência separada. Acontece que a sobrecarga em ter que lidar com isso significa que ele não acaba com nenhum golfista.

FηΦθ⁼ικ

Faça um loop sobre os caracteres por vez, produzindo quaisquer caracteres correspondentes da entrada Isso classifica a entrada.

Φθ¬№ηι

Saída quaisquer caracteres não correspondentes na entrada.

Neil
fonte
2

J , 14 bytes

Função de prefixo tácito anônimo.

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

Experimente online!

] o argumento

i: Última ocorrência (não membros obtêm o índice além do final da cadeia de pesquisa) de cada caractere em:

']/:''i' os personagens ]/:'i

... /: use isso para classificar:

] o argumento

Adão
fonte
Os quatro espaços à esquerda são resultado do eco ou do código?
tjjfvi 27/06
1
@tjjfvi É assim que o TIO está configurado. Corrigido agora.
Adám 27/06
2

Java 10, 129 100 bytes

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

-29 bytes, portando a resposta C #+c de @EmbodimentOfIgnorance .

Experimente online.

Explicação:

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

NOTA: Geralmente, é mais barato usar em s.sort((a,b)->Long.compare(a,b))vez de s.sort(java.util.Comparator.comparing(c->c), mas nesse caso seria 11 bytes a mais:

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

Experimente online.

Kevin Cruijssen
fonte
2

05AB1E , 31 26 19 bytes

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

-7 bytes, inspirando- se na abordagem de @ EmbodimentOfIgnorance em sua resposta em C # de anexar o caractere atual antes da indexação.

Experimente online ou tente com a linha de depuração adicionada para ver as strings que estão sendo indexadas .

Explicação:

Σ                 # 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
fonte
Parece haver um erro de digitação na explicação ("y" em vez de "s")
ArBo 27/06
@ArBo Fixed, obrigado
Kevin Cruijssen em
1
Estritamente falando, eu tive essa inspiração mais de 12 horas antes, quando joguei 11 bytes da resposta de @ MilkyWay90 ...
Neil
Isso é bom! Eu vi isso, mas não consegui encontrar uma maneira de transformar o meu nisso, economizando bytes
Data
2

PowerShell , 68 bytes

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

Experimente online!

Andrei Odegov
fonte
2
1) em sortvez disso sort-objecttambém funciona. 2) a variável $bdefinida fora do escopo do seu código. o Standard loopholesrequer uma resposta completa . Para o Powershell, significa: qualquer pessoa pode criar o código em um arquivo como um script do PowerShell e executá-lo em um terminal. Seu código não funciona no arquivo de script. Desculpe.
mazzy 28/06
1
@mazzy, muito obrigado. 1) o sortalias não funciona no pwsh no Ubuntu 18.04 2) sim, a culpa é minha, mas eu me corrigi e, como resultado, o código ficou mais longo, é claro :)
Andrei Odegov 28/06
(oO)! Eu criei um alias de classificação para o Powershell . code became longer- este é o desafio :)
mazzy 28/06
1
Sim você está certo. Cada caractere individual de $pé anexado ao final da string com o código-fonte e obtém um índice igual a $src.Length, mas como “a ordem deles não importa e não deve ser consistente”, isso não importa. Em esta resposta , toda a cadeia de entrada é acrescentado ao final da string com o código fonte.
Andrei Odegov 29/06
1
@ Dfeuer, eu não entendo sua pergunta. Desculpe.
mazzy 30/06
2

Python 2 , 62 bytes

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

Mesmo conceito que minha resposta em C #.

Experimente online!

Modalidade de ignorância
fonte
\\\'deveria ser \'\\. Boa abordagem embora! Salvei 23 bytes na minha resposta Java.
Kevin Cruijssen 28/06
1
@KevinCruijssen Fixed
Modalidade de Ignorância
2

Japonês , 18 bytes

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

Tente

ñÈ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
Shaggy
fonte
1

Gelatina , 26 bytes (UTF-8 *)

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

Experimente online!

Recebe entrada como uma string formatada em Python no 1º argumento da linha de comando.

Caracteres únicos :

“®³nÞṾ©V”

* Nota: Descobri que isso não funciona quando codificado em JELLY, pois classifica os caracteres UTF-8 em vez de seus próprios bytes.

Erik, o Outgolfer
fonte