Harfler Azalırken Rakamlar Artar


23

Bu Yığın Taşması sorusundan ilham alan: Liste sıralama: artan sayılar, azalan harfler . Göreviniz aşağıdaki sorunu çözmek ve bu , mümkün olduğu kadar az sayıda yapmalısınız.

Sen girdi harfleri içeren olarak nesnelerin listesini almalı (herhangi bir makul formda: string, char, vs) ve numaraları. Daha sonra sayıları artan düzende ve harfleri azalan düzende sıralamanız gerekir. Ancak, harfleri harf pozisyonlarında ve rakamları sayı pozisyonlarında tutmalısınız. Örneğin, eğer liste:

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

Çıktı listesi şu şekilde olmalıdır:

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

Workthrough

Giriş: ['a', 2, 'b', 1, 'c', 3]

  • Sayıları artan düzende sırala: [1, 2, 3]
  • Harfleri azalan düzende sıralayın: ['c', 'b', 'a']
  • Onlara geri katılın ancak siparişi aynı tutun: ['c', 1', 'b', 2, 'a', 3]

kurallar

  • Liste sadece harfler ve rakamlardan oluşacaktır.
  • Liste boş olabilir.
  • Liste sadece harfler veya sadece rakamlar içerebilir.
  • Eğer dil karışık tip diziler desteklemiyor yerine sayıların basamak karakterleri kullanabilir. Diliniz bunu destekliyorsa, karışık türleri kullanmanız gerektiğini unutmayın.
  • Harfler yalnızca olacak [a-z]veya [A-Z]hangisini seçebileceğinizi seçebilirsiniz.
  • Harfler aen düşük, zen yüksek gibi sıralanır a = 1, z = 26.
  • Standart boşluklar yasaktır.
  • G / Ç, bir dize olarak dahil olmak üzere herhangi bir standart yolla olabilir.

Test durumları

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

Bu olduğundan, bayt cinsinden en kısa cevap kazanır!


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Martin Ender

Yanıtlar:


7

Retina , 10 bayt

O`\d
O^`\D

Çevrimiçi deneyin!

ORetina sahne doğrudan bu meydan gerektirdiği seçici sınıflandırmaya tür gerçekleştirebilir.

Burada ilk satır haneleri sıralarken ikinci satır haneleri tersten sıralar.


13

Python 2 , 53 52 bayt

Jonathan Frech sayesinde g.rocket -1 bayt sayesinde -2 bayt

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

Çevrimiçi deneyin!

sortedListe ilk ve daha sonra karakter gibi numaralar olacaktır [3, 5, 6, 'a', 'b', 'x'], sonra kullanmak e<xhangi sayıyı ve karakter ne olduğu Python her sayıyla bir listesi (giriş) daha ve bir liste daha az bir dize daha filtreye.


Bu sürüm ile başarısız olur IndexError: pop index out of range. Eski çözüm işe yaradı.
Bay Xcoder,

Bu da 55 byte ile çalışıyor . 1-(e<'`')olmalı (e<'`')-1. Onları yanlış sıraya koydun. BTW, beni ninja'd: / ben bu
Sn Xcoder

@ Mr.Xcoder c yardım için teşekkürler:
Rod

2
İki e>x
kere

1
@RootTwo Amaçlanan davranışın tam tersini yapar.
LyricLy,

9

APL (Dyalog) , 27 26 bayt

Karakterlerin büyük harf olmasını bekliyor

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

Çevrimiçi deneyin!

Bu, formun yalnızca iki uygulamasıdır f@g, işlevi fbelirtilen ile belirtilen öğelere uygulayın g.

İlk uygulama biz kullanımda:
f:  ⍒⊃¨⊂ inen sınıflarda ( ) her seçim ( ⊃¨) tüm tartışmadan ( ).
g:  (e←∊∘⎕A) üyeler ( ) ( ), A lphabet ( ⎕A) ve store ( ) olarak bu işlevi kullanır e.

İkinci uygulama biz kullanım için:
f:  ⍋⊃¨⊂ artan sınıflarda ( ) her seçim ( ⊃¨) tüm tartışmadan ( ).
g:  (~e) not ( ~) alfabenin üyeleri ( e; daha önce kaydettiğimiz işlev)


Bunun tüm tamsayıları kapsaması gerektiğini düşünüyorum, bu yüzden ikinci filtreyi 83=⎕DR¨⍵
Uriel

@Uriel Aslında bir zorunluluk gibi görünmüyor, ancak bir bayt kurtardı. Ayrıca, ⎕DR, sadece küçük tamsayılar için sayılar için evrensel olarak 83 değildir.
Adám

her zaman 3=10|⎕DRtamsayılar için mi?
Uriel

@Uriel Evet: 0 = UnicodeChar, 1 = Boolean, 2 = ClassicChar, 3 = int, 5 = şamandıra, 6 = işaretçi, 7 = ondalık, 9 = karmaşık. ⌊0.1×⎕DRMimariye bağlı, ancak her zaman 326 olan işaretçiler dışında, her skalayı temsil etmek için kullanılan bit sayısını verir 2|⎕DR.
Adám

8

JavaScript (ES6), 71 51 47 bayt

@JustinMarinersort() tarafından önerilen şekilde, sadece kullanarak 20 bayt kaydedildi @CraigAyre
sayesinde 4 bayt daha kaydedildi

Rod'un Python cevabına benzer bir yaklaşım kullanarak :

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

Test durumları


Bir şey mi eksik veya tüm sortişlevi kaldıramaz mı ve sadece sort()kendi başına mı kullanamazsın ? İşlevsiz olarak aynı şekilde sıralama yapıyor gibi görünüyor (Chrome / FF / Edge'de).
Justin Mariner,

@JustinMariner İlk önce, sayısal değerlerin sayı olabileceğini düşündüm - bu durumda basit bir işlem sort()başarısız olacaktır. Ancak rakamlarla sınırlı olduğumuz için haklısınız: bu işe yarıyor. Teşekkürler!
Arnauld,

1
Güzel bir çözüm, a.sort()atamak yerine her bir döngüyü değiştirebilir / patlatabilir misiniz x?:.map(n=>a.sort()[1/n?'shift':'pop']())
Craig Ayre

@CraigAyre İyi yakala!
Arnauld,

Ben çok emin değilim +nyerine kullanılabilir1/n
Conor O'Brien

5

R , 83 76 bayt

Miff sayesinde -7 bayt

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

Bu, aşağıdakinin aynısıdır, ancak listbir atomicvektörden ziyade karışık tip giriş yapılmasına izin verir (her şeyi karışık tipte karakterler olarak yazacak).

Çevrimiçi deneyin!

R , 68 61 bayt

Miff sayesinde -7 bayt

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

Anonim işlev Bu durumda tüm rakamlar karakterlere yazılır. n[-d]Rakamsız dizi. NULLBoş girişte döner (boş liste).

Çevrimiçi deneyin!


Birkaç karakter ile tıraş yapabilirsinizd=n%in%0:9
Miff

4

Japt , 18 15 bayt

-3 bayt için @Shaggy ve 0s ile diziler için sabitleme yardım için teşekkürler .


c ñc
®¤?Vv :Vo

İlk satır bilerek boş bırakılmıştır.

Çevrimiçi deneyin! kullanılarak -Qbiçimlendirilmiş bir dizi görüntülemek için kullanılır.

açıklama

İlk satır, giriş dizisinin üzerine yazmaktan kaçınmak için boştur.
[5, 'a', 'x', 3, 6, 'b']

c ñc

cGirdi dizisini düzleştirerek ( ) kopyalayın , ardından ñchar ( c) karakterleriyle gösterilen dizelerle sıralayın ( ). Bu depolanır V.
[3, 5, 6, 'a', 'b', 'x']

£

Sonra giriş dizisini işleviyle eşleştirin ...

¤?Vv :Vo

Sayıları ikili dizelere (truthy) veya dizeleri ""(falsy) ( ¤) dönüştürün. Gerektiğinde V( v) başından çıkarın, aksi takdirde sondan çıkarın ( o).



@Shaggy Nice, bu gerçekten zekice. Teşekkürler!
Justin Mariner,

Sen anahtarı unuttum Vove Vvcivarını. Üçlü olmadan daha kısa bir yol olması gerektiğine ikna oldum.
Shaggy,

@Shaggy Ah, boğmaca. Ve evet, onegatif değerlerle baştan çıkartabilseydi ...
Justin Mariner

4

JavaScript, 164 162 158 142 bayt

gereksiz bir atama kaldırıldıktan sonra 1: 2 bayt daha az düzenleyin.

düzenleme 2: 4 bayt daha az teşekkürler TheLethalCoder.

düzenleme 3: 16 bayt daha az Justin Mariner gelen parlak ipuçları sayesinde

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

Bu benim ilk kez kod-golf benim, bu yüzden kesinlikle geliştirilebilir ... Ama yine de, denemeye değer.

Program, yalnızca geçerli olanla aynı türdeki değerleri hesaba katan bir seçim sıralama çeşidi gerçekleştirir (yalnızca bir sayı ve bir sayı veya bir harf ve bir harf değiştirme)

Okunabilir formu:

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;)ve dış döngüdeki artışı kaldırın.
TheLethalCoder

Çok hoş geldiniz PPCG!
TheLethalCoder

@ TheLethalCoder sayaçları bu kadar erken arttırırsak, ben ve j'nin kullanıldığı satırları da değiştirmemiz gerekecek ... Ama fikir gerçekten akıllı, nasıl kullanılacağını düşüneceğim.
mackoo13

Sen artırmak olabilir jben önerildiği gibi Kullanabileceğin görmedim, iaşağı sadece değiştirmek daha da x[i]=x[m]çokx[i++]=x[m]
TheLethalCoder

Ah, elbette ... Neden düşünmedim x[i++]=x[m]... Teşekkürler!
mackoo13

3

C ++ 17 (gcc) , 219 bayt

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

Çevrimiçi deneyin!

Neredeyse rekabetçi. Fakat karışık tip dizileri desteklemeli miyim? İNCE.

Range tarzındaki bir dizi değişkeni kabul eder ve yerinde değiştirir. Girişi iki sıralı kümeye kopyalar, ardından tekrar giriş / çıkış dizisine kopyalar.


Bu ilginç. “Karışık tipte dizileri desteklemeyi” bu şekilde yorumlamazdım. Aksi takdirde, bir dizi void *C kullanmak zorunda kalırdım ;) Ama, evet, böyle bir çemberin içinden atlayan bir çözüm görmek ilginç.
Felix Palmen

Sen boşluklar kaldırarak iki bayt kaydedebilirsiniz #includes
Conor O'Brien

2

Mathematica, 203 bayt

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


Çevrimiçi deneyin!



2

Pyth , 12 11 bayt

KSQm.(Kt>\@

Çevrimiçi deneyin! veya Test Suite'i deneyin.


açıklama

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

Bekle, tüm diziyi sipariş etmene gerek yok, sadece her birinin kolayca sıralanması gereken iki homojen diziye bölün. APL karışık dizileri de (henüz) sıralayamaz, ancak her türü ayrı ayrı sıralarım.
Adám

@ Adám Sadece her birinin kolayca sıralanabilir olması gereken iki homojen diziye bölünerek ne demek istiyorsunuz ?
Bay Xcoder

OP’nin “Workthrough” bölümünde açıklandığı gibi: 1. Hangi elementlerin nümerik ve hangilerinin karakter olduğunu not alın. 2. Tüm sayıları ayrı bir diziye çıkartın ve sıralayın. Karakterler için de aynısını yapın. 3. Sıralanan numarayı tekrar sayı yuvalarına yerleştirin. Karakterler için de aynısını yapın.
Adám

@ Adám OP bunu geçersiz kabul ederse, söylediğinizi tam olarak yapacağım (Bu çok, çok daha uzun bir yaklaşımla sonuçlanacaktır)
Bay Xcoder

2

Python, 145 139 130 bayt

@Officialaimm sayesinde 6 bayt kurtarıldı

@Chris_Rands sayesinde 9 bayt kaydedildi

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]

Çevrimiçi deneyin!



type(x)==strisinstance(...)sanırım kullanarak bazı baytları kurtaracağım
Chris_Rands

@Chris_Rands teşekkürler!
Uriel

2

05AB1E , 17 bayt

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

Çevrimiçi deneyin!


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ırala kapatmayı kullanmak aslında daha da kötüydü: Σ©Ç®ai0<*}}¹SaJsvyay.;


2

Python 3, 77 bayt

Bu cevap, eğer karakter ve rakamlar dil ile karşılaştırılabilir değilse, '1', '2' vb. Kullanabileceğinizi söyleyen yoruma dayanmaktadır. Python 3'te 'a' ve 1 karşılaştırılamaz.

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 bayt

Çözüm:

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

Örnekler:

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

Açıklama:

Listedeki karakterleri bulun, azalan sıralama, listedeki uzunlukları bulun, artan sıralayın, örneğin bir listeye katılmak için katılın. ("x";"b";"a";3;5;6) , ardından sıralanan değerleri listedeki orijinal konumlarına geri atayın, örn 0 3 4 1 2 5.

Golf sadece eşdeğerleri için q anahtar kelimelerini ( each, whereve not) değiştirir k(bu, parantez içine alınmalarını gerektirir).

{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

Düzenlemeler

  • Etrafında köşeli parantez gerekmediğinden -1 bayt desc

2

C (gcc) , 125 113 110 bayt

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

Çevrimiçi deneyin!

Açıklaması:

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

Harflerin büyük harflerle olması bekleniyor.


2

PHP, 66 bayt:

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

komut satırı argümanlarından girdi alır, bir dizge basar. -nrVeya ile koşÇevrimiçi olarak deneyin .

PHP 7.1'de bir uyarı verir; düzeltmek için a&ile değiştirin ""<.


1

Mathematica, 107 bayt

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

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

Bayt sayısı ayrıca şunları içerir:

using System.Linq;

Çevrimiçi deneyin!

Açıklama:

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 bayt

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}

Çevrimiçi deneyin!

Burada ilk zamanlayıcı, Benim çözümüm kesinlikle en iyisi değil. Ama bu benim ilk cevabım olduğu için, sadece eğlence için göndermeyi düşündüm.

Yakından daha iyi görmek için, en iyi yaklaşımın ne olduğunu görmek için foward arıyorum. Umarım gelecekteki cevaplarda iyileşirim =)

Okunabilir

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 bayt

Daha kısa yollar olabilir, ama sadece Lenskütüphaneyle denemek zorunda kaldım .

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

fSadece iki ibaşvurunun bileşimi olarak tanımlayabilirim , ancak xmonomorfizm kısıtlamasından kaynaklanan bir tür hatadan kaçınmak için yine de başvurmam gerekir. Türü olduğu Not folan Traversable t => t Char -> t Charbu kullanılabilir, böylece Stringlisteleri vardır s Chars yanı sıra ile dizilerChar s.

İşte test durumları:

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

1

Python 3, 91 bayt

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 bayt

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

Örnek:

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

Bu , tamsayıların ve karakterlerin kümülatif toplam sayısını hesaplar ve onu, karşılık gelen türdeki öğelerin sıralı bir listesinden doğru öğeye bakmak için kullanır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.