Распечатать все лексикографически увеличивающиеся числа до 10000

32

Лексикографически возрастающее число - это целое число, цифры которого расположены в строго возрастающем порядке. Выведите все лексикографически возрастающие числа до 10000.

Вот строки ожидаемого результата:

0
1
2
3
4
5
6
7
8
9
12
13
14
15
16
17
18
19
23
24
25
26
27
28
29
34
35
36
37
38
39
45
46
47
48
49
56
57
58
59
67
68
69
78
79
89
123
124
125
126
127
128
129
134
135
136
137
138
139
145
146
147
148
149
156
157
158
159
167
168
169
178
179
189
234
235
236
237
238
239
245
246
247
248
249
256
257
258
259
267
268
269
278
279
289
345
346
347
348
349
356
357
358
359
367
368
369
378
379
389
456
457
458
459
467
468
469
478
479
489
567
568
569
578
579
589
678
679
689
789
1234
1235
1236
1237
1238
1239
1245
1246
1247
1248
1249
1256
1257
1258
1259
1267
1268
1269
1278
1279
1289
1345
1346
1347
1348
1349
1356
1357
1358
1359
1367
1368
1369
1378
1379
1389
1456
1457
1458
1459
1467
1468
1469
1478
1479
1489
1567
1568
1569
1578
1579
1589
1678
1679
1689
1789
2345
2346
2347
2348
2349
2356
2357
2358
2359
2367
2368
2369
2378
2379
2389
2456
2457
2458
2459
2467
2468
2469
2478
2479
2489
2567
2568
2569
2578
2579
2589
2678
2679
2689
2789
3456
3457
3458
3459
3467
3468
3469
3478
3479
3489
3567
3568
3569
3578
3579
3589
3678
3679
3689
3789
4567
4568
4569
4578
4579
4589
4678
4679
4689
4789
5678
5679
5689
5789
6789

Это кодовый вызов для гольфа! Кратчайший ответ выигрывает!

(PS ищет решение Python)

Варун Патро
источник
3
нужно ли печатать их на отдельных строках или все в порядке?
Джузеппе
3
Добро пожаловать в PPCG! Хороший первый вызов. Для будущих задач я могу порекомендовать использовать Песочницу для уточнения задачи и получения значимой обратной связи, прежде чем отправлять ее на главную.
AdmBorkBork
4
Чтобы расширить вопрос @ Джузеппе, можем ли мы вывести разделенные запятыми, пробелами, в формате массива [0,1,...]и т. Д. Или мы должны вывести каждое число в отдельной строке?
ETHproductions
10
Числа должны быть в определенном порядке, или они просто должны существовать?
Камил Дракари
14
@VarunPatro, пожалуйста, обновите задачу, чтобы явно указать, что каждое число указано на отдельной строке (хотя я бы рекомендовал против этого требования), и обязательно сообщите о любых существующих решениях, которые этого не делают.
лохматый

Ответы:

30

Python 2 , 56 байт

for n in range(9999):
 if eval('<'.join(`n`))**n:print n

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

Преобразует каждое число, как 124в выражение, 1<2<4и оценивает его, чтобы проверить, отсортированы ли цифры,

Сбой происходит для однозначных чисел, дающих выражение, которое просто является самим числом. Это приводит 0к значению Falsey, даже если оно должно быть напечатано. Это фиксируется трюк , предложенный Эриком Outgolfer делать **n, что дает truthy значение 0**0для n=0и не влияет на значение истинности иначе.

XNOR
источник
Что делает `в `n`?
Брюс Уэйн
1
@BruceWayne Требуется строковое представление. Это было удалено в Python 3.
xnor
5
@BruceWayne Обратите внимание, что это то же самое, что и repr()функция, а не str()функция. Они не всегда одинаковы. Вот пример.
mbomb007
1
@ mbomb007 спасибо за этот комментарий! Я бы подумал, что это str()эквивалентно.
Брюс Уэйн
2
Мы можем обработать случай 0 с небольшим количеством хитрости .
xsot
11

Haskell , 50 байтов

unlines[s|s<-show<$>[0..6^5],s==scanl1(max.succ)s]

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

Выводит многострочную строку. Мы проверяем, что число sувеличивается с s==scanl1(max.succ)sпомощью варианта обычной проверки сортировки, s==scanl1 max sкоторая обеспечивает строгую сортировку, увеличивая каждый символ цифры перед тем, как взять максимум из него и следующую цифру.

Ourous сохранил байт, используя 6^5в качестве верхней границы вместо 4-значного числа.

XNOR
источник
8

Желе , 7 байт

9ŒPḌḣ⁹Y

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

Как это работает

9ŒPḌḣ⁹Y  Main link. No arguments.

9        Set the return value to 9.
 ŒP      Powerset; promote 9 to [1, ..., 9] and generate all subsets.
   Ḍ     Undecimal; map the subsets of digits to the integers they represent.
     ⁹   Yield 256.
    ḣ    Dyadic head; take the first 256 elements of the integer list.
      Y  Separate the result by linefeeds.
Деннис
источник
2
Я пытаюсь понять, как 0сюда включается, но я не знаю, Джелли. Правильно ли я понимаю, что блок питания Jelly включает в себя пустой массив, который затем преобразуется в 0"undecimaled"?
Лохматый
1
Да, именно так и происходит.
Деннис
8

Japt -R, 12 11 8 байт

L²Ç¶ìüÃð

Попробуй это

L            :100
 ²           :Squared
  Ç          :Map the range [0,L²)
    ì        :  Split to a digit array
     ü       :  For the sake of simplicity*, let's say: Sort & deduplicate
             :  Implicitly rejoin to an integer
   ¶         :  Test for equality with original number
      Ã      :End map
       ð     :Get 0-based indices of truthy elements
             :Implicitly join with newlines and output

* Или, чтобы предложить лучшее объяснение: ü метод сортирует массив и разбивает его на равные элементы (например, [8,4,8,4].ü() -> [[4,4],[8,8]]), а затем, что кажется странным, и, надеюсь, не ошибкой, ìметод, при преобразовании массива обратно в число, берет первый элемент каждого вложенного массива, а не сначала выравнивает массив, что я и ожидал, когда попробовал этот трюк (например, [[4,4],[8,8]].ì() -> 48).

мохнатый
источник
1
Ницца. Похоже на то, что у меня было:L²Ç¥ì ü ¬Ãð
Оливер
2
Я должен сказать, что üуловка , которую вы, ребята, использовали, гениальна :-) @Oliver
ETHproductions
1
@ Оливер, ты должен был опубликовать это, когда я обновлялся; великие умы ... :)
Лохматый
@ETHproductions, как и большинство вещей, я попробовал по прихоти - поражен, что это работает.
лохматый
6

Р , 62 49 байт

`[`=write;0[1];for(i in 1:4)combn(1:9,i)[1,i,,""]

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

Поскольку combnитерации по вводу в указанном порядке, легко создать все лексикографически увеличивающиеся целые числа, распечатывая их по порядку. writeпечатает их каждый i-значный номер в строках ширины i, аккуратно выполняя требование новой строки.

Giuseppe
источник
отличная идея эксплуатации combn!
digEmAll
Очень умный псевдоним!
J.Doe
6

Perl 6 , 25 байт

[<](.comb)&&.say for ^1e4

-1 байт благодаря nwellnhof

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

.combсоздает список цифр каждого номера и [<]делает меньше, чем сокращение в этом списке, эквивалентно: digit1 < digit2 <... < digitN .

Шон
источник
2
[<](.comb)&&.sayсохраняет байт.
nwellnhof
Это на удивление читабельно. (Я уже немного знаю Perl 6, но все же ...)
JL
5

PowerShell , 42 40 байт

0..1e4|?{-join("$_"|% t*y|sort -u)-eq$_}

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

Цикл от 0до 1e4(т. Е. 10000). Вытащите те объекты, где |?{...}число в виде строки $_равно -eqчислу, приведенному toCharArra, yа затем редактируйте sortс помощью-u флагом nique. Другими словами, только числа, которые совпадают с их отсортированными и дедуплицированными строками. Каждый из них остается на конвейере и вывод неявный.

AdmBorkBork
источник
4

Pyth , 10 байт

jiRThc2yS9

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

Как это работает

jiRThc2yS9
        S9  Yield [1, 2, 3, 4, 5, 6, 7, 8, 9].
       y    Take all 512 subsets.
     c2     Split the array of subsets into 2 pieces (256 subsets each).
    h       Head; take the first piece.
 iRT        Convert each subset from base 10 to integer.
j           Separate by newlines.
Деннис
источник
3

J, 26 байт

,.(#~(-:/:~@~.)@":"0)i.1e4

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

объяснение

,. (#~ (-: /:~@~.)@":"0) i.1e4
                         i.1e4  NB. list 0 to 9999
                     "0         NB. for each number in the input list
                  @":"0         NB. convert it to a string and
   (#~ (         )              NB. remove any not passing this test:
        -:                      NB. the string of digits matches
              @~.               NB. the nub of the digits (dups removed)
           /:~                  NB. sorted
,.                              NB. ravel items: take the result of all that
                                NB. and turn it into a big column
Ион
источник
3

05AB1E (наследие) , 8 байтов

4°ÝD€êû

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

Работает и в новой версии 05AB1E, но почему-то мучительно медленно.

Как?

4 ° С »- Полная программа.
4 ° Ý - Нажмите [0 ... 10000].
   D € ê - нажмите каждое целое число в [0 ... 10000], отсортировав и дедуплицировав одновременно.
      Ã »- и присоедините взаимодействие двух списков к новой строке.
Мистер Xcoder
источник
Хороший ответ. Лучше, чем у меня был 9 байт (который работает только в наследство).
Кевин Круйссен,
2

Python 2 , 64 61 байт

lambda:[x for x in range(9999)if sorted(set(`x`))==list(`x`)]

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

Получает уникальные символы строкового представления целого числа, сортирует их и сравнивает результат с исходным числом.

Triggernometry
источник
Вы можете сохранить байт, используя range(9999)любой другой номер от 6790 до 9999. Кстати, наши решения практически идентичны :)
DJMcMayhem
@DJMcMayhem Но тогда он не будет проверять ВСЕ номера до 10000 ....: P Спасибо! Иногда я становлюсь слишком буквальным с этими проблемами.
Триггонометрия
2

V , 41 байт

7000ïÎaÛ
Îy$úúP
Ç^¨ä*©±$/d
ÎãlD
爱/d
HO0

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

HexDump:

00000000: 3730 3030 efce 61db 0ace 7924 fafa 500a  7000..a...y$..P.
00000010: c75e a8e4 2aa9 b124 2f64 0ace e36c 440a  .^..*..$/d...lD.
00000020: e788 b12f 640a 484f 30                   .../d.HO0
DJMcMayhem
источник
2

Древесный уголь , 19 байт

ΦEXχ⁴Iι¬Φι∧쬋§ι⊖μλ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

   χ                Predefined variable 10
  X                 To the power
    ⁴               Literal 4
 E                  Map over implicit range
      ι             Current value
     I              Cast to string
Φ                   Filter over strings where
         ι          Current string
        Φ           Filtered over characters
           μ        Character index (is nonzero)
          ∧         And
                 μ  Character index
                ⊖   Decremented
              §     Indexed into
               ι    Current string
            ¬       Is not
             ‹      Less than
                  λ Current character
       ¬            Results in an empty string
                    Implicitly print matches on separate lines
Нил
источник
2

Желе , 13 9 8 байт

Сохранено 5 байтов благодаря @Dennis

9œcⱮ4ẎŻY

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

объяснение

Генерирует все лексикографически увеличивающиеся числа ниже 10000, беря цифры [1 ... 9] и находя все комбинации длины ≤ 4.

9œcⱮ4ẎŻY    Main link. Arguments: none
9           Yield 9.
   Ɱ4       For each n in [1...4]:
 œc           Yield the combinations of the range [1...9] of length n.
     Ẏ      Tighten; dump each of the 4 lists generated into the main list.
      Ż     Prepend a 0 to the list.
       Y    Join on newlines.

Желе , 11 10 9 байт

Сохраненный байт благодаря @EriktheOutgolfer

ȷ4Ḷ<ƝẠ$ƇY

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

объяснение

Фильтрует через диапазон, сохраняя лексикографически увеличивающиеся числа.

ȷ4Ḷ<ƝẠ$ƇY    Main link. Arguments: none
ȷ4           Yield 10^4 (10000).
  Ḷ          Generate the range [0...10000).
       Ƈ     Filter; yield only the numbers where this link return a truthy value.
      $        Run these two links and yield the result.
    Ɲ            For each pair of items (digits) in the number:
   <               Check whether the left digit is less than the right digit.
     Ạ           All; check that every comparison yielded true.
               This yields whether the digits are strictly increasing.
        Y    Join the filtered list on newlines.
ETHproductions
источник
2

C # (интерактивный компилятор Visual C #) , 102 101 ... 73 байта

-12 и -4 спасибо @ Денис!

for(var i=0;i<7e3;i++)if((i+"").Aggregate((a,b)=>a<b?b:':')<':')Print(i);

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

Каждое целое число от 0 до 7к проверяется сначала преобразованием его в строку. Используя тот факт, что C # обрабатывает строки как перечисляемые символы, а LINQ, для каждого перечисляемого символа вычисляется агрегат следующим образом:

  • сравнить накопленное значение с текущим символом
  • если текущий символ больше, чем накопление, вернуть текущий символ
  • в противном случае возврат, :который больше, чем9

Если результат этого меньше чем :, то число имеет лексикографически увеличивающиеся цифры.

Dana
источник
Разве в заявке не указано, что все цифры от 0 до 10000 должны быть напечатаны? Я уверен, что это печатает числа 0-7000
Воплощение Невежества
Я считаю, что наибольшее действительное число 6789? Это меньше, чем 7000, поэтому вам не нужно идти выше.
Дана
А ну понятно. Обмани меня
Воплощение Невежества
Совсем не глупо :) Я почти уверен, что позаимствовал это у чужого ответа и почесал голову, почему они это сделали.
Дана
2

Wolfram Language (Mathematica) , 36 байт

После того, как я написал это, выяснилось, что каждое число должно быть в новой строке, поэтому +7 байтов для Print/@.

Этот метод использует тот факт, что Subsetsфункция 1) не копирует никаких цифр и 2) сортирует выходные данные по заданному размеру и заданному содержимому. FromDigitsсобирает каждый список цифр.

-1 байт благодаря @ Mr.Xcoder

Print/@FromDigits/@Range@9~Subsets~4

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

Келли Лоудер
источник
1
Print/@FromDigits/@Range@9~Subsets~4для 36 байтов.
г-н Xcoder
Забавно, я думал об этом и просто не делал этого, потому что я думал, что ~ имел более высокий приоритет, чем @
Келли Лоудер
2

K (нгн / к) / K (ок) , 32 30 26 байт

Решение:

`0:$&&/'1_'>':'" ",'$!9999

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

Объяснение:

`0:$&&/'1_'>':'" ",'$!9999 / the solution
                     !9999 / range 0..9998 (could use !6890)
                    $      / string
               " ",'       / prepend " " to each (lower than "0" in ascii)
            >:'            / greater-than each-previous?
         1_'               / drop first result from each
      &/'                  / max (&) over (/)
    &                      / indices where true
   $                       / convert to string
`0:                        / print to stdout
streetster
источник
2

JavaScript REPL, 64 байта

Немного паб-гольф, так что, вероятно, далеко от оптимального.

(f=n=>n&&f(n-1)+([...n+``].every(x=>y<(y=x),y=0)?`
`+n:``))(7e3)

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

Да, выполнение без IIFE было бы на несколько байтов короче, но это вызывает ошибку переполнения при вызове, что, как правило, было бы хорошо, поскольку мы можем предполагать бесконечную память для целей гольф-кода, но, мне кажется, это не так. в духе проблем КЦ.

мохнатый
источник
Я не получаю ошибку переполнения без IIFE.
Spitemaster
Это представление функции или полная программа? Если нет, то вы должны либо считать, console.logлибо перемаркировать свое представление как REPL JavaScript .
Деннис
2

C (gcc) , 97 89 81 байт

Благодаря потолку кошки за -8 байт.

Еще -8 благодаря Денису

g(n){n=!n||n/10%10<n%10&&g(n/10);}f(i){for(i=-1;++i<7e3;g(i)&&printf("%u\n",i));}

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

gastropner
источник
81 байт
Денис
не собираешься обновлять это?
Только для ASCII
@ Только для ASCII Готово. Извините, если этот недосмотр вас расстроил.
Гастропнер
1

Желе , 7 байт

<ƝẠ$⁹#Y

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

Как?

<ƝẠ$⁹#Y - Main Link: no arguments (implicit z=0)
    ⁹   - literal 256
     #  - count up from n=z (0) finding the first 256 for which this is truthy:
   $    -   last two links as a monad:
 Ɲ      -     neighbours (implicitly gets digits of n):
<       -       less than?
  Ạ     -     all truthy? (N.B. yields 1 for an empty list)
      Y - join with newlines
Джонатан Аллан
источник
1

MATLAB, 52 байта

arrayfun(@(n)disp(n(all(diff(num2str(n))>0))),0:1e4)
Луис Мендо
источник