Una especie de quine

30

Dada una cadena x, muestre los caracteres xordenados según el orden de aparición en su código fuente.

Ejemplos

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:

Reglas

  • Se aplican las lagunas estándar y las reglas de E / S
  • La entrada y salida puede ser una cadena, una lista de caracteres o una lista de bytes.
  • Si un personaje se usa varias veces en la fuente, use la primera aparición.
  • Si uno o más caracteres no aparecen en la fuente, deberían estar al final; su orden no importa, ni tiene que ser consistente.
  • La fuente no debe estar vacía
  • Las líneas nuevas se tratan igual que otros caracteres.
  • El orden en que se ejecuta el código no importa; solo la cuerda cruda.
  • La entrada está en la misma codificación que el código.
  • La entrada se ordena por caracteres, no por bytes.
  • La clasificación distingue entre mayúsculas y minúsculas
  • Este es el , por lo que gana la respuesta más corta en bytes para cada idioma.

tjjfvi
fuente
2
@negativeseven Cualquier carácter de la codificación del código fuente debe tenerse en cuenta, incluido el espacio en blanco.
tjjfvi
2
relacionado
Rod
3
Probablemente debería hacer una mención explícita en la especificación de que la coincidencia distingue entre mayúsculas y minúsculas.
Shaggy
1
¿Podemos xcodificarnos en UTF-8 o UTF-16 si nuestra solución no está codificada en Unicode en absoluto, y los caracteres Unicode en xrepresentan caracteres en la página de códigos de la solución? Por ejemplo, algunos idiomas de golf usan páginas de códigos personalizadas para reducir su conteo de bytes, pero aún así se pueden leer a simple vista.
Erik el Outgolfer
1
@tjjfvi No estoy hablando de no-operaciones aquí (lo que sin duda sería inválido); al menos algunas de las respuestas a continuación, en lugar de tomar la entrada en bytes simples (0x00-0xFF), tome la entrada como la cadena UTF-8 que representaría la secuencia de bytes (por ejemplo, cuando publicamos una respuesta, generalmente publicamos la UTF -8 versión de nuestro código, no el hexdump), y luego use la representación UTF-8 del código fuente para ordenar la entrada. ¿Esto está permitido? Siento que también debería ser una opción (junto con el flujo de bytes simple), porque de lo contrario las soluciones en lenguajes de golf con páginas de códigos personalizadas se verían muy obstaculizadas.
Erik el Outgolfer

Respuestas:

13

Python 3.8 (pre-release) , 102 100 96 85 79 76 68 61 59 60 bytes

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

Pruébalo en línea!

-2 bytes al usar esto

-4 bytes al darse cuenta de que <0== ==-1y eliminar lo innecesario+1

-11 bytes gracias a Neil

-6 bytes gracias a dzaima

-3 bytes gracias a la barra

-8 bytes gracias a siete negativos que señalan que el programa puede generar una lista de caracteres

-7 bytes debido a la Realización de la Ignorancia al volver a Python 3.8 y usar :=

-2 bytes debido a que Jo King cambió el nombre de la variable s por c, por lo que podríamos omitir el ;c

+1 bytes porque siete negativos señalaron que no se estaba filtrando ;correctamente

MilkyWay90
fuente
('s=%r;exec(s)'%s+x).find(x)?
Neil
@Neil ¿La solución actual no es válida, y sustituirla ('s=%r;exec(s)'%s).find(x)con su código la haría válida?
MilkyWay90
@Neil Oh, espera, veo tu golf
MilkyWay90
Puedes cambiar input()y guardar 4 bytes
Rod
44
;no está ordenado correctamente en la versión actual
negativo siete
7

APL (Dyalog Unicode) , SBCS de 14 bytes

Función de prefijo tácito anónimo.

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

 adjuntar argumento (para actuar en su conjunto)

...⊃¨  de eso, elige un personaje para cada uno de los siguientes índices:

∘⍋ los índices que ordenarían el argumento en el orden dado por la siguiente cadena (todos los no miembros van en orden de aparición al final):

'''∘⍋⊃¨⊂' los caracteres '∘⍋⊃¨⊂

Pruébalo en línea!

Adán
fuente
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))

Pruébalo en línea!

Luis felipe De jesus Munoz
fuente
Su código parece funcionar solo cuando la fuente es f=.... Si ese es el caso, inclúyalo en su envío y número de bytes.
tjjfvi
3

Ruby , 57 bytes

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

Pruébalo en línea!

Bastante sencillo, suponiendo que no me haya perdido un truco de golf. Tome una lista de caracteres y ordénelos por su índice en una cadena que contenga todos los caracteres uniq en el código en orden de aparición. A menudo, su primera aparición es en esa misma cadena, pero eso no cambia el orden.

histocrat
fuente
3

05AB1E , 24 22 21 bytes

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

Pruébalo en línea!

Explicación:

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

Primera vez que intenta cosas en 05AB1E, así que probablemente haya mucho que guardar

Datos caducados
fuente
¿Estas seguro que esto es correcto? La cadena que ahora ordena es }krR«'«. NOTA: 'es un solo carácter, por lo que '"es suficiente (a diferencia de C # donde necesita un seguimiento adicional ') Actualmente, su código primero empuja la cadena Σ, luego la cadena ", luego la cadena «, luego la cadena '«Rrk}, y luego hace el anexar, invertir, apilar, indexar. Sin embargo, ¡uso inteligente del reverso de la cadena y al final! Veré si puedo encontrar una solución para su respuesta, y eliminaré la mía después.
Kevin Cruijssen
@kevincruijssen Entonces, ¿no puedo deshacerme de la segunda?
Datos
1
Sí, de hecho puedes. :) Entonces se ordena correctamente }krR«'"Σ. PD: A =veces suelo usar (imprimir sin reventar) para propósitos de depuración. También puede agregar --debug-stackcomo argumento, pero es un poco extraño en la nueva versión 05AB1E en mi humilde opinión.
Kevin Cruijssen
3

Jelly , 16 14 bytes (página de códigos Jelly), 25 bytes (UTF8)

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

Pruébalo en línea!

Un programa completo que toma un solo argumento, la cadena que se ordenará.

¡Gracias a @JonathanAllan por señalar un error!

Según @EriktheOutgolfer, aunque el código se puede ingresar utilizando la página de códigos Jelly, los caracteres ordenados son los UTF-8 equivalentes en lugar de los bytes de la fuente. Como tal, también he incluido la puntuación en bytes UTF-8. Tenga en cuenta que lo mismo probablemente se aplica a todos los idiomas con páginas de códigos personalizados.

Explicación

“Ṿ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 cadena anterior se evalúa 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` es un no-op efectivamente aquí, pero existe para garantizar que todos los personajes estén representados.

Nick Kennedy
fuente
Entonces ... publiqué mi respuesta de Jelly, y luego hizo clic en mí: el intérprete convierte el bytecode a UTF-8 antes de ejecutarlo , por lo tanto, el bytecount debe aumentarse o el código debe cambiarse para que se ajuste a la página de códigos.
Erik the Outgolfer
@EriktheOutgolfer No entiendo lo que te pasa aquí. ¿Cómo es esto diferente a cualquier otro desafío codegolf en este sentido?
Nick Kennedy
El aspecto autorreferencial es diferente, por lo que, de hecho, el código clasifica los caracteres UTF-8 y no los bytes que se supone que debe hacer.
Erik el Outgolfer
3

Jalea , 14 bytes

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

Un programa completo que acepta una cadena (formateada en Python) (de caracteres de página de códigos Jelly ) que imprime la salida.
(como enlace monádico produce una lista de listas de caracteres)

Pruébalo en línea!

¿Cómo?

“;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
fuente
Entonces ... publiqué mi respuesta de Jelly, y luego hizo clic en mí: el intérprete convierte el bytecode a UTF-8 antes de ejecutarlo , por lo tanto, el bytecount debe aumentarse o el código debe cambiarse para que se ajuste a la página de códigos.
Erik the Outgolfer
@EriktheOutgolfer Creo que este es seguro en ese sentido ya que este método no emplea ningún tipo de clasificación y cumple con las E / S en el mismo criterio de codificación (página de códigos de Jelly).
Jonathan Allan
Eh ... creo que fy trabajo en caracteres Unicode, porque ese es el tipo de caracteres que la cadena tiene realmente dentro. Por ejemplo, ”ĿOdevuelve 319si se prueba codificado localmente en JELLY, por lo que ve Ŀel C7 y no el C7.
Erik the Outgolfer
Pienso fy trabajo en Unicode también, pero ¿es eso un problema aquí? Paso el conjunto restringido de caracteres Unicode que aparecen en la página de códigos de Jelly (es decir, bytes codificados usando esa codificación, cumpliendo "La entrada está en la misma codificación que el código"); filtrarlos correctamente (ya que estos bytes ingresados ​​se codificaron como Unicode) y luego generarlos correctamente. Lo que luego cuento son los bytes del código (cumpliendo "La entrada está ordenada por caracteres, no por bytes" y "la respuesta más corta en bytes para cada idioma gana").
Jonathan Allan
1
@JonathanAllan Siento que "me han codificado algunos caracteres usando la página de códigos de Jelly" es a lo que me refiero en mi comentario anterior. Dado que la codificación del código consiste en bytes individuales de 0x00 a 0xFF, en eso debería consistir también la codificación del argumento. En cambio, el argumento se pasa después de ser mapeado de JELLY a UTF-8, por lo que cada uno de sus caracteres no es necesariamente un solo byte más. Básicamente, el código está en JELLY mientras que el argumento está en UTF-8, a pesar de que ha sido mapeado a eso desde JELLY. Mientras se devuelve la salida UTF-8 correcta, debe ser JELLY todo el tiempo.
Erik el Outgolfer
2

Carbón , 37 bytes

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

Pruébalo en línea!Explicación:

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

Hay dos formas de citar personajes en Carbón; ´cita cualquier carácter individual mientras que ”y... cita cualquier carácter excepto y también cuenta como una cadena separada. Resulta que la sobrecarga en tener que lidiar con significa que no termina ningún golfista.

FηΦθ⁼ικ

Pase el cursor sobre los caracteres a su vez, generando los caracteres coincidentes de la entrada. Esto ordena la entrada.

Φθ¬№ηι

Salida de caracteres no coincidentes en la entrada.

Neil
fuente
2

J , 14 bytes

Función de prefijo tácito anónimo.

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

Pruébalo en línea!

] el argumento

...i:  última aparición (los no miembros obtienen el índice más allá del final de la cadena de búsqueda) de cada carácter en:

']/:''i' los caracteres ]/:'i

.../:  usa eso para ordenar:

] el argumento

Adán
fuente
¿Son los cuatro espacios iniciales el resultado del eco o el código?
tjjfvi
1
@tjjfvi Así es como se configura TIO. Corregido ahora.
Adám
2

Java 10, 129100 bytes

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

-29 bytes al portar la respuesta C #+c de @EmbodimentOfIgnorance .

Pruébalo en línea.

Explicación:

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: Por lo general, es más barato de usar en s.sort((a,b)->Long.compare(a,b))lugar de s.sort(java.util.Comparator.comparing(c->c), pero en este caso sería 11 bytes más largo:

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

Pruébalo en línea.

Kevin Cruijssen
fuente
2

05AB1E , 31 26 19 bytes

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

-7 bytes inspirándose en el enfoque de @ EmbodimentOfIgnorance en su respuesta C # de agregar el carácter actual antes de la indexación.

Pruébelo en línea o con la línea de depuración agregada para ver las cadenas que se están indexando .

Explicación:

Σ                 # 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
fuente
Parece que hay un error tipográfico en la explicación ("y" en lugar de "s")
ArBo
@ ArBo Fixed, gracias
Kevin Cruijssen
1
Hablando estrictamente, tuve esa inspiración más de 12 horas antes cuando jugué 11 bytes de la respuesta de @ MilkyWay90 ...
Neil
¡Esto es bueno! Vi eso, pero no pude encontrar una manera de convertir el mío en esto mientras guardaba bytes
datos
2

Potencia Shell , 68 bytes

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

Pruébalo en línea!

Andrei Odegov
fuente
2
1) en sortcambio sort-objectfunciona también. 2) la variable $bdefinida fuera del alcance de su código. El Standard loopholesrequiere una respuesta completa . Para Powershell significa: cualquier persona puede escribir el código en un archivo como un script de PowerShell y ejecutarlo en una terminal. Su código no funciona desde el archivo de script. Lo siento.
mazzy
1
@mazzy, muchas gracias. 1) el sortalias no funciona en pwsh en Ubuntu 18.04 2) sí, es mi culpa, pero me corregí y, como resultado, el código se hizo más largo, por supuesto :)
Andrei Odegov
(oO)! He creado un alias de clasificación para Powershell . code became longer- este es el desafío :)
mazzy
1
Sí, tiene usted razón. Cada carácter individual de $pse agrega al final de la cadena con el código fuente y obtiene un índice igual a $src.Length, pero dado que "su orden no importa y no debe ser coherente", no importa. En esta respuesta , toda la cadena de entrada se agrega al final de la cadena con el código fuente.
Andrei Odegov
1
@dfeuer, no entiendo tu pregunta. Lo siento.
mazzy
2

Python 2 , 62 bytes

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

El mismo concepto que mi respuesta C #.

Pruébalo en línea!

Encarnación de la ignorancia
fuente
\\\'debería ser \'\\. Buen enfoque sin embargo! Guardado 23 bytes en mi respuesta Java.
Kevin Cruijssen
1
@KevinCruijssen Corregido
Encarnación de la ignorancia
2

Japt , 18 bytes

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

Intentalo

ñÈ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
Lanudo
fuente
1

Gelatina , 26 bytes (UTF-8 *)

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

Pruébalo en línea!

Toma datos como una cadena con formato Python en el primer argumento de la línea de comandos.

Personajes únicos :

“®³nÞṾ©V”

* Nota: descubrí que esto no funciona cuando se codifica en JELLY, ya que ordena los caracteres UTF-8 en lugar de sus propios bytes.

Erik el Outgolfer
fuente