Zmienne zakresy

19

Biorąc pod uwagę listę z liczbą, wypisz następujące zakresy:

Wejście: [0, 5, 0]stanie się [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0].

Jest to mapowanie zakresu przez tablicę, więc najpierw musimy utworzyć zakres [0, 5], który jest [0, 1, 2, 3, 4, 5]. Następnie używamy 5do utworzenia zakresu [5, 0]. Dołączone do naszej poprzedniej oferty, daje nam to:

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

Zobaczmy przypadek testowy z dwoma takimi samymi cyframi obok siebie:

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

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

To by nam dało [3, 4, 5, 5, 4, 3].

Niektóre inne przypadki testowe:

[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]

Dane wejściowe zawsze będą miały co najmniej 2 liczby całkowite.

Najkrótsza odpowiedź wygrywa!

Lamaro
źródło
1
W jaki sposób są powiązane dane wejściowe i wyjściowe? Co stanowi prawidłowy wkład?
flawr

Odpowiedzi:

21

05AB1E, 1 bajt

Ÿ

Wypróbuj online!

Jak to działa

To jest wbudowane.

Dennis
źródło
18
Czy masz słownik wszystkich wbudowanych we wszystkie esolangi w twojej głowie, czy co? ;)
ETHprodukcje
2
Dziękuję za korzystanie z osabie: P
Adnan
7
Dlaczego ma w tym nawet wbudowaną funkcję?
Neil
Powinna istnieć kompilacja wszystkich programów 0-bajtowych i 1-bajtowych (może nawet 2-bajtowych), które robią różne rzeczy.
CalculatorFeline
2
@Neil Zasadniczo jest to funkcja obejmująca zakres, naprawdę nie jest aż tak spektakularna.
Adnan,
5

JavaScript, 99 95 93 bajtów

4 6 bajtów off dzięki @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>

oddalony
źródło
1
Zaoszczędź 3 bajty y<b?b-y:y-b||1. Zapisz kolejny bajt, używając y>b||y-b&&-1.
Neil
@Neil. Dobre!! Dzięki :)
usunięto
1
Właściwie y<b?-1:y>bjest jeszcze lepiej.
Neil
5

JavaScript (SpiderMonkey 30+), 81 76 bajtów

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

Testowany w przeglądarce Firefox 44. Korzysta z niesamowitych możliwości destrukcji argumentów ES6 i interpretacji tablic ES7 (które niestety zostały usunięte ze specyfikacji ES7).

ETHprodukcje
źródło
Nie działa [3, 0, 0, -3]. Naprawiłem RangeError i zapisałem 10 bajtów, ale nadal nie działa:([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
Przepraszam, ([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n])oczywiście miałem na myśli .
Neil
@Neil Naprawiono problem z grą w golfa
ETHproductions
4

JavaScript (ES6) 66 72

Funkcja rekurencyjna, która wielokrotnie dodaje wartości do tablicy, aby wypełnić luki między liczbami bliskimi

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

Test

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>

edc65
źródło
3

C, 120 + 12 = 132 bajty

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

Przykładowe połączenie:

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

Testuj na żywo na ideone .

oddalony
źródło
3

Python 2, 77 bajtów

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

Wypróbuj online

Dzięki Neilowi, DenkerAffe i Erwanowi za wskazanie ulepszeń, których mi brakowało

Mego
źródło
Z pewnością +1jest to niepotrzebne?
Neil
dlaczego nie iść z lambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])? oszczędza niektóre bajty.
Denker,
Byłem bardzo zmęczony pisząc to :) Odpowiedz najpierw, popraw później.
Mego
myślę, że można zastąpić [1,-1][y+1<x]przez 2*(y>x)-1(również nie rozumiem dlaczego używasz y<=x i nie tylko y<x)
Erwan
n[0:1]jest równoważne z n[:1].
Jonathan Frech,
3

Perl, 47 bajtów

Zawiera +3 dla -p(kod zawiera $'więc spację i -też się liczy)

Podaj listę numerów na STDIN:

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

fluctuating.pl:

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

Zmienna tymczasowa i wszystkie te nawiasy wydają się nieoptymalne ...

Ton Hospel
źródło
Wygląda na to pisał niewłaściwą odpowiedź: nie wydaje się działać i że $' wspomniałeś nie jest w kodzie ...
Dada
@Dada: Tak, ponownie wkleiłem starą niesprawdzoną wersję kodu zamiast poprawionej. Dzięki i naprawiono
Ton Hospel,
2

Haskell, 63 55 bajtów

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

Przykład użycia: g [3,5,5,3]->[3,4,5,5,4,3] .

To modyfikacja mojej odpowiedzi na powiązane wyzwanie . Ponownie, główna praca jest wykonywana przez połączenie listy od agóry do b-1i od adołu do b+1(gdzie jedna lista będzie pusta) i wywołanie rekurencyjne. Aby obsłużyć a==bprzypadek, w którym obie listy są puste, przygotowujemy, [a|a==b]która ocenia, [a]czy a==bi []inaczej.

nimi
źródło
2

R, 86 82 75 bajtów

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

zapisano 4 bajty przy użyciu rep not rep.int (kod golfa nie wydajność!) zapisano kolejne 7 bajtów przy użyciu wbudowanego częściowego dopasowania podczas używania $(i zwijania definicji funkcji do 1 wiersza

mnel
źródło
Myślę, że (y=...)raczej niż (y<-...)jest również poprawny i jeden bajt mniej.
Giuseppe,
2

Rubin, 116 82 bajtów

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

Mój pierwszy golf.

Edycja: Wielkie dzięki za niesamowite sugestie.

emagdne
źródło
Nie trzeba przypisywać zmiennej, wystarczy anonimowy proc; nie trzeba umieszczać nawiasów wokół parametru formalnego; wyjęcie pierwszego elementu tablicy jest krótsze z równoległym przypisaniem i ikoną; map„s blok kodu może przyjmować szereg postaci wielu parametrów: ->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}. W przeciwnym razie fajny pierwszy golf.
manatwork
Zbieranie z tablicy 3 przez operatora kosmicznego elementu jest mniejsza niż 2 operatorów trójskładnikowe: [[u],[*u+1..t],[*t..u-1].reverse][t<=>u].
manatwork
1

Perl 6, 94 bajtów

Nie jestem z tego bardzo zadowolony, prawdopodobnie później zrobię kolejne zdjęcie

{reduce {|@^a[0..*-2],|@^b},map {@_[0]!= @_[1]??(@_[0]...@_[1])!!(@_[0],@_[1])},.rotor(2=>-1)}
Skróty klawiszowe
źródło
1

PHP 5.4, 86 bajtów

Jest to przeznaczone do użycia jako dołączony plik, który zwraca wynik.

Wartości są przekazywane jako parametry wiersza polecenia.

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

Niezupełnie ładne czy coś, ale spełnia swoje zadanie.

Ismael Miguel
źródło
1

Python 3 , 76 bajtów

Pierwsza próba odpowiedzi w języku Python. Podstawową ideą jest wielokrotne identyfikowanie par w sekwencji, w których różnica jest większa niż krok i wstawianie jednego (i tylko jednego) dodatkowego elementu, aby zakończyć sekwencję we właściwym kierunku. Powtarzaj, aż wszystkie różnice między kolejnymi elementami będą wynosić od +1 do -1.

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

Wypróbuj online!

Nie dotyczy
źródło
0

Lua, 156 bajtów

Funkcja, która pobiera tablicę w parametrze i zwraca tablicę rozszerzoną.

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

Bez golfa i wyjaśnienia

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

Dla ułatwienia możesz użyć poniższej funkcji, aby wydrukować tablicę zwróconą przez f().

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

Podczas testowania tego zgłoszenia możesz je nazwać:

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]
Katenkyo
źródło
0

Mathcad, 62 „bajty”

enter image description here

Ponieważ Mathcad używa 2D „tablicy” i operatorów specjalnych (np. Operatora sumowania, operatora całkującego) i zapisuje w formacie XML, rzeczywisty arkusz roboczy może zawierać kilkaset (lub więcej) znaków. Na potrzeby Code Golf podjąłem „liczbę bajtów” Mathcada, która jest liczbą znaków lub operatorów, które użytkownik musi wprowadzić, aby utworzyć arkusz.

Przekształcenie definicji funkcji w prosty program i zastąpienie zmiennej lst nazwą pojedynczego znaku daje w sumie 62 „bajty”. Dzięki tej funkcji, używając pojedynczego znaku zamiast pełnej nazwy, zwiększa się on do 65 „bajtów” w definicji i kolejnych 4 „bajtów” dla każdego wywołania (zakładając, że utworzenie samej listy nie jest uwzględnione w całym bajcie count (Korzystanie z wbudowanych tabel Mathcada to kolejny sposób wprowadzania listy).

Stuart Bruff
źródło
0

PHP, 144 bajty

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;}
Widok rozstrzelony
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;
}
Wywołanie wejścia / funkcji
f([ bound1, bound2, bound3, ... ]);
Wynik
[int, int, int, int, ...]

Jest niechlujny i gruby, a później postaram się go zoptymalizować. Tworzy range()z każdej pary sąsiednich par wartości, a następnie łączy je ze sobą (po popoderwaniu końca poprzedniej kumulatywnej Array).

ricdesi
źródło
0

Perl6, 21

.join jest skrótem od $ _. join

say EVAL .join: "..."

Test (rakudo)

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

Wynik

(1 2 3 4 5 6 7 6 5 4 3 2 1 0 -1 -2 -3)
Demayl
źródło
-1

R , 74 bajty

Kolejne rozwiązanie 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}

Wypróbuj online!

Nie dotyczy
źródło
to nie do końca działa, ponieważ wydaje się, że brakuje ostatniej wartości ...
Giuseppe