Số lượng tăng trong khi chữ giảm


23

Lấy cảm hứng từ câu hỏi Stack Overflow này: Sắp xếp danh sách: các số tăng dần, các chữ cái giảm dần . Nhiệm vụ của bạn là giải quyết vấn đề sau và, vì đây là , bạn nên làm như vậy với càng ít byte càng tốt.

Bạn nên dành một danh sách các đối tượng như là đầu vào có chứa chữ cái (bất cứ hình thức hợp lý: string, char, vv) và số. Sau đó, bạn nên sắp xếp các số theo thứ tự tăng dần và các chữ cái theo thứ tự giảm dần. Tuy nhiên, bạn nên giữ các chữ cái ở vị trí chữ cái và số ở vị trí số. Ví dụ: nếu danh sách là:

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

Danh sách đầu ra phải ở dạng:

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

Làm việc suốt

Đầu vào: ['a', 2, 'b', 1, 'c', 3]

  • Sắp xếp các số theo thứ tự tăng dần: [1, 2, 3]
  • Sắp xếp các chữ cái theo thứ tự giảm dần: ['c', 'b', 'a']
  • Tham gia cùng họ trở lại nhưng giữ trật tự như cũ: ['c', 1', 'b', 2, 'a', 3]

Quy tắc

  • Danh sách sẽ chỉ chứa các chữ cái và chữ số.
  • Danh sách có thể trống.
  • Danh sách chỉ có thể chứa chữ cái hoặc chỉ chữ số.
  • Nếu ngôn ngữ của bạn không hỗ trợ mảng kiểu hỗn hợp, bạn có thể sử dụng các ký tự chữ số thay vì số. Lưu ý rằng nếu ngôn ngữ của bạn không hỗ trợ điều này, bạn phải sử dụng các loại hỗn hợp.
  • Thư sẽ chỉ [a-z]hoặc [A-Z], bạn có thể chọn cái nào.
  • Chữ cái được sắp xếp là athấp nhất, ztức là cao nhất a = 1, z = 26.
  • Sơ hở tiêu chuẩn bị cấm.
  • I / O có thể bằng bất kỳ phương tiện tiêu chuẩn nào, bao gồm cả dưới dạng chuỗi.

Các trường hợp thử nghiệm

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

Vì đây là , câu trả lời ngắn nhất trong byte thắng!


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Martin Ender

Câu trả lời:


7

Võng mạc , 10 byte

O`\d
O^`\D

Hãy thử trực tuyến!

Các Ogiai đoạn trong Retina có thể trực tiếp thực hiện các loại phân loại chọn lọc theo yêu cầu của thử thách này.

Ở đây, dòng đầu tiên sắp xếp các chữ số trong khi dòng thứ hai sắp xếp các chữ số ngược lại.


13

Python 2 , 53 52 byte

-2 byte nhờ g.rocket
-1 byte nhờ Jonathan Frech

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

Hãy thử trực tuyến!

Các sorteddanh sách sẽ có số đầu tiên và sau đó là ký tự như [3, 5, 6, 'a', 'b', 'x'], sau đó sử dụng e<xđể lọc số là gì và là những gì char, trong python bất kỳ số lượng ít hơn một danh sách (đầu vào) và một danh sách nhỏ hơn một chuỗi.


Phiên bản này thất bại với IndexError: pop index out of range. Các giải pháp trước đây đã làm việc.
Ông Xcoder

Điều này hoạt động mặc dù , với 55 byte quá. 1-(e<'`')nên (e<'`')-1. Bạn chỉ cần đặt chúng theo thứ tự sai. BTW, bạn ninja tôi: / Tôi đã có cái này
Ông Xcoder

@ Mr.Xcoder cảm ơn vì sự giúp đỡ c:
Rod

2
Lưu hai vớie>x
g.rocket

1
@RootTwo Điều đó ngược lại với hành vi dự định.
LyricLy

9

APL (Dyalog) , 27 26 byte

Mong đợi các ký tự được viết hoa

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

Hãy thử trực tuyến!

Đây chỉ là hai ứng dụng của biểu mẫu f@g, áp dụng chức năng ftrên các mục được chỉ định bởi g.

Đối với những người đầu tiên sử dụng ứng dụng chúng tôi:
f:  ⍒⊃¨⊂ các lớp giảm dần ( ) mỗi lựa chọn ( ⊃¨) từ toàn bộ lập luận ( ).
g:  (e←∊∘⎕A) thành viên ( ) của ( ) A lph.us ( ⎕A) và lưu trữ ( ) chức năng này dưới dạng e.

Cho phần thứ hai sử dụng ứng dụng chúng tôi:
f:  ⍋⊃¨⊂ các lớp tăng dần ( ) mỗi lựa chọn ( ⊃¨) từ toàn bộ lập luận ( ).
g:  (~e) không ( ~) thành viên của bảng chữ cái ( e; chức năng chúng tôi đã lưu trữ trước đó)


Tôi nghĩ rằng điều này cần phải bao gồm tất cả các số nguyên, vì vậy hãy thay thế bộ lọc thứ hai bằng83=⎕DR¨⍵
Uriel

@Uriel Không thực sự có vẻ là một yêu cầu, nhưng đã lưu một byte. Ngoài ra, ⎕DR không phổ biến 83 cho các số, chỉ cho các số nguyên nhỏ.
Adám

nó luôn luôn 3=10|⎕DRcho số nguyên?
Uriel

@Uriel Có: 0 = UnicodeChar, 1 = Boolean, 2 = ClassicChar, 3 = int, 5 = float, 6 = con trỏ, 7 = thập phân, 9 = phức tạp. ⌊0.1×⎕DRcung cấp cho bạn số bit được sử dụng để đại diện cho mỗi vô hướng, ngoại trừ các con trỏ, phụ thuộc vào kiến ​​trúc nhưng luôn luôn là 326. Vì vậy, tất cả các số là 2|⎕DR.
Adám

8

JavaScript (ES6), 71 51 47 byte

Đã lưu 20 byte chỉ bằng cách sử dụng sort(), như được đề xuất bởi @JustinMariner
Đã lưu thêm 4 byte nhờ @CraigAyre

Sử dụng một cách tiếp cận tương tự như câu trả lời Python của Rod :

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

Các trường hợp thử nghiệm


Tôi có thiếu thứ gì không hoặc bạn không thể loại bỏ toàn bộ sortchức năng và chỉ sử dụng sort()riêng? Nó dường như sắp xếp theo cùng một cách mà không có chức năng (trong Chrome / FF / Edge).
Justin Mariner

@JustinMariner Lúc đầu, tôi nghĩ các giá trị số có thể là số - trong trường hợp đơn giản sort()sẽ thất bại. Nhưng vì chúng tôi giới hạn ở các chữ số, bạn đã đúng: điều đó không hiệu quả. Cảm ơn!
Arnauld

1
Giải pháp tuyệt vời, bạn có thể thay đổi / bật trên a.sort()mỗi vòng thay vì gán cho xkhông ?:.map(n=>a.sort()[1/n?'shift':'pop']())
Craig Ayre

@CraigAyre Bắt tốt!
Arnauld

Tôi khá chắc chắn +ncó thể được sử dụng thay vì1/n
Conor O'Brien

5

R , 83 76 byte

-7 byte nhờ Miff

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

Điều này giống như dưới đây, nhưng nó cho phép nhập kiểu hỗn hợp listthay vì một atomicvectơ (sẽ đánh máy mọi thứ dưới dạng các ký tự với các kiểu hỗn hợp).

Hãy thử trực tuyến!

R , 68 61 byte

-7 byte nhờ Miff

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

Chức năng ẩn danh. Tất cả các chữ số được đúc thành ký tự trong trường hợp này. n[-d]là mảng không có chữ số. Trả về NULL(danh sách trống) trên đầu vào trống.

Hãy thử trực tuyến!


Bạn có thể tắt một vài ký tự vớid=n%in%0:9
Miff

4

Japt , 18 15 byte

Cảm ơn @Shaggy cho -3 byte và đã giúp sửa lỗi cho mảng với 0s.


c ñc
®¤?Vv :Vo

Dòng đầu tiên được cố ý để trống.

Hãy thử trực tuyến! sử dụng-Q để xem mảng được định dạng.

Giải trình

Dòng đầu tiên để trống để ghi đè mảng đầu vào.
[5, 'a', 'x', 3, 6, 'b']

c ñc

Tạo một bản sao bằng cách làm phẳng ( c) mảng đầu vào, sau đó sắp xếp ( ñ) với các chuỗi được biểu thị bằng mã char ( c) của chúng. Điều này được lưu trữ trong V.
[3, 5, 6, 'a', 'b', 'x']

£

Sau đó ánh xạ mảng đầu vào theo hàm ...

¤?Vv :Vo

Biến số thành chuỗi nhị phân (trung thực) hoặc chuỗi thành ""(giả) ( ¤). Nếu trung thực, hãy xóa từ đầu V( v), nếu không thì xóa từ cuối ( o).



@Shaggy Nice, thật là thông minh. Cảm ơn!
Justin Mariner

Bạn quên chuyển đổi VoVvxung quanh. Tôi tin chắc rằng phải có một con đường ngắn hơn, không có chim nhạn.
Xù xì

@Shaggy ơi, rất tiếc. Và vâng, chỉ cần ocó thể loại bỏ ngay từ đầu bằng các giá trị âm hoặc một cái gì đó ...
Justin Mariner

4

JavaScript, 164 162 158 142 byte

chỉnh sửa ít hơn 1: 2 byte sau khi loại bỏ phép gán v.

chỉnh sửa 2: 4 byte ít hơn nhờ TheLethalCoder.

chỉnh sửa 3: 16 byte ít hơn nhờ những gợi ý tuyệt vời từ 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")

Đây là lần đầu tiên tôi chơi golf, vì vậy nó chắc chắn có thể được cải thiện ... Nhưng vẫn đáng để thử.

Chương trình thực hiện một biến thể của loại lựa chọn, chỉ tính đến các giá trị cùng loại với loại hiện tại (chỉ hoán đổi một số và một số, hoặc một chữ cái và một chữ cái)

Hình thức dễ đọc:

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;)và loại bỏ sự gia tăng trong vòng lặp bên ngoài.
TheLethalCoder

Chào mừng PPCG quá!
TheLethalCoder

@TheLethalCoder nếu chúng ta tăng bộ đếm sớm như vậy, chúng ta cũng sẽ cần thay đổi các dòng mà tôi và j được sử dụng ... Nhưng ý tưởng thực sự rất thông minh, dù sao tôi cũng sẽ nghĩ cách sử dụng nó.
mackoo13

Bạn có thể tăng jnhư tôi đề nghị, tôi không nhìn thấy bạn sử dụng itiếp tục xuống chỉ cần thay đổi x[i]=x[m]quáx[i++]=x[m]
TheLethalCoder

À, chắc chắn ... Tại sao tôi không nghĩ đến x[i++]=x[m]... Cảm ơn!
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++);}

Hãy thử trực tuyến!

Khó cạnh tranh. Nhưng tôi phải hỗ trợ mảng hỗn hợp? KHỎE.

Chấp nhận một loạt các biến thể trong phong cách phạm vi và sửa đổi nó tại chỗ. Sao chép đầu vào thành hai bộ được sắp xếp, sau đó quay lại mảng đầu vào / đầu ra.


Hay đấy. Tôi sẽ không giải thích "hỗ trợ mảng hỗn hợp" theo cách này. Mặt khác, tôi phải sử dụng một mảng void *trong C;) Nhưng, vâng, thật thú vị khi thấy một giải pháp nhảy qua một cái vòng như vậy.
Felix Palmen

Bạn có thể lưu hai byte bằng cách xóa các khoảng trắng trong #includes
Conor O'Brien

2

Toán học, 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)&


Hãy thử trực tuyến!



2

Bình thường , 12 11 byte

KSQm.(Kt>\@

Hãy thử trực tuyến! hoặc Thử bộ Test.


Giải trình

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

Đợi đã, bạn không cần phải sắp xếp toàn bộ mảng, chỉ cần chia thành hai mảng đồng nhất mà mỗi mảng sẽ dễ dàng sắp xếp. APL không thể sắp xếp các mảng hỗn hợp (nhưng), nhưng tôi sắp xếp từng loại riêng biệt.
Adám

@ Adám Ý bạn là gì khi chỉ chia thành hai mảng đồng nhất mà mỗi mảng có thể dễ dàng sắp xếp ?
Ông Xcoder

Như được mô tả trong "Tiến trình" của OP: 1. Lưu ý các yếu tố nào là số và ký tự nào. 2. Trích xuất tất cả các số thành một mảng riêng và sắp xếp nó. Làm tương tự cho các nhân vật. 3. Đặt số đã sắp xếp trở lại vào các khe số. Làm tương tự cho các nhân vật.
Adám

@ Adám Nếu OP coi điều này không hợp lệ, tôi sẽ thực hiện chính xác những gì bạn đã nói (Điều này sẽ dẫn đến một cách tiếp cận dài hơn nhiều)
Ông Xcoder


2

05AB1E , 17 byte

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

Hãy thử trực tuyến!


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.

Sử dụng đóng cửa sắp xếp thực sự tồi tệ hơn: Σ©Ç®ai0<*}}¹SaJsvyay.;


2

Python 3, 77 byte

Câu trả lời này dựa trên nhận xét nói rằng bạn có thể sử dụng '1', '2', v.v. nếu ký tự và chữ số không thể so sánh được trong ngôn ngữ. 'a' và 1 không thể so sánh trong 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

Dung dịch:

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

Ví dụ:

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

Giải trình:

Tìm các ký tự trong danh sách, sắp xếp giảm dần, tìm các ký tự dài trong danh sách, sắp xếp chúng tăng dần, tham gia để có danh sách, ví dụ: ("x";"b";"a";3;5;6) , sau đó gán các giá trị được sắp xếp trở lại vị trí ban đầu của chúng trong danh sách, ví dụ tại0 3 4 1 2 5 .

Chơi golf chỉ được chuyển ra từ khóa q ( each, wherenot) cho họ ktương đương (mà đòi hỏi họ phải được bao bọc trong dấu ngoặc đơn).

{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

Chỉnh sửa

  • -1 byte vì không cần dấu ngoặc vuông xung quanh 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);}

Hãy thử trực tuyến!

Giải thích:

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

Chữ cái được mong đợi bằng chữ in hoa.


2

PHP, 66 byte:

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

lấy đầu vào từ các đối số dòng lệnh, in một chuỗi. Chạy với -nrhoặc thử trực tuyến .

Đưa ra một cảnh báo trong PHP 7.1; thay thế a&với ""<việc sửa chữa.


1

Toán học, 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++]);}

Số lượng byte cũng bao gồm:

using System.Linq;

Hãy thử trực tuyến!

Giải trình:

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

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}

Hãy thử trực tuyến!

Hẹn giờ đầu tiên ở đây, giải pháp của tôi chắc chắn không phải là tốt nhất. Nhưng vì đây là câu trả lời đầu tiên của tôi, tôi nghĩ rằng trong bài viết chỉ vì niềm vui của nó.

Nhìn về phía trước để thấy câu trả lời của Ruby tốt hơn, để xem đâu là cách tiếp cận tốt nhất. Tôi hy vọng tôi cải thiện trong câu trả lời trong tương lai =)

Có thể đọc được

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

Có thể có những cách ngắn hơn, nhưng tôi chỉ cần thử nó với Lensthư viện.

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

Tôi có thể định nghĩa fchỉ là thành phần của hai cách igọi, nhưng tôi vẫn phải áp dụng xnó để tránh lỗi loại từ hạn chế đơn hình. Lưu ý rằng loại của fnó là Traversable t => t Char -> t Charvì vậy nó có thể được sử dụng với Strings là danh sách của Chars cũng như với các mảng của Chars.

Dưới đây là các trường hợp thử nghiệm:

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

Thí dụ:

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

Điều này sẽ tính tổng số tích lũy của các số nguyên và ký tự và sử dụng nó để tra cứu phần tử chính xác từ danh sách được sắp xếp của các phần tử loại tương ứng.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.