O primeiro, o último e tudo entre

33

Dados dois números inteiros, produza os dois números inteiros e, em seguida, o intervalo entre eles (excluindo ambos).

A ordem do intervalo deve ser igual à entrada.

Exemplos:

 Input        Output
 0,  5   ->   [0, 5, 1, 2, 3, 4]
-3,  8   ->   [-3, 8, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
 4,  4   ->   [4, 4]
 4,  5   ->   [4, 5]
 8,  2   ->   [8, 2, 7, 6, 5, 4, 3]
-2, -7   ->   [-2, -7, -3, -4, -5, -6]
TFeld
fonte
Acho que não podemos receber as entradas na ordem pré-encomendada?
9118 Kevin KevinMerijssen em
@KevinCruijssen, nenhum, a ordem de saída depende da ordem de entrada
TFeld
@StewieGriffin, a ordem de saída tem de ser a mesma que a entrada
TFeld
É este formato de saída aceitável? Observe a nova linha
Luis Mendo
2
@KevinCruijssen Qualquer E / S razoável é aceitável.
perfil completo de TFeld

Respostas:

14

R , 39 33 30 bytes

c(a<-scan(),setdiff(a:a[2],a))

Experimente online!

Obrigado por bytes salvos em user2390246 e J.Doe.

Kirill L.
fonte
Você pode salvar alguns bytes aceitando a entrada como um vetor e não como dois números inteiros separados.
usar o seguinte comando
Sim, isso é razoável e, na verdade, fica ainda mais curto como um programa completo do que como função.
precisa
Você pode abusar do fato do :operador usa o primeiro elemento de ambos os argumentos para 30 bytes
J.Doe
12

05AB1E , 4 bytes

Ÿ¦¨«

Experimente online!

Explicação

    Ÿ      # inclusive range [a ... b]
     ¦¨    # remove the first and last element
       «   # append to input
Emigna
fonte
12

Python 3 , 52 48 47 42 41 bytes

lambda a,b:[a,b,*range(a,b,-(a>b)|1)[1:]]

Experimente online!


Implementações anteriores combinadas.

cobaltp
fonte
2
Você pode remover o espaço em or-1para salvar um byte.
Kevin Cruijssen
10

Python 2 (Cython) , 36 35 bytes

lambda x:x+range(*x,-cmp(*x)|1)[1:]

Obrigado a @nwellnhof por jogar fora um byte!

Experimente online!


Python 2 , 37 bytes

lambda x:x+range(*x+[-cmp(*x)|1])[1:]

Obrigado a @JonasAusevicius pela porta do CPython!

Experimente online!

Dennis
fonte
2
Isto pode ser aplicado ao padrão do Python 2 a 37 bytes, tornando-se a resposta mais curto ainda: lambda x:x+range(*x+[-cmp(*x)|1])[1:]. Solução agradável
Jonas Ausevicius 8/11
8

Perl 6 , 26 22 bytes

{|@_,|[...^](@_).skip}

Experimente online!

Explicação

{                    }
 |@_,   # Slip args a,b into result
      [...^](@_)  # Reduce args a,b with ...^ operator, same as a...^b
                .skip  # Skip first element
     |  # Slip into result
Nwellnhof
fonte
7

Python 2 , 40 bytes

lambda x,y:[x,y]+range(x,y,-(y<x)|1)[1:]

Experimente online!

Erik, o Outgolfer
fonte
Realmente gosto -(y<x)|1. muito legal, mas não sei por que funciona! Alguma chance de você explicar isso?
ElPedro 8/11
2
@ElPedro Basicamente, y<xverifica se yé estritamente menor que xe retorna True, Falsecaso contrário. Depois disso, unário -é aplicado a ele, que se converte Trueem -1e Falsepara 0. O último passo é OR bit a bit com 1. Obviamente, isso deixa 1( 0b1) não afetado, e também deixa -1( -0b1) não afetado (o bit de sinal -1é definido, portanto é mantido como tal). No entanto, ele se converte 0em 1, para que rangenão se queixe de eu usar um stepdos 0.
Erik the Outgolfer
Isso é muito legal e muito inteligente. Se eu pudesse votar duas vezes, eu faria. Muito obrigado pela explicação.
ElPedro 8/11
6

Python 3, 64 62 51 bytes

lambda a,b:[a,b]+[*range(a+1,b)]+[*range(a-1,b,-1)]

Experimente online!

Python 2, 58 45 bytes

lambda a,b:[a,b]+range(a+1,b)+range(a-1,b,-1)

Experimente online!

Jonas Ausevicius
fonte
2
Porque uma lista vazia é Falsey, você pode remover a a<=b and partir de ambas as respostas
TFeld
Você também pode usar em +vez de #or
TFeld 8/08
@TFeld obrigado
Jonas Ausevicius
Python 3 até 47 bytes:lambda a,b:[a,b,*range(a+1,b),*range(a-1,b,-1)]
mypetlion 14/11
6

Japonês, 8 bytes

cUr!õ kU

Experimente aqui

             :Implicit input of array U
c            :Concatenate
 Ur          :  Reduce U by
   !õ        :   Inclusive range
      kU     :  Remove all elements in original U
Shaggy
fonte
6

JavaScript (ES6), 51 bytes

Toma entrada como (a)(b).

a=>g=(b,c=b)=>(b+=b<a|-(b>a))-a?[...g(b,c),b]:[a,c]

Experimente online!

Comentado

a =>                // main function, taking a
  g = (             // g = recursive function
    b,              //     taking b
    c = b           // we save a backup of the original value of b into c
  ) =>              //
    (b +=           // add to b:
      b < a |       //   +1 if b is less than a
      -(b > a)      //   -1 if b is greater than a
    )               //   (or 0 if b = a)
    - a ?           // if the updated value of b is not equal to a:
      [             //   generate a new array:
        ...g(b, c), //     prepend all values generated by a recursive call
        b           //     append the current value of b
      ]             //
    :               // else:
      [a, c]        //   stop recursion and return the first 2 values: a and c
Arnauld
fonte
6

Python 2 , 47 41 40 bytes

lambda a,b:[a,b]+range(a,b,a<b or-1)[1:]

Experimente online!

Aqui está a minha, agora que muitas outras respostas em Python foram postadas

-6 bytes, graças a GB

TFeld
fonte
Aproveitar o intervalo vazio quando é inválido é uma maneira inteligente de lidar com listas para a frente ou para trás. Pude ver que isso é muito útil e é um bom truque para saber que existe.
akozi
2
41 bytes usando um único intervalo: range (a, b, (a <b) * 2-1)
GB
a<b or-1é mais curto para o parâmetro da 3ª faixa. O mais curto que recebi foilambda x,y:[x,y]+range(x+(x<y or-1),y,x<y or-1)
mbomb007
5

Java 10, 109 108 104 102 93 62 bytes

Usando uma String delimitada por espaço:

b->a->{var r=a+" "+b;for(;a<b?++a<b:--a>b;)r+=" "+a;return r;}

Experimente online.

Usando uma lista:

b->a->{var r=new java.util.Stack();for(r.add(a),r.add(b);a<b?++a<b:--a>b;)r.add(a);return r;}

Experimente online.

( a<b?++a<b:--a>bpode ser ++a<b||(a-=2)>bpara o mesmo número de bytes: experimente online para a String ou experimente online para a Lista .)


Resposta antiga ( 109 108 104 102 101 bytes) usando uma matriz:

a->b->{int s=a<b?1:-1,i=a!=b?(b-a)*s+1:2,r[]=new int[i];for(r[0]=a,r[1]=b;i>2;)r[--i]=b-=s;return r;}

-7 bytes graças a @nwellnhof .

Experimente online.

Explicação:

a->b->{                // Method with 2 int parameters & int-array return-type
  int s=               //  Step integer, starting at:
        a<b?1          //   1 if the first input is smaller than the second
        :-1;           //   -1 otherwise
      i=               //  Array-index integer, starting at:
        a!=b?          //   If the inputs aren't equal:
         (b-a)*s+1     //    Set it to the absolute difference + 1
        :              //   Else:
         2,            //    Set it to 2
      r[]=new int[i];  //  Result-array of that size
  for(r[0]=a,          //  Fill the first value with the first input
      r[1]=b;          //  And the second value with the second input
      i>2;)            //  Loop `i` downwards in the range [`i`,2):
    r[--i]=            //   Decrease `i` by 1 first with `--i`
                       //   Set the `i`'th array-value to:
           b-=s;       //    If the step integer is 1: decrease `b` by 1
                       //    If the step integer is -1: increase `b` by 1
                       //    And set the array-value to this modified `b`
  return r;}           //  Return the result-array
Kevin Cruijssen
fonte
Não há nada na biblioteca padrão do Java para fazer intervalos de números inteiros? Ou é muito detalhado para usar?
Οurous
@ Οurous É realmente muito detalhado: a->b->{var L=java.util.stream.IntStream.range(a,b).boxed().collect(java.util.Collectors.toList());L.add(0,b);L.add(0,a);return L;}(130 bytes)
Kevin Cruijssen
É Java 8 ou Java 10? Por causa de "var" ^^ '
Neyt 9/11/18
1
@Neyt Ah, fixo. Minha versão inicial com a matriz abaixo não usou var, e é por isso que costumo colocá-las em 8, e as que usam varcomo 10 (e as que usam String.repeatcomo 11). :) Esqueceu-se de atualizá-lo após adicionar as respostas Lista e String, deve ser corrigido agora. Obrigado.
9788 Kevin-josijssen em
5

APL (Dyalog Extended) , 5 bytes

Função de infixo anônimo.

,,…~,

Experimente online!

, o primeiro e o último (lit. a concatenação dos argumentos)

, e (lit. concatenado para)

 o alcance

~ sem

, o primeiro e o último (lit. a concatenação dos argumentos)

Adão
fonte
Bom, então eu suponho que você vai usar isso para todos os seus jogos de golfe a partir de agora?
Zachary
@ Zacharý Provavelmente apenas se o código for significativamente mais curto ou mais simples.
Adám 14/11/18
4

Haskell, 34 bytes

a#b=a:b:[a+1..b-1]++[a-1,a-2..b+1]

Experimente online!

nimi
fonte
Isso não funciona. GHC interpreta b-1como b $ (-1). Use em b- 1vez disso.
schuelermine
@ MarkNeu: funciona. Veja o link do TIO.
N
Oh, desculpe! Eu estava NegativeLiteralsusando.
schuelermine
4

Gelatina , 4 bytes

,œ|r

Experimente online!

Como funciona

,œ|r  Main link. Left argument: a. Right argument: b

,     Pair; yield [a, b].
   r  Range; yield [a, ..., b].
 œ|   Perform multiset union.
Dennis
fonte
4

J , 26 bytes

,,[|.@]^:(>{.)<.+1}.i.@|@-

Experimente online!

Explicação:

Um verbo diádico (aceita argumentos à esquerda e à direita)

                         -    subtracts the arguments
                       |@     and finds the absolute value
                    i.@       and makes a list 0..absolute difference
                 1}.          drops the fist element
                +             adds to the entire list
              <.              the smaller of the arguments
   |.@]                       reverses the list
       ^:                     only if
  [                           the left argument
         (>{.)                is greater than the first item of the list
 ,                            appends the list to
,                             the right argument appended to the left one
Galen Ivanov
fonte
1
,,[:}.@}:<.+i.@-@(+*)@-por 23 bytes e nenhuma caixa especial na ordenação relativa de argumentos (em vez disso: está oculta dentro do sinal *). Eu sinto que isso pode diminuir para menos de 20 anos, mas estou cansado.
Jonah
@Jonah Obrigado! A solução da FrownyFrog é muito melhor do que a minha, então não vou jogar mais.
Galen Ivanov
4

Oitava , 45 bytes

@(a,b)[a b linspace(a,b,(t=abs(a-b))+1)(2:t)]

Experimente online!

Luis Mendo
fonte
Se o primeiro é maior do que o segundo, o intervalo deve ser descendente
TFeld
Oh homem, eu não consigo ler
Luis Mendo
Acabei mudando a linguagem
Luis Mendo
4

J , 13 bytes

,,<.+i.@-~-.=

Experimente online!

     i.@-~       range [0 .. |difference|-1], reverse if the difference is positive
          -.=    remove the zero (either "=" is 0 or there’s nothing to remove)
  <.+            to each element add the smaller of the args
,,               prepend args
FrownyFrog
fonte
Ótima solução! Eu esqueci completamente i.com argumento negativo.
Galen Ivanov
1
Isso é lindo!
Jonah
3

Lote, 107 bytes

@echo %1
@echo %2
@for %%s in (1 -1)do @for /l %%i in (%1,%%s,%2)do @if %1 neq %%i if %%i neq %2 echo %%i

Recebe entrada como argumentos da linha de comando. Explicação:

@echo %1
@echo %2

Saída os dois números inteiros.

@for %%s in (1 -1)do

Tente os intervalos ascendente e descendente.

@for /l %%i in (%1,%%s,%2)do

Loop sobre o intervalo inclusivo.

@if %1 neq %%i if %%i neq %2

Exclua os dois números inteiros.

echo %%i

Saída o valor atual.

Neil
fonte
3

Pitão , 5 bytes

+QtrF

Entrada é uma lista de dois elementos [input 1, input 2]. Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .

+QtrFQ   Implicit: Q=eval(input())
         Trailing Q inferred
   rFQ   Generate range [input 1 - input 2)
  t      Discard first element
+Q       Prepend Q
Sok
fonte
Usar em Fvez de .*em listas de 2 elementos é um truque brilhante que eu absolutamente usarei daqui em diante.
hakr14
3

Vermelho , 75 bytes

func[a b][s: sign? d: b - a prin[a b]loop absolute d - s[prin[""a: a + s]]]

Experimente online!

Galen Ivanov
fonte
3

Ruby , 33 40 bytes

->a,b{[a,b]+[*a..b,*a.downto(b)][1..-2]}

Experimente online!

Correção temporária, tentando encontrar uma ideia melhor

GB
fonte
3
Por [4,4]isso dá apenas uma[4]
Kirill L.
Você está certo, eu consertei.
GB
3

Python 2 , 52 47 41 bytes

lambda i,j:[i,j]+range(i,j,(i<j)*2-1)[1:]

Experimente online!

-5 com agradecimentos a @JoKing

-6 cortando o primeiro elemento do intervalo (ideia roubada de e com crédito para @TFeld)

Versão não lambda ...

Python 2 , 51 49 47 bytes

i,j=input();print[i,j]+range(i,j,(i<j)*2-1)[1:]

Experimente online!

-2 com agradecimentos a @JoKing

ElPedro
fonte
3

APL (Dyalog Classic) , 29 bytes

{⍺,⍵,(⌽⍣(⍺>⍵))(⍺⌊⍵)+¯1↓⍳|⍺-⍵}

Experimente online!

Uma porta da minha Jsolução

Galen Ivanov
fonte
Uau, estou surpreso que isso seja tão longo para uma tarefa aparentemente simples.
Quintec 9/11
@ Quintec Provavelmente pode ser jogado, ou talvez outro algoritmo resulte em uma solução muito mais curta.
Galen Ivanov
3

PHP (102 bytes)

function t($a,$b){count($r=range($a,$b))>1?array_splice($r,1,0,array_pop($r)):$r=[$a,$b];print_r($r);}

Caixa de areia

Infelizmente (para o golfe), o PHP tem nomes de funções bastante detalhados, que contribuem muito para o comprimento. Mas a idéia básica é criar um intervalo, depois sair do último elemento e costurá-lo de volta no deslocamento 1. No 4,4exemplo que eu tive que adicionar, o count($r=range($a,$b))>1?...:$r=[$a,$b];que adiciona um pouco, e infelizmente array_splice()é por referência que me atingiu por mais alguns bytes ( $r= and a ;). Tudo por causa desse "caso de ponta", lol.

Bem, de qualquer maneira, aproveite!

ArtisticPhoenix
fonte
Eu não acho que essa seja uma abordagem correta para o código de golfe. Verifique esta opção function t($a,$b){$o=array($a,$b);for($i=$a+1;$i<$b;$i++)$o[]=$i;print_r($o);}
th3pirat3
Ou algo parecido com istofunction t($a,$b){echo $a.$b;for($i=$a+1;$i<$b;$i++)echo $i};
th3pirat3
1
Tem que ser uma função e deve gerar uma matriz. Se você tiver uma resposta melhor, envie-a.
ArtisticPhoenix #:
Eu editei, isso é um envio válido agora? Devo colocá-lo como uma nova resposta ou o quê?
th3pirat3
Isso é inteiramente até você, eu só queria fazê-lo sem um loop ... lol
ArtisticPhoenix
3

Clojure , 61 bytes

(fn[[a b]](def s(if(> a b)-1 1))(list* a b(range(+ a s)b s)))

Uma função anônima que recebe um vetor de 2 como entrada e retorna uma lista.

Experimente online!

Explicação

(fn [[a b]] ; An anonymous function that accepts a 2-vector as input, and destructures it to a and b
  (def s (if (> a b) -1 1)) ; If a > b assigns -1 to s and assigns 1 to s otherwise. This determines the order of the elements of the output list.
  (list* a b ; Creates a list with a and b as the first two elements. The remaining elements will be appended from the following range:
    (range (+ a s) b s))) ; A range starting at a+s and ending at b with step s
TheGreatGeek
fonte
3

D , 85 bytes

T[]f(T)(T a,T b){T[]v=[a,b];T c=2*(b>a)-1;for(T i=a+c;a!=b&&b!=i;i+=c)v~=i;return v;}

Experimente online!

Uma porta da resposta C ++ de @ HatsuPointerKun para D.

Zacharý
fonte
3

TI-BASIC, 35 34 bytes

-1 byte de Misha Lavrov

Prompt A,B
Disp A,B
cos(π(A>B
For(I,A+Ans,B-Ans,Ans
Disp I
End
kamoroso94
fonte
2
E mais um byte, substituindo 1-2(A>Bpor cos(π(A>B.
Misha Lavrov #
@MishaLavrov seq(não iria trabalhar para entradas onde Ae Bsão os mesmos, infelizmente :(
kamoroso94
É verdade - também, deixei de fora uma discussão sobre seq(, então não estou mais convencido de que seja menor. Ainda assim, o cos(truque deve ajudar.
Misha Lavrov
2

Carvão , 15 bytes

IE²NI…⊕θηI⮌…⊕ηθ

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

IE²N

Imprima as entradas em linhas separadas.

I…⊕θη

Imprima o intervalo crescente, se houver.

I⮌…⊕ηθ

Imprima a faixa inversa ascendente inversa, se houver.

Neil
fonte
2

Dardo , 85 84 bytes

f(a,b)=>[a,b]+((a-b).abs()>1?List.generate((a-b).abs()-1,(i)=>(a>b?-i-1:i+1)+a):[]);

Experimente online!

  • -1 passando de >=para>

  • Elcan
    fonte