Angka Meningkat Saat Surat Turun

23

Terinspirasi oleh pertanyaan Stack Overflow ini: Menyortir daftar: angka dalam naik, huruf dalam turun . Tugas Anda adalah untuk memecahkan masalah berikut ini dan, karena ini adalah , Anda harus melakukannya sesedikit mungkin dalam byte.

Anda harus mengambil daftar objek sebagai masukan yang mengandung huruf (bentuk yang wajar: string, char, dll) dan angka. Anda kemudian harus mengurutkan angka ke dalam urutan menaik dan huruf ke urutan menurun. Namun, Anda harus menyimpan huruf di posisi huruf dan angka di posisi angka. Misalnya, jika daftar adalah:

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

Daftar keluaran harus dalam bentuk:

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

Bekerja melalui

Memasukkan: ['a', 2, 'b', 1, 'c', 3]

  • Sortir angka ke dalam urutan menaik: [1, 2, 3]
  • Urutkan surat ke dalam urutan menurun: ['c', 'b', 'a']
  • Bergabunglah dengan mereka kembali tetapi tetap urutannya sama: ['c', 1', 'b', 2, 'a', 3]

Aturan

  • Daftar ini hanya akan berisi huruf dan angka.
  • Daftarnya mungkin kosong.
  • Daftar ini hanya dapat berisi huruf atau hanya digit.
  • Jika bahasa Anda tidak mendukung array tipe campuran, Anda dapat menggunakan karakter digit alih-alih angka. Perhatikan bahwa jika bahasa Anda mendukung ini, Anda harus menggunakan jenis campuran.
  • Surat hanya akan menjadi [a-z]atau [A-Z], Anda dapat memilih yang mana.
  • Surat diurutkan sebagai ayang terendah, zyaitu yang tertinggi yaitu a = 1, z = 26.
  • Celah standar dilarang.
  • I / O dapat dengan sarana standar termasuk sebagai string.

Uji kasus

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

Karena ini adalah , jawaban terpendek dalam byte menang!

TheLethalCoder
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Martin Ender

Jawaban:

7

Retina , 10 byte

O`\d
O^`\D

Cobalah online!

The Otahap dalam Retina dapat langsung melakukan jenis penyortiran selektif dibutuhkan oleh tantangan ini.

Di sini baris pertama mengurutkan digit sedangkan baris kedua mengurutkan non-digit secara terbalik.

Leo
sumber
13

Python 2 , 53 52 byte

-2 byte berkat g.rocket
-1 byte terima kasih kepada Jonathan Frech

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

Cobalah online!

The sorteddaftar akan memiliki angka pertama dan kemudian karakter seperti [3, 5, 6, 'a', 'b', 'x'], kemudian gunakan e<xuntuk menyaring apa yang jumlah dan apa yang char, di python sejumlah kurang dari daftar (input) dan daftar kurang dari string.

tongkat
sumber
Versi ini gagal dengan IndexError: pop index out of range. Solusi pertama berhasil.
Tn. Xcoder
Ini bekerja meskipun , dengan 55 byte juga. 1-(e<'`')seharusnya (e<'`')-1. Anda hanya menempatkan mereka dalam urutan yang salah. BTW, Anda ninja kan: / Saya punya ini
Tn. Xcoder
@Tr.Xcoder terima kasih atas bantuannya c:
Rod
2
Simpan dua dengane>x
g.rocket
1
@ BootTwo Itu melakukan kebalikan dari perilaku yang dimaksud.
LyricLy
9

APL (Dyalog) , 27 26 byte

Diharapkan karakter menjadi huruf besar

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

Cobalah online!

Ini hanya dua aplikasi formulir f@g, menerapkan fungsi fpada item yang ditunjukkan oleh g.

Untuk pertama aplikasi kita gunakan:
f:  ⍒⊃¨⊂ nilai-nilai menurun ( ) masing-masing pick ( ⊃¨) dari seluruh argumen ( ).
g:  (e←∊∘⎕A) anggota ( ) dari ( ) lfabet A ( ⎕A), dan menyimpan ( ) fungsi ini sebagai e.

Untuk kedua aplikasi yang kami gunakan:
f:  ⍋⊃¨⊂ nilai-nilai ascending ( ) masing-masing pick ( ⊃¨) dari seluruh argumen ( ).
g:  (~e) not ( ~) anggota alfabet ( e; fungsi yang kami simpan sebelumnya)

Adm
sumber
Saya pikir ini perlu mencakup untuk semua bilangan bulat, jadi ganti filter kedua dengan83=⎕DR¨⍵
Uriel
@Uriel Sepertinya tidak menjadi persyaratan, tetapi memang menghemat satu byte. Juga, ⎕DR tidak secara universal 83 untuk angka, hanya untuk bilangan bulat kecil.
Adám
apakah selalu 3=10|⎕DRuntuk bilangan bulat?
Uriel
@Uriel Ya: 0 = UnicodeChar, 1 = Boolean, 2 = ClassicChar, 3 = int, 5 = float, 6 = pointer, 7 = desimal, 9 = kompleks. ⌊0.1×⎕DRmemberi Anda jumlah bit yang digunakan untuk mewakili setiap skalar, kecuali untuk pointer, yang bergantung pada arsitektur tetapi selalu 326. Dengan demikian, semua angka adalah 2|⎕DR.
Adám
8

JavaScript (ES6), 71 51 47 byte

Disimpan 20 byte hanya dengan menggunakan sort(), seperti yang disarankan oleh @JustinMariner
Disimpan 4 byte lagi berkat @CraigAyre

Menggunakan pendekatan yang mirip dengan jawaban Rod's Python :

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

Uji kasus

Arnauld
sumber
Apakah saya melewatkan sesuatu atau tidak dapatkah Anda menghapus seluruh sortfungsi dan hanya menggunakannya sort()sendiri? Tampaknya mengurutkan dengan cara yang sama tanpa fungsi (di Chrome / FF / Edge).
Justin Mariner
@JustinMariner Pada awalnya, saya pikir nilai numerik bisa berupa angka - dalam hal ini sederhana sort()akan gagal. Tetapi karena kami terbatas pada angka, Anda benar: itu berfungsi. Terima kasih!
Arnauld
1
Solusi yang bagus, bisa Anda menggeser / pop pada a.sort()setiap loop bukan menugaskan ke x:.map(n=>a.sort()[1/n?'shift':'pop']())
Craig Ayre
@CraigAyre Tangkapan bagus!
Arnauld
Saya cukup yakin +ndapat digunakan sebagai ganti1/n
Conor O'Brien
5

R , 83 76 byte

-7 byte berkat Miff

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

Ini sama dengan di bawah ini, tetapi memungkinkan input tipe campuran sebagai listbukan atomicvektor (yang akan typecast semuanya sebagai karakter dengan tipe campuran).

Cobalah online!

R , 68 61 byte

-7 byte berkat Miff

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

Fungsi anonim. Semua digit dilemparkan ke karakter dalam kasus ini. n[-d]adalah array tanpa angka. Mengembalikan NULL(daftar kosong) pada input kosong.

Cobalah online!

Giuseppe
sumber
Anda dapat mencukur habis beberapa karakter dengand=n%in%0:9
Miff
4

Japt , 18 15 byte

Terima kasih @Shaggy untuk -3 byte dan untuk bantuan memperbaiki array dengan 0s.


c ñc
®¤?Vv :Vo

Baris pertama sengaja dikosongkan.

Cobalah online! gunakan -Quntuk melihat array yang diformat.

Penjelasan

Baris pertama kosong untuk menghindari menimpa array input.
[5, 'a', 'x', 3, 6, 'b']

c ñc

Buat salinan dengan meratakan ( c) array input, lalu urutkan ( ñ) dengan string yang diwakili oleh kode karakter mereka ( c). Ini disimpan di V.
[3, 5, 6, 'a', 'b', 'x']

£

Kemudian memetakan array input dengan fungsi ...

¤?Vv :Vo

Ubah angka menjadi string biner (kebenaran) atau string menjadi ""(falsy) ( ¤). Jika benar, hapus dari awal V( v), jika tidak hapus dari akhir ( o).

Justin Mariner
sumber
15 byte
Shaggy
@ Shaggy Bagus, itu sangat pintar. Terima kasih!
Justin Mariner
Anda lupa untuk beralih Vodan Vvberkeliling. Saya yakin harus ada jalan yang lebih pendek, tanpa terner.
Shaggy
@ Shaggy Oh, wah. Dan ya, hanya jika obisa menghapus dari awal dengan nilai negatif atau sesuatu ...
Justin Mariner
4

JavaScript, 164 162 158 142 byte

sunting 1: 2 byte lebih sedikit setelah menghapus penugasan berlebihan v.

sunting 2: 4 byte lebih sedikit berkat TheLethalCoder.

sunting 3: 16 byte lebih sedikit berkat petunjuk brilian dari Justin Mariner

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

Ini pertama kalinya saya bermain golf kode, jadi pasti bisa ditingkatkan ... Tapi tetap, patut dicoba.

Program melakukan varian pemilihan jenis, yang hanya memperhitungkan nilai-nilai dari jenis yang sama dengan yang sekarang (hanya menukar angka dan angka, atau huruf dan huruf)

Formulir yang dapat dibaca:

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
sumber
for(j=i+1;j<l;j++)-> for(j=i++;++j<l;)dan hapus kenaikan di lingkaran luar.
TheLethalCoder
Selamat datang PPCG juga!
TheLethalCoder
@TheLethalCoder jika kita menambah penghitung begitu cepat, kita juga perlu mengubah garis di mana saya dan j digunakan ... Tapi idenya benar-benar cerdas, saya akan berpikir bagaimana memanfaatkannya juga.
mackoo13
Anda dapat menambahkan jseperti yang saya sarankan, saya tidak melihat Anda menggunakan ilebih jauh hanya mengubah x[i]=x[m]jugax[i++]=x[m]
TheLethalCoder
Ah, tentu ... Kenapa aku tidak memikirkan x[i++]=x[m]... Terima kasih!
mackoo13
3

C ++ 17 (gcc) , 219 byte

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

Cobalah online!

Hampir tidak kompetitif. Tetapi saya harus mendukung array tipe campuran? BAIK.

Menerima serangkaian varian dalam rentang gaya, dan memodifikasinya di tempat. Menyalin input ke dalam dua set yang diurutkan, dan kemudian kembali ke array input / output.

aschepler
sumber
Ini menarik. Saya tidak akan mengartikan "mendukung array tipe campuran" dengan cara ini. Kalau tidak, saya harus menggunakan array void *di C;) Tapi, ya, menarik untuk melihat solusi melompat melalui lingkaran seperti itu.
Felix Palmen
Anda dapat menyimpan dua byte dengan menghapus spasi di #includes
Conor O'Brien
2

Mathematica, 203 byte

(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)&


Cobalah online!

J42161217
sumber
2

Pyth , 12 11 byte

KSQm.(Kt>\@

Cobalah online! atau Coba Test Suite.


Penjelasan

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).
Tuan Xcoder
sumber
Tunggu, Anda tidak perlu memesan seluruh array, cukup bagi dua array homogen yang masing-masing harus mudah disortir. APL juga tidak dapat mengurutkan array campuran, tetapi saya mengurutkan setiap jenis secara terpisah.
Adám
@ Adám Apa yang Anda maksud dengan hanya membagi dua array homogen yang masing-masing harus dengan mudah disortir ?
Tn. Xcoder
Seperti yang dijelaskan dalam "Workthrough" OP: 1. Catat elemen mana yang numerik dan karakter. 2. Ekstrak semua angka ke dalam array yang terpisah dan urutkan itu. Lakukan hal yang sama untuk karakter. 3. Masukkan nomor yang diurutkan kembali ke dalam slot nomor. Lakukan hal yang sama untuk karakter.
Adám
@ Adám Jika OP menganggap ini tidak benar, saya akan melakukan persis apa yang Anda katakan (Ini akan menghasilkan pendekatan yang jauh lebih lama)
Tn. Xcoder
2

Python, 145 139 130 byte

6 byte disimpan berkat @officialaimm

9 byte disimpan berkat @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]

Cobalah online!

Uriel
sumber
139 bytes
officialaimm
type(x)==strakan menghemat beberapa byte menggunakan isinstance(...)i think
Chris_Rands
@Chris_Rands terima kasih!
Uriel
2

05AB1E , 17 byte

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

Cobalah 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.

Menggunakan penutupan berdasarkan jenis sebenarnya lebih buruk: Σ©Ç®ai0<*}}¹SaJsvyay.;

Guci Gurita Ajaib
sumber
2

Python 3, 77 byte

Jawaban ini didasarkan pada komentar yang mengatakan Anda dapat menggunakan '1', '2', dll jika karakter dan angka tidak sebanding dalam bahasa. 'a' dan 1 tidak dapat dibandingkan dalam Python 3.

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

q / kdb +, 54 53 byte

Larutan:

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

Contoh:

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

Penjelasan:

Temukan karakter dalam daftar, urutkan menurun, temukan panjang dalam daftar, urutkan, naik, bergabung untuk mendapatkan daftar, misalnya ("x";"b";"a";3;5;6), lalu tetapkan nilai yang diurutkan kembali ke posisi semula di daftar, misalnya di 0 3 4 1 2 5.

Golf hanya mengganti q kata kunci ( each, wheredan not) untuk kpadanannya (yang mengharuskan mereka untuk dibungkus dengan tanda kurung).

{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

Suntingan

  • -1 byte karena tidak perlu tanda kurung siku desc
streetster
sumber
2

C (gcc) , 125 113 110 byte

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

Cobalah online!

Dijelaskan:

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

Surat diharapkan dalam huruf besar.

Felix Palmen
sumber
2

PHP, 66 byte:

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

mengambil input dari argumen baris perintah, mencetak string. Jalankan dengan -nratau coba online .

Menghasilkan peringatan di PHP 7.1; ganti a&dengan ""<untuk memperbaiki.

Titus
sumber
1

Mathematica, 107 byte

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

C # (.NET Core) , 171 byte

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

Hitungan byte juga mencakup:

using System.Linq;

Cobalah online!

Penjelasan:

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
sumber
1

Perl 5 , 107 + 1 (-n) = 108 byte

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

Cobalah online!

Xcali
sumber
1

Ruby , 265 byte

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}

Cobalah online!

Timer pertama di sini, solusi saya pasti bukan yang terbaik. Tetapi karena ini adalah jawaban pertama saya, saya berpikir untuk memposting hanya untuk bersenang-senang saja.

Mencari foward untuk melihat jawaban Ruby yang lebih baik, untuk melihat apa pendekatan terbaik. Saya harap saya meningkatkan jawaban di masa mendatang =)

Dapat dibaca

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
sumber
1

Haskell, 108 byte

Mungkin ada cara yang lebih pendek, tetapi saya hanya harus mencobanya dengan Lensperpustakaan.

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

Saya bisa mendefinisikan fhanya menjadi komposisi dari dua idoa, tetapi saya masih harus menerapkannya xuntuk menghindari kesalahan jenis dari pembatasan monomorfisme. Perhatikan bahwa jenis fini Traversable t => t Char -> t Charsehingga dapat digunakan dengan Strings yang daftar Chars serta dengan array Chars.

Berikut adalah contoh-contoh tesnya:

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

Python 3, 91 byte

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

Clojure, 151 byte

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

Contoh:

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

Ini menghitung jumlah kumulatif bilangan bulat dan karakter, dan menggunakannya untuk mencari elemen yang benar dari daftar elemen elemen yang diurutkan.

NikoNyrh
sumber