数字をアルファベット順に並べ替えます


24

負でない整数(n)が与えられた場合、nの各数字のリテラルスペルに従って、アルファベット順に戻る関数を作成しますn

例:

Input: 101
>> one, zero, one
>> one, one, zero
Output: 110

Input: 31948
>> three, one, nine, four, eight
>> eight, four, nine, one, three
Output: 84913

Input: 5544
>> five, five, four, four
>> five, five, four, four
Output: 5544

Input: 1234567890
Output: 8549176320

注:この例の操作は例示にすぎず、出力に含める必要はありません。アルファベット順にソートされた番号のみを返す必要があります。

これはコードゴルフなので、バイト単位の最短コードが優先されます。

編集:入力は言語に最適な任意の形式で取得でき、出力は関数から戻るか印刷することで同様に生成できます。入力は常に自然数(0を含む)であり、先頭の0は含まれません。

@DomHastingsによって見つかった関連するOEISエントリ(A057846)


1
数字を文字列として取り、文字列を出力することもできますか?
ThreeFx 16

1
@nimi 00....
TuxCrafting 16

5
あなたは、入力が小数であることを指定したい場合があります、またはあなたが使用して、いくつかの生意気な答えを得るでしょう単項...
マーティン・エンダー

6
これは少し混乱を招きます。コメントの中で、関数の入力および出力として数値型を期待しているが、代わりに結果を出力してもよいと書きました。それで、出力がの場合、文字列ではなく849数値を印刷することが許可されているということですか?IMOこれは非常に厄介なI / O形式です(悪い!)だけでなく、完璧な挑戦です。849"849"
リン

1
先行ゼロが有意かどうか?たとえば、001出力は何ですか?それらが重要で結果がそうでない場合1、ほとんどの言語は単純な事実の入力として文字列を必要とします。それは単純で、実用的でなく、通常、パーサーに10を基数とするリテラル番号の先行ゼロを保持するように依頼することは不可能です。

回答:


12

Perl 6の 32の  28バイト

{+[~] .comb.sort: *.Str.uniname}
{+[~] .comb.sort: *.uniname}

説明:

{
  # turn the following into a Numeric
  +

  # fold the following list using string concatenation operator
  [~]

    # split $_ into individual characters
    # (implicit method call on implicit parameter)
    .comb

    .sort:
    *.uniname # sort by the Unicode name of the character (digit)
}

テスト:

#! /usr/bin/env perl6
use v6.c;
use Test;

my @tests = (
  101 => 110,
  31948 => 84913,
  5544 => 5544,
  1234567890 => 8549176320,
);

# give the lambda a lexical name for clarity
my &int-sort = {+[~] .comb.sort: *.uniname}

plan 3 * @tests;

for @tests -> $_ ( :key($input), :value($expected) ) {
  put '';
  isa-ok $input, Int, "input ($input) is an Int";

  my $output = int-sort $input;

  is $output, $expected, .gist;
  isa-ok $output, Int, "output ($output) is an Int"
}
1..12

ok 1 - input (101) is an Int
ok 2 - 101 => 110
ok 3 - output (110) is an Int

ok 4 - input (31948) is an Int
ok 5 - 31948 => 84913
ok 6 - output (84913) is an Int

ok 7 - input (5544) is an Int
ok 8 - 5544 => 5544
ok 9 - output (5544) is an Int

ok 10 - input (1234567890) is an Int
ok 11 - 1234567890 => 8549176320
ok 12 - output (8549176320) is an Int

8

05AB1E、12 11 10バイト

•OWÿ¾•vy†J

説明した

•OWÿ¾•        # push sortorder (236719458)
      v       # for each number in sortorder
       y†     # filter to the front
         J    # join
              # implicitly print

オンラインで試す

Adnanのおかげで1バイト節約


8

JavaScript(ES6)、54

同じ文字カウントを編集しますが、グローバル変数は避けますz

文字列としての入力/出力

n=>[...n].sort((a,b)=>n[a]-n[b],n='9487216503').join``

テスト

f=n=>[...n].sort((a,b)=>n[a]-n[b],n='9487216503').join``

function test() {
  O.textContent=f(I.value)
}

test()
<input id=I type=number value=31948 oninput='test()'>
<pre id=O></pre>


2
文字列のインデックスとして入力数字を使用して、この愛z...
ドムヘイスティングスに

6

Haskell、62 51 44バイト

@nimiが示唆したように、リスト内包表記の使用は、関数の構成よりも短くなります。

f x=0+read[a|a<-"8549176320",b<-show x,a==b]

参照用に私のバージョン:

f n=read.(=<<)(\x->filter(==x)$show n)$"8549176320"

ポイントフリーバージョンはもう少し長くなります。

f=flip(read.)"8549176320".(=<<).flip(filter.(==)).show

簡単:数字を正しい順序でフィルタリングし、結果を連結します。


5

Pyth、12 10バイト

ox`C" Ȁ\0

さらにゴルフできるかどうかはわかりません。入力は引用符で囲む必要があります。

@isaacgのおかげで2バイト節約されました!

pythonic擬似コードの場合:

                Q = input()
o          Q    sort(Q, key = lambda N:
  `C" Ȁ\0        repr(base256toDec(" Ȁ\0"))
 x        N         .index(N)     # 8 being absent from the number yields -1
                )

ここでテストしてください


@busukxuan 14バイトも取得します:p。
アドナン

その後、@ Adnanは数字に戻ります。それは...これらの数字を圧縮する方法がないようです
busukxuan

2
549176320C" Ȁ\0
-isaacg

@isaacgありがとう!数回ベース256に変換しようとしましたが、結果が間違っていました。どのようにそれを正しくしましたか?
busukxuan

1
nullバイトをに置き換えてエスケープする必要があります\0。それはおそらくあなたが遭遇した問題です。
isaacg

4

Perl、37バイト

36バイトコード+ 1バイトコマンドライン(-F)

say sort{8549176320=~/$b.*$a/||-1}@F

使用例:

echo -n "04823" | perl -F -M5.010 entry.pl


3

ゼリー、11 バイト

“U1°ŀ”OṾf@€

ここで試してみてください。

説明

“U1°ŀ”O       Get the Unicode ordinals of “U1°ŀ”
                (all of which are coincidentally single bytes
                in the Jelly code page!)
              The result is [85, 49, 176, 320].
       Ṿ      Uneval. This gets us the string “85,49,176,320”.
        f@€   For each char in this string, extract all chars
                from the first command line argument that
                equal it.

3

Mathematica 35 78 47バイト

LIAMnYPの提案のおかげで31バイト節約されました!

FromDigits@SortBy[IntegerDigits@#,IntegerName]&

IntegerDigits数字を数字に分割し、数字を英語の名前に従ってソートします。FromDigits数字を基数10の数字に組み立てます。


FromDigits@SortBy[IntegerDigits@#,IntegerName]&[1234567890]

8549176320


「SortBy」を使用すると、単語を数字に変換し直す問題が発生しません。FromDigits@SortBy[IntegerName]@IntegerDigits@#&
LLlAMnYP

またInterpreter、痛々しいほど遅いので、それは追加のボーナスです。
LLlAMnYP

素晴らしい改善。
DavidC

Mtmcaでは、11バイトになります。
マイケルスターン

3

C、142 141 117

パラメータを渡すlong long *f()。関数はパラメーターを変更します。

f(long long*n){char*c="8549176320",g[10]={0};for(;*n;*n/=10)++g[*n%10];for(;*c;++c)for(;g[*c-48]--;*n=*n*10+*c-48);}

long long最後のテストケースがintソートされてオーバーフローしたため、必要です。


2

Python 2-95バイト

def s(n):
    l=list("8549176320")
    return "".join(sorted(list(n),key=lambda x: l.index(x)))

さらにゴルフをしようとしています... 2行目は不要で、1ラムダになる可能性があると思います。

編集:コメントの49文字バージョン、ヘルプのためのxnorとvaultahへのTHX。


lambda n:''.join(sorted(`n`,key="8549176320".find))
vaultah

4
@vaultah素敵なソリューション、投稿してください!-1 8find得られるように、省略できると思います。
XNOR

1
ああ、それは賢い@xnorです。最短でしたがlambda n: "".join(sorted(n,key="549176320".find))、これはあなたが提案したvaultahに非常に似ています。投稿してください!
ジェレミー

1
@Jeremyそのバージョンを投稿に編集する必要があります。
DJMcMayhem

2
少なくとも余分な空白を削除してください...インデントは単一のスペースで行うことができます。また、OPは出力が数値型である必要があると述べているため、これは無効です。
メゴ

2

-Oracle 11(SQL):164バイト

  SELECT LISTAGG(DECODE(s,0,'zero',TO_CHAR(TO_DATE(s,'j'),'jsp')),',')WITHIN GROUP(ORDER BY 1)FROM(SELECT SUBSTR(&1,level,1)s FROM dual CONNECT BY LEVEL<=LENGTH(&1));

長い形式と説明

  SELECT LISTAGG(DECODE(s,0,'zero',TO_CHAR(TO_DATE(s,'j'),'jsp')),',') WITHIN GROUP (ORDER BY 1)
  FROM ( SELECT SUBSTR(&1,level,1)s FROM dual
           CONNECT BY LEVEL <= LENGTH(&1)
        );

スクリプトへのパラメーターとして入力を取得します。

  SELECT &1 FROM dual

入力の長さに基づいて接続を使用して行を「作成」します。

  CONNECT BY LEVEL <= LENGTH(&1)

各位置の文字列から各桁を削除します。

  SELECT SUBSTR(&1,level,1)s FROM dual

数字をユリウス日に変換し、Charに戻してつづりを取得します。

  TO_CHAR(TO_DATE(s,'j'),'jsp')

ゼロのチェック-特別な場合。

  DECODE(s,0,'zero'

LISTAGG関数を使用して、行を連結し、アルファベット順に並べられたコンマ区切りの単一の行リストに戻します

  LISTAGG(DECODE(s,0,'zero',TO_CHAR(TO_DATE(s,'j'),'jsp')),',') WITHIN GROUP (ORDER BY 1)

このようなことのためにSQLを微調整しようとすることは常に楽しい... :)本当に、盗聴者の私の知識をテストします...



1

ラケット、142130バイト

(λ(n)(string->number(list->string(sort(string->list(~a n))char<? #:key(λ(m)(string-ref "9487216503"(-(char->integer m)48)))))))

そのうちの変換は、長さ(76 64バイト)のほぼ半分以上です


(+ 1 answer)ラケット用!

@cat同僚から残されたこれらの恐ろしく手続き型のレガシーJava(およびわずかにレガシーなPython)プログラムに取り組んでいる間、関数型プログラミングの知識を維持する方法であるため、Racketの練習を続けるのに役立ちます。オブジェクトを持っていることでプログラムがオブジェクト指向になるとは限らないことをりましたが、それをする代わりに、ラケットで自分の問題を片付けます。
スティーブンH.

うーん...私は間違いなく同情し、機能的なPythonを書くことは可能かつ楽しいですが、JavaはただのFawfulです。たぶん、上司に、Scalaを実装に使用し、Javaを接着剤として使用できるようにすることができます。:)

ところで、Forthが好きで、Lispを裏返しに読んで目が少し疲れたら、Factorをチェックしてください。これは、LispとCLOSですが、Forth-yの接尾辞と点のない変装です。

1

TSQL、260バイト

長さの参照を回避し、いくつかのバイトを節約するために、逆バブルソートを使用しました

ゴルフ:

DECLARE @ varchar(99)=101

,@i INT=99,@j INT=98WHILE @i>1SELECT
@=IIF(CHARINDEX(x,'598327614')>CHARINDEX(y,'598327614'),STUFF(STUFF(@,@j,1,x),@i,1,y),@),@i-=IIF(@j=1,1,0),@j=IIF(@j=1,@i,@j-1)FROM(SELECT
SUBSTRING(@,@i,1)x,SUBSTRING(@,@j,1)y)z
PRINT @

ゴルフをしていない:

DECLARE @s BIGINT=1234567890

DECLARE @ char(99)=@s,@i INT=99,@j INT=98
WHILE @i>1
  SELECT 
    @=IIF(CHARINDEX(x,'236719458')>CHARINDEX(y,'236719458'),
        STUFF(STUFF(@,@j,1,x),@i,1,y),@), 
    @i-=IIF(@j=1,1,0),
    @j=IIF(@j=1,@i,@j-1)
  FROM(SELECT SUBSTRING(@,@i,1)x,SUBSTRING(@,@j,1)y)z
PRINT CAST(@ as bigint)

入力および出力として整数型を使用することを主張して、37バイトを追加しました


DECLARE @ varchar(99)=1010.oは101自動的に文字列になりますか?

また、stuff客観的にひどい関数名です。squashまたはshovepackより良いでしょう:P-

@catはい、それは自動的に文字列に変換されますが、それはdescriptinoに従って不正です。私は同意します、ものは馬鹿げた名前です
-t-clausen.dk

1
stuffつまり、すべての関数を呼び出すだけでよく、それが関数の動作です。次に、あなたのコードは次のように見ることができますstuff(stuff(4, 5, stuff), stuff(stuff()).(stuff())()); stuff(stuff)

1

ClojureScript、45バイト

#(apply str(sort-by(vec"9487216503")(str %)))

Javascriptリークからのねじれた文字列-> int変換を使用しているため、Clojureは無効です。


1

Firebird、317バイト

ゴルフ:

select list(s,'')from(with recursive q as(select 1 p,substring(:a from 1 for 1)s from rdb$database q union all select q.p+1 p,substring(:a from q.p+1 for 1)s from q where q.p<char_length(:a))select s from q order by iif(s=8,0,iif(s=5,1,iif(s=4,2,iif(s=9,3,iif(s=1,4,iif(s=7,5,iif(s=3,7,iif(s=2,8,iif(s=0,9,6))))))))))

ゴルフをしていない:

select list(s, '')
from (
   with recursive q as (
      select 1 as p, substring(:a from 1 for 1) s
      from rdb$database q
      union all
      select q.p + 1 as p, substring(:a from q.p + 1 for 1) as s
      from q
      where q.p < char_length(:a)
   )
   select s
   from q
   order by iif(s = 8, 0,
               iif(s = 5, 1,
                  iif(s = 4, 2,
                     iif(s = 9, 3,
                        iif(s = 1, 4,
                           iif(s = 7, 5,
                              iif(s = 3, 7,
                                 iif(s = 2, 8,
                                    iif(s = 0, 9, 6)))))))))
)

Firebirdには分割機能はありません。代わりに、次の文字を繰り返し取得する再帰クエリを作成しました。次に、適切な順序で並べ替えながら、それらを再選択します。最後に、これらの結果を連結してリストに戻します。デフォルトのコンマ区切り文字を空白で上書きします。代わりに新しいダミーテーブルを作成することで11バイトを節約できましたrdb$databaseが、それはルールに反する可能性があると考えました。


1

ZX Spectum、マシンコード、53 48 47 45 44バイト

    org 49200 ; #c030

; table converts ascii to alfabetical order
; start from BASIC with any number as : PRINT "1234567890" AND USR 49208

convtab defb 249 ; zero defb 244 ; one defb 248 ; two defb 247 ; three defb 2+205 ; four defb 1+205 ; five defb 246 ; six defb 245 ; seven ; defb 0 ; eight ; defb 3 ; nine ; last 2 conversions hidden in call-command

start Call #2bf1    ; fetch stackindex
    call #2ab2 ; store back
    ld h,#c0    ; set highbyte of table


Sort Push de
loop ld b,d
    ld c,e
    inc de
    ld a,(bc)   ; fetch number
    Ld l,a
    ld a,(de)
    cp 34       ; endmarker "
    Jr z,exit   ; end reached?
    push hl     ; save number
    ld l,a
    Ld a,(hl)   ; convert second number
    pop hl
    cp (hl)     ; compare numbers
    jr nc,loop  ; in order, no swap
swap ld a,(bc)  ; swap original numbers
    ld l,a
    ld a,(de)
    ld (bc),a
    ld a,l
    ld (de),a
Exit pop de
    Ret z
    jr sort     ; check number for order


Gnome-sortを使用すると短縮でき、テーブルを1バイト短くできます。来るべき新バージョン...
ヨハンKoelman

ここでのGnomeソートは長くなりますが、他の最適化です。
ヨハンケルマン16

0

ファクター、128

[ 10 base> [ 48 - ] { } map-as dup [ number>text ] map zip [ second first ] sort-with [ first ] map [ 48 + ] ""map-as 10 >base ]

ビルトインの皆さん :D


0

PHP、126バイト

私が知る限り、phpにはこれを実際に支援する組み込み機能がありません(usort(str_split())を使用してできることは5バイト長くなりました)ので、この答えの中で私が満足しているのはゲームは$ iでプレイし、イタレーションの数バイトを節約しました。

<?php for($i=-1;$i<9;)$a[++$i]=preg_replace("/[^$i]/","",$argv[1]);array_multisort([9,4,8,7,2,1,6,5,0,3],$a);echo implode($a);

0

APL、23バイト

{⍎n['8549176320'⍋n←⍕⍵]}

説明:

  • n←⍕⍵:の文字列表現を取得してn保存するn
  • '8549176320'⍋:順序が与えられたnその種の順列を見つけてください。n8549176320
  • n[... ]nその順列による並べ替え
  • :結果を評価します(数値に戻すため)

I / Oは、文字列の場合もありますので、あなたが削除することができます。を削除{}てに置き換えて、tradfnに変換します。最後に、0リストにないソートとして最後に削除します。n['854917632'⍋n←⍞]
Adám16年

0

Clojure、53バイト

さて、Haskellソリューションからのリスト理解のアイデアは最短のようです:

#(apply str(for[p"8549176320"b(str %):when(= p b)]p))

私の元のアプローチは1バイト長くなっています。

#(apply str(sort-by(zipmap"549176320"(range))(str %)))

ここで両方の機能をオンラインで見ることができます:https : //ideone.com/afac5n


0

Common Lisp、104

(lambda(n)(#1=parse-integer(sort(format()"~A"n)'string<= :key(lambda(u)(format()"~R"(#1#(string u)))))))

非ゴルフ

(lambda (n)
  (parse-integer
   (sort (format nil "~A" n)
         #'string<=
         :key (lambda (u) (format nil "~R" (parse-integer (string u)))))))

整数を文字列に変換し、string<=比較を使用して文字を並べ替え:key、特定の文字をそれが表す数値の英語表現として変換するカスタム関数を使用します。通常、この機能と同じくらいの機能を果たすキー機能は使用しませんが、装飾/ソート/装飾解除よりもバイト単位のコストが低くなります。


0

Python 3、234バイト

これはただの楽しみのために、私のファクターの答えを直接翻訳したものです。

def f(n):
 s=list(map(int,str(n)))
 return int("".join(list(map(str,list(map(lambda x:x[1],sorted(list(zip(list(map(lambda t:{0:"zero",1:"one",2:"two",3:"three",4:"four",5:"five",6:"six",7:"seven",8:"eight",9:"nine"}[t],s)),s)))))))))

「怠lazな」マップおよびzipオブジェクトの評価のセマンティクスは、宇宙で本物の馬の排泄物の中で最も見つけにくいバグを誘発する部分です。時には、適切にまたはまったく使用s = map(f, x)することsを許可しません。




0

Python 2.7.11、67バイト

lambda n:''.join(sorted(list(n),key=lambda s:"9487216503"[int(s)]))

文字列を入力として受け取り、文字列を出力します。


0

Python 3、74バイト

lambda x:''.join(i[1]for i in sorted(['9487216503'[int(j)],j]for j in x))

ラムダを使用していくつかのバイトを保存できる場合があります
ダニエル

0

PHP、107バイト

function($a){usort($a,function($a,$b){return($z=array_flip([8,5,4,9,1,7,6,3,2,0]))[$a]-$z[$b];});return$a;}

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

ユーザー定義の比較関数を使用して、ソート順を調整します。

出力

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