Переставьте число в алфавитный порядок


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.

Соответствующая запись OEIS (A057846) найдена @DomHastings


1
Могу ли я взять число как строку и вывести строку?
ThreeFx

1
@nimi 00....
TuxCrafting

5
Возможно, вы захотите указать, что ввод в десятичном виде, или вы получите несколько дерзких ответов, используя унарный ...
Мартин Эндер

6
Это немного сбивает с толку: вы написали в комментариях, что ожидаете числовой тип как ввод и вывод функции, но также и то, что вместо этого можно распечатать результат. Итак, если вывод - 849значит ли это, что мы можем печатать число, 849но не строку "849"? IMO, это просто громоздкий формат ввода / вывода (плохой!) На вершине совершенно прекрасной задачи.
Линн

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

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

Пиф, 12 10 байт

ox`C" Ȁ\0

Не уверен, что это может быть в гольфе дальше. Входные данные должны быть заключены в кавычки.

2 байта сохранены благодаря @isaacg!

В питоническом псевдокоде:

                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 байтов : с.
Аднан

@Adnan вернуться к номерам тогда. Кажется, нет способа сжать эти числа ...
busukxuan

2
Сохраните 2 байта, заменив 549176320наC" »Ä\0
isaacg

@isaacg Спасибо! Я пытался преобразовать его в базу 256 несколько раз, но результат был неверным. Как ты сделал это правильно?
Busukxuan

1
Вы должны экранировать нулевые байты, заменив их на \0. Это, вероятно, проблема, с которой вы столкнулись.
Исаак

4

Perl, 37 байт

36-байтовый код + 1-байтовая командная строка (-F)

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

Пример использования:

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

3

MATL , 19 байт

Vt'8549176320'&m2$S

Попробуйте онлайн!

объяснение

V              % Implicitly input number. Convert to string (¹)
t              % Push copy of (¹)
'8549176320'   % Push this string (²), which defines order
&m             % Indices (³) of each element of (¹) in (²)
2$S            % Sort copy of (¹) according to (³). Implicitly display

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 байт

31 байтов сэкономлено благодаря предложению LIAMnYP!

FromDigits@SortBy[IntegerDigits@#,IntegerName]&

IntegerDigitsразбивает номер на цифры, которые затем сортируются в соответствии с их именами на английском языке. FromDigitsсобирает цифры в число base-10.


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

8549176320


С помощью «SortBy» у вас нет проблемы преобразования слов обратно в цифры. FromDigits@SortBy[IntegerName]@IntegerDigits@#&
LLlAMnYP

Также Interpreterмучительно медленно, так что это дополнительный бонус.
LLlAMnYP

Фантастическое улучшение.
DavidC

11 байт в Mtmca, всякий раз, когда это происходит.
Майкл Стерн

3

С 142 141 117

Pass параметр как 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 за помощь.


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

4
@vaultah Хорошее решение, вы должны опубликовать его! Я думаю, что вы можете опустить, 8так что findдает -1.
xnor

1
о, это умно @xnor. Самое короткое, что я получил, было lambda n: "".join(sorted(n,key="549176320".find)), что действительно похоже на то, что вы предложили, vaultah. Вы должны опубликовать это!
Джереми

1
@ Джереми Вы должны отредактировать эту версию в своем посте.
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 в зависимости от длины ввода:

  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 для таких вещей, как это ... :) действительно проверяет мои знания о Bugger ...



1

Ракетка, 142 130 байт

(λ(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 Для меня полезно продолжать практиковать Racket, так как это способ сохранить знания функционального программирования, работая над этими ужасно процедурными унаследованными Java (и немного менее унаследованными Python) программами, оставленными мне моими коллегами. Я мог бы рассуждать о том, что наличие объектов не обязательно делает программу объектно-ориентированной, но вместо этого я просто продолжу играть в свои проблемы в Racket.
Стивен Х.

Хм ... Я определенно сочувствую, и можно и интересно написать функциональный Python, но Java просто Fawful. Может быть, вы можете заставить своих руководителей позволить использовать Scala для реализации, а Java - просто как клей. :)
кот

Кстати, если вам нравится Forth и ваши глаза немного устали от чтения Lisp наизнанку, вы должны проверить Factor , который представляет собой Lisp и CLOS, но в постфиксе Forth-y и маскировке без точек.
кот

1

TSQL, 260 байт

Используется обратная сортировка пузырьков, чтобы избежать ссылки на длину, чтобы сэкономить несколько байтов

Golfed:

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 @

Ungolfed:

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или shoveили packбыло бы лучше: P
кот

@cat Да, он автоматически конвертируется в строку, но это будет обманом в соответствии с описанием. Я согласен, что это глупое имя
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 %)))

Использует некоторые странные преобразования строк-> int из-за утечки Javascript, поэтому это недопустимый Clojure.


1

Жар-птица, 317 байт

Golfed:

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

Ungolfed:

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 байт короче. Новая версия, чтобы прибыть ...
Йохан Кельман

Сортировка гномов здесь длиннее, но другие оптимизации.
Йохан Кельман

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такого родаn заданном порядке 8549176320.
  • n[...] : переупорядочить nпо этой перестановке
  • : оценить результат (превратить его в число)

Поскольку ввод / вывод может быть строкой, вы можете удалить и . Преобразовать в tradfn удаления {и }и подставив для . Наконец, удалите 0как не перечисленные сортировки в конце:n['854917632'⍋n←⍞]
Адам

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

Ungolfed

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

Семантика оценки «ленивых» объектов карт и почтовых индексов является наиболее тонким фрагментом подлинных экскрементов лошади во вселенной. Иногда s = map(f, x)не позволяет sиспользовать должным образом или вообще.



0

C, 80 байтов

Принимает строку, содержащую число в базе 10, и печатает в stdio :

F(char*i){for(char*p,d,*o="8549176320";*o;++o)for(p=i;d=*p++;d-*o||putchar(d));}

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.