Числа збільшуються, коли літери зменшуються


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 спасибі за допомогу з:
Rod

2
Збережіть дваe>x
g.rocket

1
@RootTwo Це робить протилежне передбачуваній поведінці.
LyricLy

9

APL (Діалог) , 27 26 байт

Очікує, що символи будуть великими літерами

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

Спробуйте в Інтернеті!

Це всього лише два додатки форми f@g, застосуйте функцію fдо елементів, зазначених у g.

Коли послуга ми:
f:  ⍒⊃¨⊂ спадні сорти ( ) кожен підбирач ( ⊃¨) від всього аргументу ( ).
g:  (e←∊∘⎕A) members ( ) of ( ) A lphabet ( ⎕A) та зберігають ( ) цю функцію як e.

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


Я думаю, це має охоплювати всі цілі числа, тому замініть другий фільтр на83=⎕DR¨⍵
Уріель

@Uriel Насправді, здається, не є вимогою, але врятував байт. Також ⎕DR не є загально 83 для чисел, лише для малих цілих чисел.
Adám

це завжди 3=10|⎕DRдля цілих чисел?
Уріель

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

8

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

Збережено 20 байтів лише за допомогою використання sort(), як запропонував @JustinMariner Зберегло ще
4 байти завдяки @CraigAyre

Використовуючи аналогічний підхід, як і відповідь Python Rod :

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']())
Craig Ayre

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

Я впевнений, що +nзамість цього можна використовувати1/n
Conor O'Brien

5

R , 83 76 байт

-7 байт завдяки Міффу

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 байт завдяки Міффу

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) вхідний масив, а потім сортуйте ( ñ) з рядками, представленими їх char-кодом ( c). Це зберігається в V.
[3, 5, 6, 'a', 'b', 'x']

£

Потім відобразити вхідний масив за функцією ...

¤?Vv :Vo

Перетворіть номери у двійкові рядки (truthy) або рядки в ""(falsy) ( ¤). Якщо truthy, видаліть з початку V( v), інакше видаліть з кінця ( o).



@Shaggy Приємно, це дуже розумно. Спасибі!
Джастін Марінер

Ви забули переключитися Voі Vvнавколо. Я переконаний, що має бути коротший шлях, без потрійного.
Shaggy

@Shaggy О, так. І так, просто, якщо 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++);}

Спробуйте в Інтернеті!

Навряд чи конкурентоспроможний. Але я повинен підтримувати масиви змішаного типу? Дрібно.

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


Це цікаво. Я б не тлумачив "підтримуючі масиви змішаного типу" таким чином. В іншому випадку мені доведеться використовувати масив void *в C;) Але, так, цікаво побачити рішення, що стрибає через такий обруч.
Фелікс Палмен

Можна зберегти два байти, видаливши пробіли в #includes
Conor O'Brien



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 також не може сортувати змішані масиви (поки що), але я сортую кожен тип окремо.
Адам

@ Adám Що ви маєте на увазі під простою поділкою на два однорідні масиви, кожен з яких повинен бути легко сортувати ?
Містер Xcoder

Як описано в "Робочому процесі" ОП: 1. Зазначте, які елементи є числовими, а які - символьними. 2. Витягніть всі числа в окремий масив і відсортуйте їх. Зробіть те саме для персонажів. 3. Поставте відсортоване число назад у числові слоти. Зробіть те саме для персонажів.
Adám

@ Adám Якщо ОП вважає це недійсним, я зроблю саме те, що ви сказали (Це призведе до набагато довшого підходу)
Пан Xcoder

2

Пітон, 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

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до нього, щоб уникнути помилки типу від обмеження мономорфізму. Зауважте, що тип такого fє, 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.