Liczby rosną, a litery maleją

23

Zainspirowany pytaniem Przepełnienie stosu: Sortowanie listy: liczby rosnące, litery malejące . Twoim zadaniem jest rozwiązanie następującego problemu, a ponieważ jest to , powinieneś to zrobić w jak najmniejszej liczbie bajtów.

Należy wziąć listę obiektów jako wkład zawierający litery (każdy rozsądny postaci: string, charitp) i liczb. Następnie należy posortować liczby w kolejności rosnącej, a litery w kolejności malejącej. Należy jednak trzymać litery na pozycjach literowych, a cyfry na pozycjach liczbowych. Na przykład, jeśli lista jest:

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

Lista wyjściowa powinna mieć postać:

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

Przebieg

Wkład: ['a', 2, 'b', 1, 'c', 3]

  • Posortuj liczby w porządku rosnącym: [1, 2, 3]
  • Sortuj litery w kolejności malejącej: ['c', 'b', 'a']
  • Dołącz do nich z powrotem, ale zachowaj kolejność: ['c', 1', 'b', 2, 'a', 3]

Zasady

  • Lista będzie zawierać tylko litery i cyfry.
  • Lista może być pusta.
  • Lista może zawierać tylko litery lub tylko cyfry.
  • Jeśli twój język nie obsługuje tablic mieszanych, możesz użyć cyfr zamiast cyfr. Pamiętaj, że jeśli Twój język to obsługuje, musisz używać typów mieszanych.
  • Listy będą tylko [a-z]lub [A-Z]możesz wybrać, który z nich.
  • Listy są sortowane jako anajniższe, znajwyższe tj a = 1, z = 26.
  • Standardowe luki są zabronione.
  • We / wy może być dowolnymi standardowymi środkami, w tym jako ciąg.

Przypadki testowe

[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]

Ponieważ jest to w najkrótsza odpowiedź w bajtach wygrywa!

TheLethalCoder
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Martin Ender

Odpowiedzi:

7

Siatkówka , 10 bajtów

O`\d
O^`\D

Wypróbuj online!

OEtap siatkówki może bezpośrednio wykonywać typu selektywnego sortowania wymaganych przez to wyzwanie.

Tutaj pierwszy wiersz sortuje cyfry, podczas gdy drugi wiersz sortuje cyfry w odwrotnej kolejności.

Lew
źródło
13

Python 2 , 53 52 bajty

-2 bajty dzięki g.rocket
-1 bajty dzięki Jonathan Frech

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

Wypróbuj online!

sortedLista będzie mieć numery pierwszej i następnie znaków jak [3, 5, 6, 'a', 'b', 'x'], a następnie użyć e<xdo filtra, co jest i co to jest numer char, w python dowolna liczba jest mniejsza niż lista (wejście) i lista jest mniejsza niż sznurku.

Pręt
źródło
Ta wersja kończy się niepowodzeniem IndexError: pop index out of range. Poprzednie rozwiązanie zadziałało.
Pan Xcoder,
Działa to jednak z 55 bajtami. 1-(e<'`')powinno być (e<'`')-1. Właśnie umieściłeś je w niewłaściwej kolejności. BTW, ty ninja'd mnie: / Miałem to
Mr. Xcoder
@ Mr.Xcoder dziękuje za pomoc c:
Rod
2
Zaoszczędź dwa za pomocąe>x
g.rocket
1
@RootTwo To robi odwrotność zamierzonego zachowania.
LyricLy,
9

APL (Dyalog) , 27 26 bajtów

Oczekuje, że znaki będą pisane wielkimi literami

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

Wypróbuj online!

To tylko dwie aplikacje formularza f@g, zastosuj funkcję fdo pozycji wskazanych przez g.

Dla najpierw aplikacja użytku:
f:  ⍒⊃¨⊂ stopnie malejące ( ) każdy pick ( ⊃¨) z całego argumentu ( ).
g:  Members (e←∊∘⎕A) ( ) z ( ) alfabetu A ( ⎕A) i store ( ) tę funkcję jako e.

Na drugim my aplikacja użytku:
f:  ⍋⊃¨⊂ gatunki rosnące ( ) każdy pick ( ⊃¨) z całego argumentu ( ).
g:  (~e) not ( ~) członków alfabetu ( e; funkcja, którą wcześniej zapamiętaliśmy)

Adám
źródło
Myślę, że to musi obejmować wszystkie liczby całkowite, więc wymień drugi filtr na83=⎕DR¨⍵
Uriel
@Uriel Nie wydaje się być wymaganiem, ale zapisał bajt. Ponadto ⎕DR nie jest powszechnie 83 dla liczb, tylko dla małych liczb całkowitych.
Adám
czy to zawsze 3=10|⎕DRdla liczb całkowitych?
Uriel
@Uriel Tak: 0 = UnicodeChar, 1 = Boolean, 2 = ClassicChar, 3 = int, 5 = float, 6 = wskaźnik, 7 = dziesiętny, 9 = złożony. ⌊0.1×⎕DRdaje liczbę bitów używanych do reprezentacji każdego skalara, z wyjątkiem wskaźników, które zależą od architektury, ale zawsze są 326. Zatem wszystkie liczby są 2|⎕DR.
Adám
8

JavaScript (ES6), 71 51 47 bajtów

Zaoszczędzono 20 bajtów, używając sort(), jak sugeruje @JustinMariner
Zaoszczędzono jeszcze 4 bajty dzięki @CraigAyre

Stosując podejście podobne do odpowiedzi Pytona Rod :

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

Przypadki testowe

Arnauld
źródło
Czy coś mi brakuje, czy nie możesz usunąć całej sortfunkcji i używać sort()jej samodzielnie? Wygląda na to, że sortuje się w ten sam sposób bez funkcji (w Chrome / FF / Edge).
Justin Mariner,
@JustinMariner Na początku myślałem, że wartości liczbowe mogą być liczbami - w takim przypadku prosty sort()zawiódłby. Ale ponieważ ograniczamy się do cyfr, masz rację: to działa. Dzięki!
Arnauld,
1
Ładne rozwiązanie, można przesunąć / pop na a.sort()każdej pętli zamiast przypisywania do x:.map(n=>a.sort()[1/n?'shift':'pop']())
Craig Ayre
@CraigAyre Dobry połów!
Arnauld,
Jestem całkiem pewien, że +nmożna go użyć zamiast1/n
Conor O'Brien
5

R , 83 76 bajtów

-7 bajtów dzięki Miff

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

Jest to to samo, co poniżej, ale pozwala na wprowadzanie tekstu mieszanego jako wektora, lista nie atomicwektora (który rzutowałby wszystko jako znaki o typach mieszanych).

Wypróbuj online!

R , 68 61 bajtów

-7 bajtów dzięki Miff

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

Funkcja anonimowa. W tym przypadku wszystkie cyfry są rzutowane na znaki. n[-d]to tablica bez cyfr. Zwraca NULL(pusta lista) przy pustych danych wejściowych.

Wypróbuj online!

Giuseppe
źródło
Możesz ogolić kilka postaci za pomocąd=n%in%0:9
Miff
4

Japt , 18 15 bajtów

Dzięki @Shaggy za -3 bajty i pomoc w naprawianiu tablic z 0s.


c ñc
®¤?Vv :Vo

Pierwszy wiersz celowo pozostawiono pusty.

Wypróbuj online! za pomocą, -Qaby wyświetlić sformatowaną tablicę.

Wyjaśnienie

Pierwszy wiersz jest pusty, aby uniknąć zastąpienia tablicy wejściowej.
[5, 'a', 'x', 3, 6, 'b']

c ñc

Utwórz kopię, spłaszczając ( c) tablicę wejściową, a następnie sortuj ( ñ) z ciągami znaków reprezentowanymi przez ich kod char ( c). To jest przechowywane w V.
[3, 5, 6, 'a', 'b', 'x']

£

Następnie zamapuj tablicę wejściową według funkcji ...

¤?Vv :Vo

Zamień liczby na ciągi binarne (prawda) lub ciągi na ""(fałsz) ( ¤). Jeśli to prawda, usuń od początku V( v), w przeciwnym razie usuń od końca ( o).

Justin Mariner
źródło
15 bajtów
Kudłaty
@Shaggy Nice, to naprawdę sprytne. Dzięki!
Justin Mariner,
Zapomniałeś przełącznika Voi Vvokolice. Jestem przekonany, że musi istnieć krótsza droga bez trójki.
Kudłaty
@Shaggy Oh, ups. I tak, jeśli tylko omógłbym usunąć od początku z wartościami ujemnymi lub coś ...
Justin Mariner
4

JavaScript, 164 162 158 142 bajtów

edytuj 1: 2 bajty mniej po usunięciu zbędnego przypisania v.

edycja 2: 4 bajtów mniej dzięki TheLethalCoder.

edytuj 3: 16 bajtów mniej dzięki genialnym wskazówkom Justina Marinera

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")

To mój pierwszy raz w golfie kodowym, więc z pewnością można go ulepszyć ... Mimo to warto spróbować.

Program wykonuje wariant sortowania selekcji, który bierze pod uwagę tylko wartości tego samego typu, co bieżący (zamieniając tylko cyfrę i liczbę lub literę i literę)

Czytelna forma:

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
")
mackoo13
źródło
for(j=i+1;j<l;j++)-> for(j=i++;++j<l;)i usuń przyrost w zewnętrznej pętli.
TheLethalCoder
Witamy również PPCG!
TheLethalCoder
@TheLethalCoder, jeśli zwiększymy liczniki tak wcześnie, będziemy musieli również zmienić linie, w których używane są i i j ... Ale pomysł jest naprawdę inteligentny, i tak pomyślę, jak z niego skorzystać.
mackoo13,
Można zwiększyć jjak zasugerowałem, nie widzę używasz idalej wystarczy zmienić x[i]=x[m]zbytx[i++]=x[m]
TheLethalCoder
Ach, jasne ... Dlaczego nie pomyślałem o x[i++]=x[m]... Dzięki!
mackoo13,
3

C ++ 17 (gcc) , 219 bajtów

#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++);}

Wypróbuj online!

Mało konkurencyjny. Ale muszę obsługiwać tablice mieszane? W PORZĄDKU.

Akceptuje tablicę wariantów w stylu zakresu i modyfikuje ją na miejscu. Kopiuje dane wejściowe do dwóch posortowanych zestawów, a następnie z powrotem do tablicy danych wejściowych / wyjściowych.

aschepler
źródło
To jest interesujące. Nie interpretowałbym w ten sposób „obsługi tablic mieszanych”. W przeciwnym razie musiałbym użyć tablicy void *w C;) Ale tak, interesujące jest zobaczyć rozwiązanie przeskakujące przez taki obręcz.
Felix Palmen,
Możesz zaoszczędzić dwa bajty, usuwając spacje w #includes
Conor O'Brien
2

Mathematica, 203 bajty

(K=Reverse;B=Complement;L=Length;S=Position[#,_Integer];T=Sort@Cases[#,_Integer];G=K@B[#,T];V=B[Range@L@#,Flatten@S];R=K@Sort@#;Table[R[[Min@S[[i]]]]=T[[i]],{i,L@T}];Table[R[[V[[i]]]]=G[[i]],{i,L@G}];R)&


Wypróbuj online!

J42161217
źródło
2

Pyth , 12 11 bajtów

KSQm.(Kt>\@

Wypróbuj online! lub Wypróbuj pakiet testowy.


Wyjaśnienie

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).
Pan Xcoder
źródło
Poczekaj, nie musisz zamawiać całej tablicy, wystarczy podzielić na dwie jednorodne tablice, z których każda powinna być łatwa do sortowania. APL nie może (jeszcze) sortować tablic mieszanych, ale każdy z nich sortuję osobno.
Adám
@ Adám Co rozumiesz przez podział na dwie jednorodne tablice, z których każda powinna być łatwa do sortowania ?
Mr. Xcoder,
Jak opisano w „Przebiorze” PO: 1. Zanotuj, które elementy są numeryczne, a które znakowe. 2. Wyodrębnij wszystkie liczby do osobnej tablicy i posortuj to. Zrób to samo dla bohaterów. 3. Umieść posortowany numer z powrotem w polach liczbowych. Zrób to samo dla postaci.
Adám
@ Adám Jeśli OP uzna to za nieważne, zrobię dokładnie to, co powiedziałeś (spowoduje to znacznie, znacznie dłuższe podejście)
Pan Xcoder
2

Python, 145 139 130 bajtów

6 bajtów zapisanych dzięki @officialaimm

9 bajtów zapisanych dzięki @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]

Wypróbuj online!

Uriel
źródło
139 bajtów
oficjalny
type(x)==strzaoszczędziłbym trochę bajtów przy użyciu isinstance(...)myślę
Chris_Rands
@Chris_Rands dzięki!
Uriel
2

05AB1E , 17 bajtów

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

Wypróbuj online!


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.

Korzystanie z zamknięcia sortującego było w rzeczywistości gorsze: Σ©Ç®ai0<*}}¹SaJsvyay.;

Urna Magicznej Ośmiornicy
źródło
2

Python 3, 77 bajtów

Ta odpowiedź opiera się na komentarzu, który mówi, że możesz używać „1”, „2” itd., Jeśli znaki i cyfry nie są porównywalne w języku. „a” i 1 nie są porównywalne w Pythonie 3.

def f(s):x=sorted(s,key=lambda c:ord(c)-95);return[x.pop(-(c>'.'))for c in s]
RootTwo
źródło
2

q / kdb +, 54 53 bajtów

Rozwiązanie:

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

Przykłady:

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

Wyjaśnienie:

Znajdź znaki na liście, sortuj malejąco, znajdź długi na liście, posortuj je rosnąco, połącz, aby uzyskać listę, np. ("x";"b";"a";3;5;6)Następnie przypisz posortowane wartości z powrotem do ich pierwotnych pozycji na liście, np.0 3 4 1 2 5 .

Gra w golfa polega tylko na zamianie q słów kluczowych ( each, wherei not) na ich kodpowiedniki (co wymaga, aby były zawinięte w nawiasy).

{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

Edycje

  • -1 bajt, ponieważ nie potrzebują nawiasów kwadratowych desc
Streetster
źródło
2

C (gcc) , 125 113 110 bajtów

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);}

Wypróbuj online!

Wyjaśnił:

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);
}

Litery są pisane wielkimi literami.

Felix Palmen
źródło
2

PHP, 66 bajtów:

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

pobiera dane wejściowe z argumentów wiersza poleceń, drukuje ciąg. Uruchom -nrlub wypróbuj online .

Daje ostrzeżenie w PHP 7.1; zastąpić a&z ""<do naprawienia.

Tytus
źródło
1

Mathematica, 107 bajtów

(s=#;s[[p]]=Sort[s[[p=#&@@@s~($=Position)~_String]],#2~Order~#>0&];s[[c]]=Sort@s[[c=#&@@@s~$~_Integer]];s)&
użytkownik202729
źródło
1

C # (.NET Core) , 171 bajtów

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++]);}

Liczba bajtów obejmuje również:

using System.Linq;

Wypróbuj online!

Wyjaśnienie:

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
Grzegorz Puławski
źródło
1

Perl 5 , 107 + 1 (-n) = 108 bajtów

y/][//d;@a=split/, /;@l=sort grep/\D/,@a;@d=sort grep/\d/,@a;@r=map{/\d/?pop@d:shift@l}@a;$"=", ";say"[@r]"

Wypróbuj online!

Xcali
źródło
1

Rubinowy , 265 bajtów

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}

Wypróbuj online!

Pierwszy raz tutaj, Moje rozwiązanie zdecydowanie nie jest najlepsze. Ale ponieważ jest to moja pierwsza odpowiedź, pomyślałem, pisząc tylko dla zabawy.

Patrząc w przyszłość, aby zobaczyć lepsze odpowiedzi Ruby, aby zobaczyć, jakie jest najlepsze podejście. Mam nadzieję, że poprawię w przyszłych odpowiedziach =)

Czytelny

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
Gustavo Gabriel
źródło
1

Haskell, 108 bajtów

Mogą istnieć krótsze sposoby, ale musiałem po prostu spróbować z Lensbiblioteką.

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

Mógłbym zdefiniować fpo prostu skład dwóch iwywołań, ale nadal musiałbym się do niego zastosować x, aby uniknąć błędu typu wynikającego z ograniczenia monomorfizmu. Zauważ, że typ fjest Traversable t => t Char -> t Chartaki, że można go używać z Strings, które są listami Chars, a także z tablicami Chars.

Oto przypadki testowe:

*Main> map f ["5ax36b","321","abc","","2321"]
["3xb56a","123","cba","","1223"]
Christian Sievers
źródło
1

Python 3, 91 bajtów

def f(s):x=sorted(s,key=lambda c:(type(c)==str,c));return[x.pop(-(type(c)==str))for c in s]
RootTwo
źródło
1

Clojure, 151 bajtów

#(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})))

Przykład:

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

Oblicza skumulowaną sumę liczbę liczb i znaków, i używa go do wyszukiwania prawidłowego elementu z uporządkowany wykaz odpowiednich elementów typu użytkownika.

NikoNyrh
źródło