Числа увеличиваются, а буквы уменьшаются


23

Вдохновленный этим вопросом переполнения стека: сортировка списка: числа по возрастанию, буквы по убыванию . Ваша задача - решить следующую проблему, и, поскольку это , вы должны делать это как можно меньше байтов.

Вы должны взять список объектов , как входные данные, содержащие буквы (любую разумную форма: string, charи т.д.) и число. Затем вы должны отсортировать числа в порядке возрастания, а буквы в порядке убывания. Тем не менее, вы должны держать буквы в буквенных позициях и цифры в цифрах. Например, если список:

[L, D, L, L, D, L]

Список вывода должен быть в виде:

[L, D, L, L, D, L]

Работать через

Входные данные: ['a', 2, 'b', 1, 'c', 3]

  • Сортировать числа в порядке возрастания: [1, 2, 3]
  • Сортировка букв в порядке убывания: ['c', 'b', 'a']
  • Присоединяйтесь к ним, но сохраняйте порядок: ['c', 1', 'b', 2, 'a', 3]

правила

  • Список будет содержать только буквы и цифры.
  • Список может быть пустым.
  • Список может содержать только буквы или только цифры.
  • Если ваш язык не поддерживает массивы смешанного типа, вы можете использовать цифры вместо цифр. Обратите внимание, что если ваш язык поддерживает это, вы должны использовать смешанные типы.
  • Письма будут только [a-z]или [A-Z], вы можете выбрать, какие из них.
  • Письма сортируются aявляется самым низким, zбудучи высшим т a = 1, z = 26.
  • Стандартные лазейки запрещены.
  • Ввод / вывод может быть любым стандартным способом, в том числе в виде строки.

Контрольные примеры

[5, 'a', 'x', 3, 6, 'b'] -> [3, 'x', 'b', 5, 6, 'a']

[ 3, 2, 1] -> [ 1, 2, 3 ]

[ 'a', 'b', 'c' ] -> [ 'c', 'b', 'a' ]

[] -> []

[ 2, 3, 2, 1 ] -> [1, 2, 2, 3]

Поскольку это выигрывает самый короткий ответ в байтах!


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Мартин Эндер

Ответы:


7

Сетчатка , 10 байт

O`\d
O^`\D

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

OЭтап в Retina может непосредственно осуществлять вид селективной сортировки , требуемой этим вызовом.

Здесь первая строка сортирует цифры, а вторая строка - не цифры наоборот.


13

Python 2 , 53 52 байта

-2 байта благодаря g.rocket
-1 байту благодаря Джонатану Фреху

def F(x):n=sorted(x);print[n.pop((e<x)-1)for e in x]

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

Вначале sortedсписок будет содержать числа, а затем символы типа [3, 5, 6, 'a', 'b', 'x'], а затем использовать их e<xдля фильтрации того, что является числом, а что символом. В python любое число меньше, чем список (входные данные), а список меньше строки.


Эта версия не работает с IndexError: pop index out of range. Первое решение сработало.
г-н Xcoder

Это работает, хотя , с 55 байтами тоже. 1-(e<'`')должно быть (e<'`')-1. Вы просто разместили их в неправильном порядке. Кстати, вы меня ниндзя: / У меня было это
г-н Xcoder

@ Mr.Xcoder спасибо за помощь c:
Род

2
Сохрани два сe>x
g.rocket

1
@RootTwo Это делает противоположность предполагаемого поведения.
LyricLy

9

APL (Dyalog) , 27 26 байтов

Ожидает символы в верхнем регистре

(⍋⊃¨⊂)@(~e)(⍒⊃¨⊂)@(e←∊∘⎕A)

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

Это всего лишь два приложения формы f@g, применить функцию fк пунктам, обозначенным g.

При первом использовании приложения мы:
f:  ⍒⊃¨⊂ нисходящие сорта ( ) каждый подборщик ( ⊃¨) от всего аргумента ( ).
g:  (e←∊∘⎕A) members ( ) of ( ) A lphabet ( ⎕A) и store ( ) этой функции какe .

Для второго использования приложения мы:
f:  ⍋⊃¨⊂ восходящие сорта ( ) каждый подборщик ( ⊃¨) от всего аргумента ( ).
g:  (~e) not ( ~) члены алфавита ( e; функция, которую мы сохранили раньше)


Я думаю, что это должно охватывать все целые числа, поэтому замените второй фильтр на83=⎕DR¨⍵
Uriel

@Uriel Не кажется обязательным, но сохранил байт. Кроме того, ⎕DR не всегда 83 для чисел, только для маленьких целых чисел.
Адам

это всегда 3=10|⎕DRдля целых чисел?
Уриэль

@Uriel Да: 0 = UnicodeChar, 1 = логический, 2 = ClassicChar, 3 = int, 5 = float, 6 = указатель, 7 = десятичный, 9 = сложный. ⌊0.1×⎕DRдает количество бит, используемых для представления каждого скаляра, за исключением указателей, которые зависят от архитектуры, но всегда равны 326. Таким образом, все числа являются 2|⎕DR.
17

8

JavaScript (ES6), 71 51 47 байт

Сохранено 20 байтов, просто используя sort(), как предложено @JustinMariner
Сохранено еще 4 байта благодаря @CraigAyre

Используя подход, аналогичный ответу Python Рода :

a=>[...a].map(n=>a.sort()[1/n?'shift':'pop']())

Контрольные примеры


Я что-то упустил или вы не можете удалить всю sortфункцию и просто использовать sort()ее самостоятельно? Кажется, сортировать так же без функции (в Chrome / FF / Edge).
Джастин Маринер

@JustinMariner Сначала я думал, что числовые значения могут быть числами - в этом случае простое не sort()получится. Но так как мы ограничены цифрами, вы правы: это работает. Благодарность!
Арно

1
Хорошее решение, вы могли бы сдвигать / a.sort()x.map(n=>a.sort()[1/n?'shift':'pop']())
Крейг Эйр

@CraigAyre Хороший улов!
Арно

Я уверен, что +nможно использовать вместо1/n
Конор О'Брайен

5

Р , 83 76 байт

-7 байт благодаря Miff

function(n){u=unlist
d=n%in%0:9
n[d]=sort(u(n[d]))
n[!d]=sort(u(n[!d]),T)
n}

Это то же самое, что и ниже, но оно допускает ввод смешанного типа как вектор, listа не как atomicвектор (который будет вводить все как символы со смешанными типами).

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

R , 68 61 байт

-7 байт благодаря Miff

function(n){d=n%in%0:9
n[d]=sort(n[d])
n[!d]=sort(n[!d],T)
n}

Анонимная функция. В этом случае все цифры приводятся к символам. n[-d]это массив без цифр. Возвращает NULL(пустой список) при пустом вводе.

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


Вы можете сбрить несколько персонажей с помощьюd=n%in%0:9
Miff

4

Japt , 18 15 байт

Спасибо @Shaggy за -3 байта и за помощь в исправлении массивов с 0s.


c ñc
®¤?Vv :Vo

Первая строка намеренно оставлена ​​пустой.

Попробуйте онлайн! используя -Qдля просмотра отформатированного массива.

объяснение

Первая строка пуста, чтобы избежать перезаписи входного массива.
[5, 'a', 'x', 3, 6, 'b']

c ñc

Сделайте копию, уплощая ( c) входной массив, затем сортируйте ( ñ) со строками, представленными их символами ( c). Это хранится в V.
[3, 5, 6, 'a', 'b', 'x']

£

Затем сопоставьте входной массив с помощью функции ...

¤?Vv :Vo

Превратить числа в двоичные строки (правда) или строки в ""(ложь) ( ¤). Если верно, удалите из начала V( v), в противном случае удалите из конца ( o).



@ Шэгги Хорошо, это действительно умно. Благодарность!
Джастин Маринер

Вы забыли переключиться Voи Vvвокруг. Я убежден, что должен быть более короткий путь без троичного.
Лохматый

@ Шэгги Ой, упс. И да, просто если oбы можно было удалить с самого начала с отрицательными значениями или что-то ...
Джастин Маринер

4

JavaScript, 164 162 158 142 байта

редактировать 1: 2 байта меньше после удаления избыточного назначения v.

редактируйте 2: 4 байта меньше благодаря TheLethalCoder.

редактировать 3: 16 байт меньше благодаря блестящим подсказкам от Джастина Маринера

x=>eval("n=v=>typeof(v)=='number';l=x.length;for(i=0;i<l;x[i++]=x[m],x[m]=w){for(v=w=x[j=m=i];++j<l;)n(e=x[j])==n(w)&&e<v==n(w)&&(m=j,v=e)}x")

Это мой первый раз в код-гольфе, так что он, безусловно, может быть улучшен ... Но все же, стоит попробовать.

Программа выполняет вариант сортировки выбора, который учитывает только значения того же типа, что и текущий (замена только числа и числа или буквы и буквы)

Читаемая форма:

x=>eval("
    n=v=>typeof(v)=='number';
    l=x.length;
    for(i=0;i<l;x[i++]=x[m],x[m]=w){
        for(v=w=x[j=m=i];++j<l;) 
            n(e=x[j])==n(w) && e<v==n(w) && (m=j,v=e)
    }
    x
")

for(j=i+1;j<l;j++)-> for(j=i++;++j<l;)и убрать приращение во внешнем цикле.
TheLethalCoder

Добро пожаловать PPCG тоже!
TheLethalCoder

@TheLethalCoder, если мы увеличиваем счетчики так рано, нам также нужно изменить строки, где используются i и j ... Но идея действительно умная, я все равно подумаю, как ее использовать.
mackoo13

Вы можете увеличивать , jкак я предложил, я не видел , использовать iдальше просто изменить x[i]=x[m]слишкомx[i++]=x[m]
TheLethalCoder

Ах, конечно ... Почему я не подумал x[i++]=x[m]... Спасибо!
mackoo13

3

C ++ 17 (gcc) , 219 байт

#include <variant>
#include <set>
using V=std::variant<char,int>;void f(V*a,V*b){std::set<V>S[2];for(V*c=a;c<b;++c)S[c->index()].insert(*c);auto
C=S->rbegin();auto N=S[1].begin();for(;a<b;++a)*a=(a->index()?*N++:*C++);}

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

Вряд ли конкурентоспособен. Но я должен поддерживать массивы смешанного типа? FINE.

Принимает массив вариантов в стиле диапазона и изменяет его на месте. Копирует ввод в два отсортированных набора, а затем обратно в массив ввода / вывода.


Это интересно. Я бы не стал интерпретировать «поддержку массивов смешанного типа» таким образом. В противном случае мне пришлось бы использовать массив из void *C;) Но, да, интересно посмотреть, как решение прыгает через такой обруч.
Феликс Пальмен,

Вы можете сохранить два байта, удалив пробелы в #includes
Конор О'Брайен



2

Pyth , 12 11 байтов

KSQm.(Kt>\@

Попробуйте онлайн! или попробуйте тестовый набор.


объяснение

KSQm.(Kt<d\@  - Full program with implicit input.

KSQ           - Assign a variable K to the lexicographically sorted input.
   m          - Map over the input (with a variable d).
    .(K       - Pop the sorted list at this location:
       >\@    - If d is lexicographically lower than '@', at 0 (the first element). Else, at -1 (the last element).

Подождите, вам не нужно упорядочивать весь массив, просто разбейте его на два однородных массива, каждый из которых должен легко сортироваться. APL также не может сортировать смешанные массивы, но я сортирую каждый тип отдельно.
17

@ Adám Что вы имеете в виду, просто разделив два однородных массива, каждый из которых должен легко сортироваться ?
г-н Xcoder

Как описано в «Операции» ОП: 1. Запишите, какие элементы являются числовыми, а какие символьными. 2. Извлеките все числа в отдельный массив и отсортируйте их. Сделайте то же самое для персонажей. 3. Поместите отсортированный номер обратно в номерные слоты. Сделайте то же самое для персонажей.
Адам

@ Adám Если ОП считает это недействительным, я сделаю именно то, что вы сказали (это приведет к гораздо более долгому подходу)
г-н Xcoder

2

Python, 145 139 130 байт

6 байтов сохранено благодаря @officialaimm

9 байтов сохранено благодаря @Chris_Rands

g=lambda s,a:sorted(x for x in s if(type(x)==str)==a)
def f(s):l,n=g(s,1),g(s,0)[::-1];return[[n,l][type(x)==str].pop()for x in s]

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



type(x)==strя бы сэкономил несколько байтов, используя, isinstance(...)я думаю,
Chris_Rands

@Chris_Rands спасибо!
Уриэль

2

05AB1E , 17 байт

SaJ¹á{R¹þ{«vyay.;

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


SaJ               # Push 1 if letter 0 else, for all letters in string.
   ¹á{R           # Reverse sort letters from input.
       ¹þ{        # Regular sort digits from input.
          «       # Concatenate those two things.
           v      # For each letter in the sorted string...
            ya    # 0 if digit, 1 if letter.
              y.; # Replace first instance of 0/1 with digit/letter.

Использование замыкания на самом деле было хуже: Σ©Ç®ai0<*}}¹SaJsvyay.;


2

Python 3, 77 байт

Этот ответ основан на комментарии, в котором говорится, что вы можете использовать «1», «2» и т. Д., Если символы и цифры не сопоставимы в языке. 'a' и 1 не сопоставимы в Python 3.

def f(s):x=sorted(s,key=lambda c:ord(c)-95);return[x.pop(-(c>'.'))for c in s]

2

q / kdb +, 54 53 байта

Решение:

{x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}

Примеры:

q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}(5;"a";"x";3;6;"b") / mixed list
3
"x"
"b"
5
6
"a"
q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}3 2 1   / simple list
1 2 3
q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}"abc"   / simple list
"cba"
q){x[w,q]:asc[x w:(&)d],desc x q:(&)(~)d:-7=type@/:x;x}2 3 2 1 / simple list
1 2 2 3

Объяснение:

Найти символы в списке, отсортировать по убыванию, найти длинные в списке, отсортировать их по возрастанию, объединиться, чтобы получить список, например ("x";"b";"a";3;5;6), затем назначить отсортированные значения их первоначальным позициям в списке, например, в0 3 4 1 2 5 .

Игра в гольф просто переключение из Q ключевых слов ( each, whereи not) для их kэквивалента (что требует от них быть завернуты в скобках).

{x[w,q]:asc[x w:where d],desc x q:where not d:-7=type each x;x} / ungolfed
{                                                           ; } / lambda function with 2 statements
                                                 type each x    / return types of elements in mixed list
                                              -7=               / true where item is a long
                                            d:                  / save this bool array in d
                                        not                     / invert
                                  where                         / indices where true (we have chars)
                                q:                              / save these indices in q
                              x                                 / values of x at these indices
                         desc                                   / sort them descending
                        ,                                       / join/contatenate
                where d                                         / indices where we have digits
              w:                                                / save this in w
            x                                                   / values of x at these indices
        asc[           ]                                        / sort them ascending
 x[w,q]:                                                        / assign this list to x at indices w,q
                                                             x  / return x

Правки

  • -1 байт, поскольку квадратные скобки не нужны desc

2

C (gcc) , 125 113 110 байт

main(i){char*b,*c,s[99];for(gets(c=b=s);*++c||*(c=++b);)i=*b&64,i^*c&64||*c>*b^!i&&(i=*c,*c=*b,*b=i);puts(s);}

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

Разъяснение:

main(i)
{
    char*b,*c,s[99];

    // slightly modified stupid bubblesort, this line in fact
    // does nested looping with a single for statement
    for(gets(c=b=s);*++c||*(c=++b);)
    // (undefined behavior here, there's no sequence point between accesses to c,
    // so this could go wrong. Works with the gcc version on tio.)

        // determine whether the current b is a letter:
        i=*b&64,

        // for doing anything, b and c must be the same "type":
        i^*c&64

            // when c > b for letter or c <= b for digit
            || *c>*b^!i

            // then swap
            && (i=*c,*c=*b,*b=i);

    puts(s);
}

Письма ожидаются в верхнем регистре.


2

PHP, 66 байт:

for($a=$argv,sort($a);a&$c=$argv[++$i];)echo$a[$c<A?++$k:--$argc];

принимает входные данные из аргументов командной строки, печатает строку. Запустить с -nrили попробуйте онлайн .

Выдает предупреждение в PHP 7.1; заменить a&с , ""<чтобы исправить.


1

Mathematica, 107 байт

(s=#;s[[p]]=Sort[s[[p=#&@@@s~($=Position)~_String]],#2~Order~#>0&];s[[c]]=Sort@s[[c=#&@@@s~$~_Integer]];s)&

1

C # (.NET Core) , 171 байт

a=>{var b=a.Where(x=>x is int).ToList();b.Sort();int i=0,j=0;return a.Select(x=>b.Contains(x)?b[i++]:a.Except(b).OrderByDescending(y=>y).ToList()[j++]);}

Количество байтов также включает в себя:

using System.Linq;

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

Объяснение:

a =>
{
    var b = a.Where(x => x is int).ToList(); // Filter to only ints and transform to list
    b.Sort();                                // Sort the list
    int i = 0, j = 0;                        // Create index counters
    return a.Select(x =>                     // Replace each input element with
                    b.Contains(x) ?          // If it is in list b:
                    b[i++] :                 // Get the next element from b
                    a.Except(b)              // Otherwise take input and filter out those in b
                     .OrderByDescending(x=>x)// Order them z to a
                     .ToList()[j++]);        // Get the next element


1

Рубин , 265 байт

x.sort_by(&:to_s).select{|a| a.is_a?(String)}.zip(x.map.with_index {|a, i| a.is_a?(String) ? i : nil}.compact).each{|a,i| x[i] = a}
x.sort_by(&:to_s).select{|a| a.is_a?(Integer)}.zip(x.map.with_index {|a, i| a.is_a?(Integer) ? i : nil}.compact).each{|a,i| x[i] = a}

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

Первый таймер здесь, Мое решение определенно не лучшее. Но так как это мой первый ответ, я подумала в публикации просто для удовольствия.

Смотря вперед, чтобы увидеть лучшие ответы Руби, чтобы увидеть, что является лучшим подходом. Я надеюсь, что я улучшу в будущем ответы =)

Удобочитаемый

x = ["c", 1, "a", 3, "b", 2]

b = x.map.with_index {|a, i| a.is_a?(Integer) ? i : nil}.compact
s = x.map.with_index {|a, i| a.is_a?(String) ? i : nil}.compact

o = x.sort_by(&:to_s).select{|a| a.is_a?(Integer)}
d = x.sort_by(&:to_s).select{|a| a.is_a?(String)}

d.zip s
d.zip(s).each {|a, i| x[i] = a}

o.zip b
o.zip(b).each {|a, i| x[i] = a }

p x

1

Haskell, 108 байт

Там могут быть более короткие пути, но я просто должен был попробовать это с Lensбиблиотекой.

import Control.Lens
import Data.List
i(!)f=partsOf(traverse.filtered(!'='))%~f.sort
f x=x&i(<)id&i(>)reverse

Я мог бы определить, fчто это просто композиция из двух iвызовов, но я все равно должен был бы применить xк нему, чтобы избежать ошибки типа из-за ограничения мономорфизма. Обратите внимание, что тип fis Traversable t => t Char -> t Charможет использоваться как с Strings, которые являются списками Chars, так и с массивамиChar s.

Вот тестовые случаи:

*Main> map f ["5ax36b","321","abc","","2321"]
["3xb56a","123","cba","","1223"]

1

Python 3, 91 байт

def f(s):x=sorted(s,key=lambda c:(type(c)==str,c));return[x.pop(-(type(c)==str))for c in s]

1

Clojure, 151 байт

#(map(fn[t c](nth((if(=(type 1)t)vec reverse)(sort((group-by type %)t)))(-(c t)1)))(map type %)(reductions(partial merge-with +)(for[i %]{(type i)1})))

Пример:

(def f #( ... ))
(f [5 \a \x 3 6 \b])
; (3 \x \b 5 6 \a)

Это вычисляет накопленную сумму сумм целых чисел и символов и использует ее для поиска правильного элемента из отсортированного списка элементов соответствующего типа.


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