Какао сортов


30

По заданной строке xвыведите символы, xотсортированные по порядку появления в исходном коде.

Примеры

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:

правила

  • Применяются стандартные лазейки и правила ввода / вывода
  • Входом и выходом может быть либо строка, либо список символов, либо список байтов.
  • Если символ используется несколько раз в источнике, используйте первое вхождение.
  • Если один или несколько символов не появляются в источнике, они должны быть в конце; их порядок не имеет значения и не должен быть последовательным.
  • Источник должен быть не пустым
  • Новые строки обрабатываются так же, как и другие символы.
  • Порядок выполнения кода не имеет значения; просто сырая строка.
  • Ввод в той же кодировке, что и код.
  • Ввод сортируется по символам, а не по байтам.
  • Сортировка чувствительна к регистру
  • Это , поэтому выигрывает самый короткий ответ в байтах для каждого языка!


2
@negativeseven Необходимо учитывать любые символы из кодировки исходного кода, включая пробелы.
tjjfvi


3
Вы, вероятно, должны четко указать в спецификации, что при сопоставлении учитывается регистр.
лохматый

1
Можем ли мы получить xкодировку в UTF-8 или UTF-16, если наше решение вообще не закодировано в Unicode, а символы Unicode в xпредставляют символы в кодовой странице решения? Например, некоторые языки игры в гольф используют пользовательские кодовые страницы, чтобы уменьшить количество байтов, но все же могут быть читаемы невооруженным глазом.
Эрик Outgolfer

1
@tjjfvi Я не говорю об отсутствии операций здесь (что, безусловно, будет недействительным); по крайней мере, несколько ответов ниже, вместо того, чтобы принимать ввод в виде простых байтов (0x00-0xFF), принимают входные данные в виде строки UTF-8, которую будет представлять последовательность байтов (например, когда мы публикуем ответ, мы обычно публикуем UTF -8 версия нашего кода, а не hexdump), а затем используйте представление исходного кода в кодировке UTF-8 для сортировки ввода. Это разрешено? Я чувствую, что это тоже должен быть вариант (наряду с простым потоком байтов), потому что в противном случае решения на языках игры в гольф с пользовательскими кодовыми страницами будут сильно затруднены.
Эрик Outgolfer

Ответы:


13

Python 3.8 (предварительная версия) , 102 100 96 85 79 76 68 61 59 60 байт

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

Попробуйте онлайн!

-2 байта с помощью этого

-4 байта, понимая, что <0== ==-1и удаляя ненужные+1

-11 байт благодаря Нейлу

-6 байт благодаря дзайме

-3 байта благодаря стержню

-8 байт благодаря отрицательной семерке, указывающей, что программа может выводить список символов

-7 байт из-за переключения Embodiment of Ignorance обратно на Python 3.8 и использования :=

-2 байта из-за того, что Джо Кинг выключил имя переменной s для c, так что мы могли бы пропустить ;c

+1 байт, потому что отрицательная семерка указала, что она не фильтруется ;правильно


('s=%r;exec(s)'%s+x).find(x)?
Нил

@Neil Является ли текущее решение недействительным, и замена ('s=%r;exec(s)'%s).find(x)вашего кода сделает его действительным?
MilkyWay90

@ Нил О, подожди, я вижу твой гольф
MilkyWay90

Вы можете переключиться input()и сохранить 4 байта
Род

4
;неправильно сортируется в текущей версии
минус семь,

7

APL (Dyalog Unicode) , 14 байтов SBCS

Функция анонимного молчаливого префикса.

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

 приложить аргумент (действовать на него в целом)

... ⊃¨ из этого выберите один символ для каждого из следующих индексов:

∘⍋ индексы, которые будут сортировать аргумент в порядке, заданном следующей строкой (все не-члены идут в порядке появления в конце):

'''∘⍋⊃¨⊂' персонажи '∘⍋⊃¨⊂

Попробуйте онлайн!





3

Рубин , 57 байт

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

Попробуйте онлайн!

Довольно просто, если предположить, что я не пропустил трюк в гольфе. Взять список символов и отсортировать по их индексу в строке, состоящей из всех символов uniq в коде в порядке их появления. Часто их первое появление именно в этой строке, но это не меняет порядок.


3

05AB1E , 24 22 21 байт

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

Попробуйте онлайн!

Объяснение:

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

В первый раз пробуем вещи в 05AB1E, так что, вероятно, многое будет сохранено


Вы уверены, что это правильно? Строка, по которой она теперь сортируется, есть }krR«'«. ПРИМЕЧАНИЕ: 'это один символ, поэтому '"достаточно (в отличие от C #, где требуется дополнительный трейлинг '). В настоящее время ваш код сначала выталкивает строку Σ, затем строку ", затем строку «, затем строку '«Rrk}, а затем выполняет добавление, обратный, обратный стек, индекс. Умное использование обратной строки и в конце, хотя! Я посмотрю, смогу ли я найти исправление для вашего ответа, а потом удалю свой.
Кевин Круйссен

@kevincruijssen Так что я не могу просто избавиться от второго »
Истекшие данные

1
Да, ты действительно можешь. :) Тогда это правильно сортирует на}krR«'"Σ . PS: Я склонен использовать =(печатать без всплывающих окон) иногда для целей отладки. Вы также можете добавить в --debug-stackкачестве аргумента, но это немного странно в новой версии 05AB1E imho.
Кевин Круйссен

3

Желе , 16 14 байт (кодовая страница желе), 25 байт (UTF8)

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

Попробуйте онлайн!

Полная программа, которая принимает один аргумент, строку для сортировки.

Спасибо @JonathanAllan за указание на ошибку!

Согласно @EriktheOutgolfer, хотя код может быть введен с использованием кодовой страницы Jelly, отсортированные символы являются эквивалентными UTF-8, а не байтами исходного кода. Таким образом, я включил счет в байтах UTF-8. Обратите внимание, что то же самое, вероятно, относится ко всем языкам с пользовательскими кодовыми страницами.

объяснение

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

Строка выше оценивается как:

Ṿ          | 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` эффективно не используется, но существует, чтобы обеспечить представление всех символов.


Итак ... Я опубликовал свой ответ Jelly, а затем он щелкнул меня: интерпретатор преобразует байт-код в UTF-8 перед его выполнением , следовательно, либо байтовый счет должен быть увеличен, либо код должен быть изменен в соответствии с кодовой страницей.
Эрик Outgolfer

@EriktheOutgolfer Я не понимаю, что вы получаете здесь. Как это отличается от любого другого вызова Codegolf в этом отношении?
Ник Кеннеди

Самореференциальный аспект отличается, поэтому фактически код сортирует символы UTF-8, а не байты, которые он должен.
Эрик Outgolfer

3

Желе , 14 байт

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

Полная программа, принимающая (в формате Python) строку ( кодовой страницы Jelly) символов ), которая печатает вывод.
(как монадическая ссылка выдает список списков символов)

Попробуйте онлайн!

Как?

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

Итак ... Я опубликовал свой ответ Jelly, а затем он щелкнул меня: интерпретатор преобразует байт-код в UTF-8 перед его выполнением , следовательно, либо байтовый счет должен быть увеличен, либо код должен быть изменен в соответствии с кодовой страницей.
Эрик Outgolfer

@EriktheOutgolfer Я думаю, что это безопасно в этом отношении, так как этот метод не использует никакой сортировки и соответствует вводу / выводу в том же кодировании (кодовая страница Jelly).
Джонатан Аллан

Э-э ... Я думаю, что fи работают с символами Юникода, потому что именно такие символы внутри строки. Например, ”ĿOвозвращает, 319если проверено локально закодировано в JELLY, поэтому он видит, Ŀа не C7.
Эрик Outgolfer

Я думаю fи работаю над Unicode тоже, но это проблема здесь? Я передаю ограниченный набор символов Unicode, которые появляются на кодовой странице Jelly (то есть байты, закодированные с использованием этой кодировки, выполняя «Ввод в той же кодировке, что и код»); отфильтруйте их правильно (так как эти введенные байты были закодированы как Unicode), а затем выведите их правильно. Затем я подсчитываю байты кода (выполняя «вход сортируется по символам, а не по байтам» и «самый короткий ответ в байтах для каждого языка выигрывает»).
Джонатан Аллан

1
@JonathanAllan Я чувствую, что «я закодировал некоторые символы с использованием кодовой страницы Джелли» - это то, что я имею в виду в своем предыдущем комментарии. Так как кодировка кода состоит из отдельных байтов от 0x00 до 0xFF, именно из этого должна состоять и кодировка аргумента. Вместо этого аргумент передается после преобразования из JELLY в UTF-8, поэтому каждый из его символов не обязательно является одним байт больше. По сути, код находится в JELLY, а аргумент - в UTF-8, даже если он был сопоставлен с JELLY. В то время как правильный выход UTF-8 возвращается, он должен быть ЖЕЛТЫМ все время.
Эрик Outgolfer

2

Древесный уголь , 37 байт

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

Попробуйте онлайн! Объяснение:

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

Есть два способа цитирования персонажей в Charcoal; ´цитирует любой отдельный символ, в то время как ”y... цитирует любой символ, кроме, а также считается отдельной строкой. Выясняется, что накладные расходы, связанные с необходимостью иметь дело, означают, что это не в конечном итоге приведет к тому, что игрок в гольф.

FηΦθ⁼ικ

Зацикливайте символы по очереди, выводя любые совпадающие символы из ввода. Это сортирует ввод.

Φθ¬№ηι

Выведите все несопоставимые символы на входе.


2

J , 14 байт

Функция анонимного молчаливого префикса.

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

Попробуйте онлайн!

] Аргумент

...i:  Последнее вхождение (не являющиеся членами получают индекс после конца строки поиска) каждого символа в:

']/:''i' персонажи ]/:'i

... /: использовать это для сортировки:

] Аргумент


Четыре лидирующих пробела являются результатом эха или кода?
tjjfvi

1
@tjjfvi Так настроен TIO. Исправлено сейчас.
Адам

2

Java 10, 129 100 байт

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

-29 байт по портированию +cиз @EmbodimentOfIgnorance C # ответа «s .

Попробуйте онлайн.

Объяснение:

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

Примечание: Обычно это дешевле использовать s.sort((a,b)->Long.compare(a,b))вместо s.sort(java.util.Comparator.comparing(c->c), но в этом случае было бы 11 байт больше:

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

Попробуйте онлайн.


2

05AB1E , 31 26 19 байтов

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

-7 байт, вдохновляя подход @ EmbodimentOfIgnorance в своем ответе на C # добавления текущего символа перед индексацией.

Попробуйте онлайн или добавьте строку отладки, чтобы увидеть строки, которые индексируются в .

Объяснение:

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

Кажется, в объяснении есть опечатка («y» вместо «s»)
ArBo

@ArBo Исправлено, спасибо
Кевин Круйссен

1
Строго говоря, у меня было это вдохновение более 12 часов назад, когда я сыграл в гольф 11 байтов ответа @ MilkyWay90 ...
Нил

Это хорошо! Я видел это, но не мог найти способ превратить мой в это при сохранении байтов
просроченные данные

2

PowerShell , 68 байт

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

Попробуйте онлайн!


2
1) sortвместо этого sort-objectтоже работает. 2) переменная $bопределена вне области вашего кода. Standard loopholesтребует полного ответа . Для Powershell это означает: любой пользователь может записать код в файл в виде скрипта powershell и запустить его в терминале. Ваш код не работает из файла скрипта. Сожалею.
Маззи

1
@ mazzy, большое спасибо. 1) sortпсевдоним не работает в pwsh на Ubuntu 18.04 2) да, это моя ошибка, но я исправил себя, и в результате код стал длиннее, конечно :)
Андрей Одегов

(СОО)! Я создал псевдоним сортировки для Powershell . code became longer- это вызов :)
Маззи

1
Да ты прав. Каждый отдельный символ $pдобавляется в конец строки с исходным кодом и получает индекс, равный $src.Length, но, поскольку «их порядок не имеет значения и не должен быть последовательным», это не имеет значения. В этом ответе вся входная строка добавляется в конец строки с исходным кодом.
Андрей Одегов

1
@dfeuer, я не понимаю твой вопрос. Сожалею.
Маззи

2

Python 2 , 62 байта

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

Та же концепция, что и в моем ответе на C #.

Попробуйте онлайн!


\\\'должно быть \'\\. Хороший подход, хотя! Сохранено 23 байта в моем ответе Java.
Кевин Круйссен

1
@KevinCruijssen Исправлено
Воплощение невежества

2

Japt , 18 байт

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

Попытайся

ñÈ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

Желе , 26 байт (UTF-8 *)

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

Попробуйте онлайн!

Принимает ввод как строку в формате Python в 1-м аргументе командной строки.

Уникальные персонажи :

“®³nÞṾ©V”

* Примечание: я обнаружил, что это не работает при кодировании в JELLY, так как он сортирует символы UTF-8 вместо своих собственных байтов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.