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!


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.


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.


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)


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


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!


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



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

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.


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!



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

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!



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


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]

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

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.


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.


1

Mathematica, 107 byte

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

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!


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

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

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]

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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.