文字が減る一方で数字が増える


23

このStack Overflowの質問に触発された:リストの並べ替え:数字は昇順、文字は降順。あなたの仕事は次の問題を解決することです。これはなので、できる限り少ないバイトで行う必要があります。

:あなたは、文字(任意の合理的な形含む入力として、オブジェクトのリストを取る必要がありstringcharおよび数字など)。次に、数字を昇順で、文字を降順で並べ替える必要があります。ただし、文字は文字の位置に、数字は数字の位置に保持する必要があります。たとえば、リストが次の場合:

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

出力リストの形式は次のとおりです。

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

乗り越えます

入力: ['a', 2, 'b', 1, 'c', 3]

  • 番号を昇順で並べ替えます。 [1, 2, 3]
  • 文字を降順に並べ替えます: ['c', 'b', 'a']
  • それらを元に戻しますが、順序は同じままにします。 ['c', 1', 'b', 2, 'a', 3]

ルール

  • リストには文字と数字のみが含まれます。
  • リストは空かもしれません。
  • リストには、文字のみまたは数字のみを含めることができます。
  • 言語が混合型配列をサポートしていない場合、数字の代わりに数字を使用できます。言語がこれをサポートしている場合は、混合型を使用する必要があることに注意してください。
  • 文字は[a-z]またはのみになり[A-Z]、どちらを選択してもかまいません。
  • 文字はa、最も低いもの、zつまり最も高いものとしてソートされa = 1, z = 26ます。
  • 標準的な抜け穴は禁止されています。
  • I / Oは、文字列としてなど、標準的な手段によるものです。

テストケース

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

これはため、バイト単位の最短回答が勝ちです!


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
マーティン・エンダー

回答:



13

Pythonの253 52バイト

g.rocketのおかげで-2バイトジョナサン・フレッシュのおかげで
-1バイト

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

オンラインでお試しください!

sortedリストは、最初の数字を持つことになり、その後のような文字は[3, 5, 6, 'a', 'b', 'x']、次に使用e<xPythonで、数およびどの文字であるかフィルタに任意の数の少ないリスト(入力)よりも、リストは、以下の文字列よりなります。


このバージョンはで失敗しIndexError: pop index out of rangeます。前者のソリューションは機能しました。
氏Xcoder

ただし、55バイトでも動作します。1-(e<'`')する必要があります(e<'`')-1。あなたはそれらを間違った順序で配置しました。ところで、あなたは私をninja'd:/私が持っていたこの
氏Xcoder

@ Mr.Xcoderヘルプcに感謝:
ロッド

2
で2つ保存e>x
-g.rocket

1
@RootTwoこれは、意図した動作の反対を行います。
LyricLy

9

APL(Dyalog)27 26バイト

文字が大文字であることを期待します

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

オンラインでお試しください!

これはフォームの2つのアプリケーションであり、で示されるアイテムにf@g関数fを適用しますg

最初のアプリケーションでは、以下を使用します。
f:  ⍒⊃¨⊂ 降順のグレード()各⊃¨引数()から各ピック()。
g:  (e←∊∘⎕A) (メンバー)(のAの lphabet( ⎕A)、およびストア()この関数としてe

:我々が使用する第二のアプリケーションの場合
f:  ⍋⊃¨⊂ 昇順グレード()各ピック(⊃¨)全体の引数(から)。
g:  (~e) not(~)アルファベットのメンバー(e;以前に保存した関数)


これはすべての整数をカバーする必要があると思うので、2番目のフィルターを83=⎕DR¨⍵
Uriel

@Urielは実際には要件ではないようですが、バイトを節約しました。また、⎕DRは数値では普遍的に83ではなく、小さな整数の場合のみです。
アダム

それは常に3=10|⎕DR整数ですか?
ウリエル

@Urielはい:0 = UnicodeChar、1 = Boolean、2 = ClassicChar、3 = int、5 = float、6 = pointer、7 = decimal、9 = complex。⌊0.1×⎕DRは、アーキテクチャに依存するが常に326であるポインタを除き、各スカラーを表すために使用されるビット数を提供します2|⎕DR。したがって、すべての数はです。
アダム

8

JavaScript(ES6)、71 51 47バイト

@JustinMarinerがsort()示唆するように、を使用するだけで20バイト
節約@CraigAyreのおかげでさらに4バイトを節約

RodのPythonの答えと同様のアプローチを使用します

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

テストケース


私は何かが足りないのですか、それともsort関数全体を削除してそれだけで使用できませんsort()か?機能なしで同じ方法でソートするようです(Chrome / FF / Edge)。
ジャスティンマリナー

@JustinMariner最初は、数値は数字になる可能性があると思っていました。その場合、単純なものsort()は失敗します。しかし、我々は数字に制限されているので、あなたは正しいです:それは動作します。ありがとう!
アーナウド

1
良い解決策は、a.sort()各ループに割り当てるのではなく、各ループでシフト/ポップしてもらえますxか?:.map(n=>a.sort()[1/n?'shift':'pop']())
クレイグ・エアー

@CraigAyre良いキャッチ!
アーナルド

+n代わりに使用できると確信しています1/n
コナーオブライエン

5

R83 76バイト

Miffのおかげで-7バイト

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

これは以下と同じですが、混合型の入力を許可するのlistではなく、atomicベクトル(これにより、すべてが混合型の文字として型キャストされます)。

オンラインでお試しください!

R68 61バイト

Miffのおかげで-7バイト

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

匿名関数。この場合、すべての数字は文字にキャストされます。n[-d]数字なしの配列です。NULL空の入力で(空のリスト)を返します。

オンラインでお試しください!


いくつかの文字を削ることができますd=n%in%0:9
ミフ

4

ジャプト18 15バイト

@ Shaggy、-3バイト、および0s を使用した配列の修正にご協力いただきありがとうございます。


c ñc
®¤?Vv :Vo

最初の行は意図的に空白のままです。

オンラインでお試しください!を使用-Qして、フォーマットされた配列を表示します。

説明

入力配列の上書きを避けるため、最初の行は空白です。
[5, 'a', 'x', 3, 6, 'b']

c ñc

フラット化してコピーを作成します(c入力配列を)してñ、charコード(c)で表される文字列でソート()します。これはに保存されVます。
[3, 5, 6, 'a', 'b', 'x']

£

次に、関数によって入力配列をマッピングします...

¤?Vv :Vo

数値をバイナリ文字列(真)または文字列""(偽)(¤)に変換します。真実であれば、V(の先頭から削除しますv)削除しoます。そうでなければ、末尾から削除します()。



@シャギーニース、それは本当に賢いです。ありがとう!
ジャスティンマリナー

あなたは、スイッチに忘れてしまったVoし、Vv周り。私は、3項なしで、より短い方法がなければならないと確信しています。
シャギー

@Shaggy Oh、おっと。そして、ええ、ちょうどあればo...負の値か何かで最初から削除することもできます
ジャスティン・マリナー

4

JavaScript、164 162 158 142バイト

編集1:vの冗長な割り当てを削除した後、2バイト少なくなります。

編集2:TheLethalCoderのおかげで4バイト少なくなりました。

編集3:ジャスティン・マリナーからの素晴らしいヒントのおかげで16バイト少ない

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

コードゴルフは初めてなので、確実に改善することができます...しかし、それでも試してみる価値はあります。

プログラムは、選択ソートのバリアントを実行します。これは、現在のタイプと同じタイプの値のみを考慮します(数字と数字、または文字と文字のみを交換します)

読み取り可能なフォーム:

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;)外側のループの増分を削除します。
TheLethalCoder

PPCGもようこそ!
TheLethalCoder

@TheLethalCoderカウンタを早めにインクリメントする場合、iとjが使用されている行も変更する必要があります...しかし、アイデアは本当に賢いので、とにかくそれを利用する方法を考えます。
mackoo13

あなたは、インクリメントすることができj、私が示唆したように、私はあなたが使用して見ていなかった、iダウンだけ変更、さらにx[i]=x[m]あまりにもx[i++]=x[m]
TheLethalCoder

ああ、確かに...なぜ私は考えていなかったx[i++]=x[m]...ありがとう!
mackoo13

3

C ++ 17(gcc)、219バイト

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

オンラインでお試しください!

ほとんど競争力がない。しかし、混合型配列をサポートする必要がありますか?ファイン。

範囲スタイルのバリアントの配列を受け入れ、その場で変更します。入力を2つのソートされたセットにコピーしてから、入力/出力配列に戻します。


これは面白い。私は、「混合型配列のサポート」をこのように解釈しません。そうでなければ、私void *はCの配列を使用する必要があります;)しかし、はい、そのようなフープを飛び越える解決策を見るのは興味深いです。
フェリックスパルメン

#includesのスペースを削除することで2バイトを節約できます
コナーオブライエン



2

Pyth12 11バイト

KSQm.(Kt>\@

オンラインでお試しください!またはテストスイートをお試しください。


説明

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

待ってください。配列全体を並べ替える必要はありません。2つの同種の配列に分割するだけで、それぞれを簡単に並べ替えることができます。APLは混合配列も(まだ)並べ替えることはできませんが、各型を個別に並べ替えます。
アダム

@Adám2 つの同種の配列に分割するだけで、それぞれを簡単に並べ替えることができますか?
ミスターXcoder

OPの「ワークスルー」で説明されているように:1.どの要素が数値で、どの要素が文字であるかを書き留めます。2.すべての数値を個別の配列に抽出し、並べ替えます。文字についても同じことをします。3.ソートされた番号を番号スロットに戻します。文字についても同じことをします。
アダム

アダム@ OPはこれが無効と考えるならば、私はあなたが(これは、はるかに長いアプローチにつながる)と正確に何をします
ミスターXcoder


2

05AB1E、17バイト

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

オンラインでお試しください!


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.

ソートクロージャの使用は実際にはもっと悪かったです。 Σ©Ç®ai0<*}}¹SaJsvyay.;


2

Python 3、77バイト

この回答は、言語で文字と数字が比較できない場合に「1」、「2」などを使用できるというコメントに基づいています。'a'と1は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バイト

溶液:

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

例:

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

説明:

リスト内の文字を検索し、降順でソートし、リスト内のlongを検索し、昇順でソートし、結合してリストを取得します("x";"b";"a";3;5;6)。次に、ソートされた値をリスト内の元の位置に割り当てます0 3 4 1 2 5

ゴルフでは、同等のキーワード(括弧で囲む必要があります)のqキーワード(eachwhereおよびnot)を切り替えるだけkです。

{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

編集

  • 角かっこを必要としないため、-1バイト desc

2

C(GCC) 125の 113 110バイト

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

オンラインでお試しください!

説明:

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

文字は大文字で入力する必要があります。


2

PHP、66バイト:

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

コマンドライン引数から入力を受け取り、文字列を出力します。で実行する-nr、オンラインで試してください

PHP 7.1で警告を生成します。置き換えa&""<修正します。


1

Mathematica、107バイト

(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バイト

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

バイト数には以下も含まれます。

using System.Linq;

オンラインでお試しください!

説明:

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

ルビー、265バイト

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}

オンラインでお試しください!

最初のタイマー、私のソリューションは間違いなく最高のものではありません。しかし、これが私の最初の答えであるので、私はそれの楽しみのためだけに投稿することを考えました。

より良いRubyの答えを見て、最善のアプローチが何であるかを見るために前向きに見てください。今後の回答で改善できることを願っています=)

読みやすい

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バイト

もっと短い方法があるかもしれませんが、私はLensライブラリでそれを試してみました。

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

f2つのi呼び出しの合成であると定義することもできますがx、単相性の制限による型エラーを回避するために、それを適用する必要があります。のタイプはfですTraversable t => t Char -> t CharのでStringCharのリストであるsおよびの配列で使用できることに注意してくださいChar S。

テストケースは次のとおりです。

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

1

Python 3、91バイト

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バイト

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

例:

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

これは、整数と文字の累積合計数を計算し、それを使用して、対応するタイプの要素のソートされたリストから正しい要素を検索します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.