Gamas flutuantes


19

Dada uma lista com número, produza os intervalos como este:

Entrada: [0, 5, 0]se tornaria [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0].

Isso está mapeando um intervalo através da matriz, portanto, primeiro precisamos criar o intervalo [0, 5], o que é [0, 1, 2, 3, 4, 5]. Depois disso, usamos o 5para criar o intervalo [5, 0]. Anexado no nosso intervalo anterior, isso nos dá:

[0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0]

Vamos observar um caso de teste com dois mesmos dígitos um ao lado do outro:

[3, 5, 5, 3], ranges:

[3, 5] = 3, 4, 5
[5, 5] = 5 (actually [5, 5] due to overlapping)
[5, 3] = 5, 4, 3

Então isso nos daria [3, 4, 5, 5, 4, 3].

Alguns outros casos de teste:

[1, 9] > [1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, -10] > [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10]
[3, 0, 0, -3] > [3, 2, 1, 0, 0, -1, -2, -3]
[1, 3, 5, 7, 5, 3, 1, -1, -3] > [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3]

A entrada sempre terá pelo menos 2 números inteiros.

A resposta mais curta vence!



11
De que maneira as entradas e saídas estão relacionadas? O que constitui uma entrada válida?
flawr

Respostas:


21

05AB1E, 1 byte

Ÿ

Experimente online!

Como funciona

É um built-in.


18
Você tem um dicionário de todos os recursos internos em todos os idiomas em sua cabeça ou o quê? ;)
ETHproductions

2
Bem, obrigado por usar osabie: P
Adnan

7
Por que ele tem um built-in para isso?
Neil

Deve haver uma compilação de todos os programas de 0byte e 1byte (talvez até 2byte) que fazem coisas.
CalculatorFeline

2
@ Neil É basicamente uma função de faixa inclusiva, realmente não é tão espetacular.
Adnan

5

Javascript, 99 95 93 bytes

4 6 bytes de desconto, graças à @ Neil .

a=>a.reduce((x,y)=>x.concat(b.map?b=y:[...Array(y<b?b-y:y-b||1)].map(_=>b+=y<b?-1:y>b)),b=[])

f=
a=>a.reduce(
    (x,y)=>
        x.concat(
            b.map?b=y
            :[...Array(y<b?b-y:y-b||1)]
                .map(_=>b+=y<b?-1:y>b)
        )
    ,b=[])


G.addEventListener('click',_=>O.innerHTML=f(JSON.parse(I.value)));
<input id=I value="[3,5,5,3]"><button id=G>Go</button><pre id=O>


11
Salve 3 bytes usando y<b?b-y:y-b||1. Salve outro byte usando y>b||y-b&&-1.
Neil

@Neil. Bons!! Obrigado :)
removido

11
Na verdade y<b?-1:y>bé melhor ainda.
Neil

5

JavaScript (SpiderMonkey 30+), 81 76 bytes

([n,...a])=>[n,...[for(i of a)for(j of Array(i<n?n-i:i-n||1))n+=i<n?-1:i>n]]

Testado no Firefox 44. Usa os incríveis recursos de destruição de argumentos do ES6 e as compreensões de matriz do ES7 (que infelizmente foram removidas das especificações do ES7).


Não funciona [3, 0, 0, -3]. Corrigi o RangeError e salvei 10 bytes, mas ele ainda não funciona:([n,...a],z=[n])=>z.concat([for(i of a)for(j of[...Array((r=n<i)?i-n-1:n-i-1),0])i=r?++n:--n])
Neil

Desculpe, eu quis dizer, é ([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n])claro.
305 Neil

@Neil fixo, com um grupo mais golfed fora no processo
ETHproductions

4

JavaScript (ES6) 66 72

Uma função recursiva que adiciona repetidamente valores dentro da matriz para preencher as lacunas entre números próximos

f=l=>l.some((x,i)=>(z=l[i-1]-x)*z>1&&l.splice(i,0,x+z/2|0))?f(l):l

Teste

f=l=>l.some((x,i)=>(z=l[i-1]-x)*z>1&&l.splice(i,0,x+z/2|0))?f(l):l

console.log=x=>O.textContent+=x+'\n'

;[[1,9],[10,-10],[3,0,0,-3],[1, 3, 5, 7, 5, 3, 1, -1, -3]]
.forEach(t=>console.log(t+' -> ' +f(t)))
<pre id=O></pre>


3

C, 120 + 12 = 132 bytes

i,j,k;f(a,n)int*a;{a[0]--;for(i=0;i<n-1;i++)for(k=0,j=a[i]-a[i+1]?a[i]:a[i]-1;j-a[i+1];)printf("%i ",j+=a[i+1]>j?1:-1);}

Chamada de exemplo:

f(a,sizeof(a)/4);        // I've added 12 bytes because of ",sizeof(a)/4"

Teste ao vivo em ideone .


3

Python 2, 77 bytes

lambda n:n[0:1]+sum([range(x,y,2*(y>x)-1)[1:]+[y]for(x,y)in zip(n,n[1:])],[])

Experimente online

Agradeço a Neil, DenkerAffe e Erwan por apontar melhorias que eu perdi


Certamente o +1é desnecessário?
Neil

por que não ir com lambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])? salva alguns bytes.
Denker

Eu estava muito cansado enquanto escrevia isso :) Responda primeiro, melhore depois.
Mego

eu acho que você pode substituir [1,-1][y+1<x]por 2*(y>x)-1(também eu não entendo por que você usa y<=x e não simplesmente y<x)
Erwan

n[0:1]é equivalente a n[:1].
22616 Jonathan Frech #

3

Perl, 47 bytes

Inclui +3 para -p(o código contém, $'portanto, espaço e- conta também)

Dê a lista de números no STDIN:

fluctuating.pl <<< "3 5 5 3"

fluctuating.pl:

#!/usr/bin/perl -p
($n=$&+($'<=>$&))-$'&&s/\G/$n / while/\S+ /g

A variável temporária e todos esses parênteses parecem subótimos ...


Parece que você postou a resposta errada: não parece estar funcionando e que $' você mencionou não está no código ...
Dada

@ Dadá: Sim, colei novamente uma versão antiga e não testada do código, em vez da versão fixa. Graças e fixado
Ton Hospel

2

Haskell, 63 55 bytes

g(a:b:r)=[a|a==b]++[a..b-1]++[a,a-1..b+1]++g(b:r)
g x=x

Exemplo de uso: g [3,5,5,3]-> [3,4,5,5,4,3].

É uma modificação da minha resposta para um desafio relacionado . Mais uma vez, o trabalho principal é feito pela concatenação da lista de acima para b-1e de abaixo para b+1(onde uma lista estará vazia) e uma chamada recursiva. Para lidar com o a==bcaso em que as duas listas estão vazias, acrescentamos o [a|a==b]que avalia [a]se a==be de []outra forma.


2

R, 86 82 75 bytes

function(x)rep((y<-rle(unlist(Map(seq,head(x,-1),x[-1]))))$v,pmax(1,y$l-1))

salvou 4 bytes usando rep not rep.int (código golf não desempenho!) salvou outros 7 bytes usando correspondência parcial integrada ao usar $(e recolher a definição de função para 1 linha


Eu acho (y=...)que ao invés de (y<-...)também é válido, e um byte a menos.
21417 Giuseppe #

2

Ruby, 116 82 bytes

->n{o,*m=n;o=[o];m.zip(n).map{|t,u|o+=[[u],[*u+1..t],[*t..u-1].reverse][t<=>u]};o}

Meu primeiro golfe de todos os tempos.

Edit: Obrigado manatwork pelas sugestões impressionantes.


Não há necessidade de atribuir à variável, proc anônimo é suficiente; não há necessidade de colocar parênteses em torno do parâmetro formal; remover o primeiro elemento da matriz é mais curto com atribuição paralela e splat; mapbloco de código 's pode levar a matriz como vários parâmetros: ->n{o,*m=n;o=[o];m.zip(n).map{|t,u|o+=u==t ?[u]:(u<t ?[*u+1..t]:[*t..u-1].reverse)};o}. Caso contrário, bom primeiro golfe.
Manatwork

Escolhendo a partir de um agrupamento de 3 por elemento operador nave espacial é mais curto do que 2 operadores ternários: [[u],[*u+1..t],[*t..u-1].reverse][t<=>u].
Manatwork


1

Perl 6, 94 bytes

Eu não estou super feliz com isso agora, provavelmente vou tentar mais tarde

{reduce {|@^a[0..*-2],|@^b},map {@_[0]!= @_[1]??(@_[0]...@_[1])!!(@_[0],@_[1])},.rotor(2=>-1)}

1

PHP 5.4, 86 bytes

Isso deve ser usado como um arquivo incluído, que retorna o resultado.

Os valores são passados ​​como parâmetros da linha de comandos.

<?for($i=1;$i<$argc-1;$R=array_merge($R?:[],range($argv[$i++],$argv[$i++])));return$R;

Não é exatamente bonito ou qualquer coisa, mas faz o trabalho.


1

Python 3 , 76 bytes

Primeira tentativa de resposta em Python. A idéia básica é identificar repetidamente pares na sequência em que a diferença é maior que uma etapa e inserir um (e apenas um) elemento adicional para concluir a sequência na direção correta. Repita até que todas as diferenças entre os elementos consecutivos estejam entre +1 e -1.

d=diff
while any(d(x)**2>1):i=argmax(d(x)**2);x[:i+1]+=[x[i]+sign(d(x)[i])]

Experimente online!


0

Lua, 156 bytes

Uma função que recebe uma matriz no parâmetro e retorna a matriz estendida.

function f(t)r={}for i=2,#t
do x,y=t[i-1],t[i]r[#r+1]=x==y and x or nil
z=x>y and-1or 1
x=x==r[#r]and x+z or x
for j=x,y,z
do r[#r+1]=j end end
return r end

Ungolfed e explicações

function f(t)
  r={}                        -- Initialise an empty array
  for i=2,#t                  -- Iterate over the parameter array
  do
    x,y=t[i-1],t[i]           -- x and y are shorter names than t[i-1]
    r[#r+1]=                  -- when there's a range like [5,5]
      x==y and x or nil       -- put this number once in the array
    z=x>y and-1or 1         -- determine the step value
    x= x==r[#r]               -- prevent repeating the last value of r
          and x+z or x        -- by incrementing/decrementing x
    for j=x,y,z               -- iterate from t[i-1] to t[i] by step z (-1 or 1)
    do
      r[#r+1]=j               -- put j into the array r
    end
  end
  return r                    -- return the extended array
end

Para facilitar o uso, você pode usar a seguinte função para imprimir a matriz retornada por f().

function printArray(t)
  print("["..table.concat(t,",").."]")
end

Ao testar esse envio, você pode chamá-lo como:

printArray(f( {0,5,0,3,4,4,7,3,-3} ))
> [0,1,2,3,4,5,4,3,2,1,0,1,2,3,4,4,5,6,7,6,5,4,3,2,1,0,-1,-2,-3]

0

Mathcad, 62 "bytes"

insira a descrição da imagem aqui

Como o Mathcad usa um "quadro branco" 2D e operadores especiais (por exemplo, operador de soma, operador integral) e salva em um formato XML, uma planilha real pode conter várias centenas (ou mais) de caracteres. Para os fins do Code Golf, consideramos uma "contagem de bytes" do Mathcad o número de caracteres ou operadores que o usuário deve inserir para criar a planilha.

Converter a definição da função em um programa direto e substituir a variável lst por um único nome de caractere fornece um total de 62 "bytes". Com a função, usando um único caractere em vez do nome completo, isso aumenta para 65 "bytes" para a definição e mais 4 "bytes" para cada chamada (supondo que a criação da lista em si não esteja incluída no byte geral count (Usar as tabelas internas do Mathcad é outra maneira de inserir a lista).


0

PHP, 144 bytes

function f($r){$m=[];for($i=0;++$i<count($r);){$d=array_pop($m);$n=$r[$i];$p=$r[$i-1];$m=array_merge($m,$p==$n?[$p,$n]:range($p,$n));}return$m;}
Vista expandida
function f($r) {
  $m = [];
  for ($i=0; ++$i < count($r); ) {
    $d = array_pop($m);
    $n = $r[$i];
    $p = $r[$i-1];
    $m = array_merge($m, $p==$n ? [$p,$n]
                                : range($p,$n));
  }
  return $m;
}
Chamada de entrada / função
f([ bound1, bound2, bound3, ... ]);
Resultado
[int, int, int, int, ...]

É bagunçado e pesado, e tentarei otimizá-lo mais tarde. Ele cria um range()de cada par de pares de valores adjacentes e os une (depois depop do final do cumulativo anterior Array).


0

Perl6, 21

.join é a abreviação de $ _. join

say EVAL .join: "..."

Teste (rakudo)

perl6 -MMONKEY-SEE-NO-EVAL -e'say EVAL @*ARGS.join: "..."' 1 3 5 7 5 3 1 -1 -3

Resultado

(1 2 3 4 5 6 7 6 5 4 3 2 1 0 -1 -2 -3)


-1

R , 74 bytes

Outra solução R

function(x){b=x[1];z=c();for(a in x[-1]){z=c(z,c(b:(a-sign(a-b))));b=a};z}

Experimente online!


isso não funciona muito bem como o último valor parece estar faltando ...
Giuseppe
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.