Imprima todos os números que aumentam lexicograficamente abaixo de 10000

32

Um número lexicograficamente crescente é um número inteiro cujos dígitos estão estritamente em ordem crescente. Imprima todos os números que aumentam lexicograficamente abaixo de 10000.

Aqui estão as linhas da saída esperada:

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

Este é um desafio de código de golfe! A resposta mais curta vence!

(PS procurando uma solução python)

Varun Patro
fonte
3
precisamos imprimi-los em linhas separadas ou com espaço separado?
21818 Giuseppe
3
Bem-vindo ao PPCG! Bom primeiro desafio. Para desafios futuros, posso recomendar o uso do Sandbox para refinar um desafio e obter um feedback significativo antes de publicá-lo no main.
AdmBorkBork
4
Para expandir a questão de @ Giuseppe, podemos produzir separados por vírgulas, espaços, em formato de matriz [0,1,...], etc. ou devemos produzir cada número em uma linha separada?
ETHproductions
10
Os números precisam estar em uma ordem específica ou apenas precisam existir?
Kamil Drakari #
14
@VarunPatro, atualize o desafio para declarar explicitamente cada número em uma linha separada (embora eu recomende contra esse requisito) e certifique-se de informar todas as soluções existentes que não o fizerem.
Shaggy

Respostas:

30

Python 2 , 56 bytes

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

Experimente online!

Converte cada número como 124uma expressão 1<2<4e o avalia para verificar se os dígitos estão classificados,

Um soluço acontece para números de um dígito, dando uma expressão que é apenas o número em si. Isso faz 0com que seja avaliado um valor de Falsey, mesmo que deva ser impresso. Este é fixado por um truque sugerido por Erik o Outgolfer de fazer **n, o que dá valor truthy 0**0para n=0e não afeta o valor de verdade de outra forma.

xnor
fonte
O que o `faz `n`?
BruceWayne
1
@BruceWayne Leva a representação de string. Isso foi removido no Python 3.
xnor
5
@BruceWayne Observe que é a mesma que a repr()função, não a str()função. Eles nem sempre são os mesmos. Aqui está um exemplo.
mbomb007
1
@ mbomb007 obrigado por esse comentário! Eu teria pensado que era str()equivalente.
BruceWayne
2
Podemos lidar com o caso 0 com um pouco de truque .
Xsot #
12

Python 2 , 55 bytes

i=0
exec"print i\ni+=1\nif eval('<'.join(`i`)):1;"*7000

Experimente online!

xsot
fonte
11

Haskell , 50 bytes

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

Experimente online!

Produz uma cadeia de linhas múltiplas. Verificamos que o número está saumentando usando s==scanl1(max.succ)s, uma variante da verificação de classificação usual s==scanl1 max sque garante classificação estrita, incrementando cada caractere de dígito antes de obter o máximo dele e o próximo dígito.

Ourous salvou um byte usando 6^5como limite superior no lugar de um número de 4 dígitos.

xnor
fonte
8

Geléia , 7 bytes

9ŒPḌḣ⁹Y

Experimente online!

Como funciona

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.
Dennis
fonte
2
Estou tentando descobrir como 0é incluído aqui, mas não conheço Jelly. Estou certo de que o conjunto de potências de Jelly inclui a matriz vazia que é convertida para 0quando "não dizimada"?
Shaggy
1
Sim, é exatamente isso que acontece.
Dennis
8

Japonês -R, 12 11 8 bytes

L²Ç¶ìüÃð

Teste-o

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

* Ou, para oferecer uma explicação melhor: o ümétodo classifica uma matriz e a divide em elementos iguais (por exemplo, [8,4,8,4].ü() -> [[4,4],[8,8]]) e, em seguida, no que parece ser uma peculiaridade estranha e, esperançosamente, não um bug, o ìmétodo, ao converter a matriz novamente em um número, pega o primeiro elemento de cada matriz aninhada, em vez de achatar a matriz, que era o que eu esperava quando tentei esse truque (por exemplo, [[4,4],[8,8]].ì() -> 48).

Shaggy
fonte
1
Agradável. Semelhante ao que eu tinha:L²Ç¥ì ü ¬Ãð
Oliver
2
Eu tenho que dizer, que ütruque vocês usados é genial :-) @Oliver
ETHproductions
1
@ Oliver, você deve ter postado isso enquanto eu estava atualizando; grandes mentes ... :) #
1138 Shaggy
@ETHproductions, como a maioria das coisas, eu tentei por um capricho - espantado que funcione.
Shaggy
6

R , 62 49 bytes

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

Experimente online!

Como combnitera através de sua entrada na ordem fornecida, é fácil criar todos os números inteiros que aumentam lexicograficamente, imprimindo-os em ordem. writeimprime cada inúmero de dois dígitos em linhas de largura i, atendendo perfeitamente aos requisitos da nova linha.

Giuseppe
fonte
ótima idéia para explorar combn!
precisa
Aliasing extremamente inteligente!
J.Doe
6

Perl 6 , 25 bytes

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

-1 byte graças a nwellnhof

Experimente online!

.combproduz uma lista dos dígitos de cada número, e [<]faz um menos do que a redução nessa lista, o equivalente a: digit1 < digit2 <... < digitN .

Sean
fonte
2
[<](.comb)&&.saysalva um byte.
Nwellnhof
Isso é surpreendentemente legível. (Eu já sei um pouco de Perl 6, mas ainda assim ...)
JL
5

Haskell, 56 55 bytes

Edit: -1 byte graças a @Ourous

mapM print$filter(and.(zipWith(<)<*>tail).show)[0..6^5]

Experimente online!

nimi
fonte
5

PowerShell , 42 40 bytes

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

Experimente online!

Loop de 0para 1e4(ou seja, 10000). Puxe os objetos em que |?{...}o número como uma string $_é igual -eqao número convertido toCharArra ye edite sortcom o-u sinalizador nique. Em outras palavras, apenas números iguais às suas seqüências classificadas e deduplicadas. Cada um deles é deixado no pipeline e a saída está implícita.

AdmBorkBork
fonte
4

Pitão , 10 bytes

jiRThc2yS9

Experimente online!

Como funciona

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.
Dennis
fonte
3

J, 26 bytes

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

Experimente online!

explicação

,. (#~ (-: /:~@~.)@":"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
Jonah
fonte
3

Lisp comum , 74 72 bytes

(dotimes(i 7e3)(format(apply'char<(coerce(format()"~d"i)'list))"~d~%"i))

Experimente online!

-2 bytes obrigado a @Shaggy!

Renzo
fonte
3

05AB1E (herdado) , 8 bytes

4°ÝD€êû

Experimente online!

Funciona também na nova versão do 05AB1E, mas é dolorosamente lento por algum motivo.

Quão?

4 ° D - ê - Programa completo.
4 ° - Pressione [0 ... 10000].
   D € ê - Pressione cada número inteiro em [0 ... 10000] classificado e desduplicado ao mesmo tempo.
      Ã »- E junte-se à interseção das duas listas por novas linhas.
Mr. Xcoder
fonte
Boa resposta. Melhor que o 9 byter que eu tinha (que só funciona no legado).
Kevin Cruijssen
2

Python 2 , 64 61 bytes

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

Experimente online!

Obtém os caracteres exclusivos da representação de seqüência de caracteres do número inteiro, os classifica e compara o resultado ao número original.

Triggernometria
fonte
Você pode salvar um byte usando range(9999)ou qualquer outro número entre 6790 e 9999. Nossas soluções são quase idênticos BTW :)
DJMcMayhem
@DJMcMayhem Mas não verificamos TODOS os números abaixo de 10.000 ....: P Obrigado! Às vezes, fico muito literal com esses desafios.
Triggernometry
2

V , 41 bytes

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

Experimente online!

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
fonte
2

Carvão , 19 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

   χ                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
Neil
fonte
2

Geléia , 13 9 8 bytes

Guardado 5 bytes graças a @Dennis

9œcⱮ4ẎŻY

Experimente online!

Explicação

Gera todos os números que aumentam lexicograficamente abaixo de 10000, pegando os dígitos [1 ... 9] e localizando todas as combinações de comprimento ≤ 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.

Geléia , 11 10 9 bytes

Guardou um byte graças a @EriktheOutgolfer

ȷ4Ḷ<ƝẠ$ƇY

Experimente online!

Explicação

Filtra o intervalo, mantendo os números que estão aumentando lexicograficamente.

ȷ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
fonte
2

C # (Compilador interativo do Visual C #) , 102 101 ... 73 bytes

-12 e -4 obrigado @Dennis!

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

Experimente online!

Cada número inteiro de 0 a 7k é testado convertendo-o primeiro em uma string. Aproveitando o fato de o C # tratar seqüências de caracteres como enumeráveis ​​de caracteres e LINQ, uma agregação é calculada para cada caractere enumerável da seguinte maneira:

  • compare o valor acumulado com o caractere atual
  • se o caractere atual for maior que a acumulação, retorne o caractere atual
  • caso contrário, retorne :maior que9

Se o resultado for menor que :, então o número terá dígitos lexicograficamente crescentes.

dana
fonte
O desafio não afirma que todos os números de 0 a 10000 devem ser impressos? Eu tenho certeza que isso imprime os números 0-7000
Modalidade de Ignorância
Eu acredito que o maior número válido é 6789? Isso é menor que 7000, então você não precisa subir mais.
dana
Ah eu vejo. Engane-me
personificação da ignorância
Não é uma tolice :) Eu tenho certeza que o emprestei da resposta de outra pessoa e estava coçando a cabeça por que eles fizeram isso.
dana
2

Wolfram Language (Mathematica) , 36 bytes

Depois que eu escrevi isso, ficou claro que cada número deve estar em uma nova linha, então +7 bytes para o Print/@.

Este método aproveita o fato de que a Subsetsfunção 1) não replica nenhum dígito e 2) classifica a saída por tamanho e conteúdo definidos.FromDigitsmonta cada lista de dígitos.

-1 byte graças a @ Mr.Xcoder

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

Experimente online!

Kelly Lowder
fonte
1
Print/@FromDigits/@Range@9~Subsets~4por 36 bytes.
Mr. Xcoder
Engraçado, eu pensei nisso e simplesmente não fazê-lo porque eu pensei que ~ tinha precedência maior do que @
Kelly Lowder
2

K (ngn / k) / K (oK) , 32 30 26 bytes

Solução:

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

Experimente online!

Explicação:

`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
rua
fonte
2

JavaScript REPL, 64 bytes

Um pouco de pub pub provavelmente tão longe de ser o ideal.

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

Experimente online

Sim, fazê-lo sem um IIFE seria alguns bytes mais curto, mas isso gera um erro de estouro quando chamado, o que normalmente seria bom, pois podemos assumir memória infinita para fins de código golf, mas, para mim, não parece ser no espírito dos desafios da KC.

Shaggy
fonte
Não recebo um erro de estouro sem um IIFE.
Spitemaster
Este é um envio de função ou um programa completo? Caso contrário, você deve contar console.logou redefinir o seu envio como JavaScript REPL .
Dennis
2

C (gcc) , 97 89 81 bytes

Graças a ceilingcat por -8 bytes.

Mais -8 graças a Dennis

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

Experimente online!

gastropner
fonte
81 bytes
Dennis
não vai atualizar isso?
somente ASCII
@ Somente ASCII Concluído. Desculpe se essa supervisão o incomodou.
gastropner 11/03
1

Geléia , 7 bytes

<ƝẠ$⁹#Y

Experimente online!

Quão?

<ƝẠ$⁹#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
Jonathan Allan
fonte
1

MATLAB, 52 bytes

arrayfun(@(n)disp(n(all(diff(num2str(n))>0))),0:1e4)
Luis Mendo
fonte