Schwankende Bereiche

19

Wenn Sie eine Liste mit einer Nummer haben, geben Sie die Bereiche wie folgt aus:

Input: [0, 5, 0]würde werden [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0].

Dies ist die Zuordnung eines Bereichs durch das Array, also müssen wir zuerst den Bereich erstellen [0, 5], also [0, 1, 2, 3, 4, 5]. Danach 5erstellen wir den Bereich mit [5, 0]. An unser vorheriges Sortiment angehängt, erhalten wir:

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

Betrachten wir einen Testfall mit zwei gleichen Ziffern nebeneinander:

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

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

Das würde uns also geben [3, 4, 5, 5, 4, 3].

Einige andere Testfälle:

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

Die Eingabe hat immer mindestens 2 Ganzzahlen.

Kürzeste Antwort gewinnt!

Lamaro
quelle
3
Verbunden. Verbunden.
Martin Ender
1
Inwiefern hängen Input und Output zusammen? Was ist eine gültige Eingabe?
Fehler

Antworten:

21

05AB1E, 1 Byte

Ÿ

Probieren Sie es online!

Wie es funktioniert

Es ist eingebaut.

Dennis
quelle
18
Haben Sie ein Wörterbuch mit allen eingebauten Inhalten in allen Esolangs in Ihrem Kopf, oder was? ;)
ETHproductions
2
Vielen Dank, dass Sie osabie verwenden: P
Adnan
7
Warum hat es dafür überhaupt eine eingebaute?
Neil
Es sollte eine Zusammenstellung aller 0-Byte- und 1-Byte- (vielleicht sogar 2-Byte-) Programme geben, die etwas tun.
CalculatorFeline
2
@Neil Grundsätzlich handelt es sich um eine Inklusiv-Bereichsfunktion, die wirklich nicht so spektakulär ist.
Adnan
5

Javascript, 99 95 93 Bytes

4 6 Bytes weg danke @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>

entfernt
quelle
1
Sparen Sie 3 Bytes mit y<b?b-y:y-b||1. Speichern Sie ein weiteres Byte mit y>b||y-b&&-1.
Neil
@Neil. Die guten!! Thanks :)
entfernt
1
Ist eigentlich y<b?-1:y>bnoch besser.
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]]

Getestet in Firefox 44. Verwendet die großartigen Argumente von ES6 zur Destrukturierung und das Array-Verständnis von ES7 (das leider aus der ES7-Spezifikation entfernt wurde).

ETHproductions
quelle
Funktioniert nicht [3, 0, 0, -3]. Ich habe den RangeError behoben und 10 Bytes gespeichert, aber es funktioniert immer noch nicht:([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
Entschuldigung, ich meinte ([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n])natürlich.
Neil
@Neil Behoben, mit ein paar mehr Golfern im Prozess
ETHproductions
4

JavaScript (ES6) 66 72

Eine rekursive Funktion, die wiederholt Werte innerhalb des Arrays hinzufügt, um die Lücken zwischen nahen Zahlen zu füllen

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

Prüfung

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

Beispielaufruf:

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

Teste live auf ideone .

entfernt
quelle
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:])],[])

Probieren Sie es online aus

Vielen Dank an Neil, DenkerAffe und Erwan für die Hinweise auf Verbesserungen, die ich verpasst habe

Mego
quelle
Sicher +1ist das unnötig?
Neil
warum gehst lambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])du nicht mit ? spart einige Bytes.
Denker
Ich war sehr müde beim Schreiben :) Antworte zuerst, verbessere dich später.
Mego
Ich denke, Sie können ersetzen [1,-1][y+1<x]durch 2*(y>x)-1(auch ich verstehe nicht, warum Sie y<=x und nicht einfach y<x)
Erwan
n[0:1]ist äquivalent zu n[:1].
Jonathan Frech
3

Perl, 47 Bytes

Beinhaltet +3 für -p(Code enthält $'also Platz und -zählt auch)

Geben Sie die Liste der Zahlen auf STDIN an:

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

fluctuating.pl:

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

Die temporäre Variable und all diese Klammern fühlen sich suboptimal an ...

Tonne Hospel
quelle
Es sieht so aus, als hätten Sie die falsche Antwort gepostet: Es scheint nicht zu funktionieren und das, was $' Sie erwähnt haben, ist nicht im Code enthalten ...
Dada
@Dada: Ja, es wurde wieder eine alte ungetestete Version des Codes anstelle der festen eingefügt. Danke und behoben
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

Anwendungsbeispiel: g [3,5,5,3]-> [3,4,5,5,4,3].

Es ist eine Modifikation meiner Antwort auf eine verwandte Herausforderung . Auch hier ist die Hauptarbeit durch Verketten die Liste von getan , aum nach oben b-1und von aunten auf b+1und einem rekursiven Aufruf (wo eine Liste leer sein). Um den a==bFall zu bewältigen , dass beide Listen leer sind, stellen wir vor, [a|a==b]was als [a]ob a==bund []sonst bewertet wird .

nimi
quelle
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))

4 Bytes mit rep nicht rep.int gespeichert (Code Golf nicht Leistung!) Weitere 7 Bytes wurden mit der eingebauten partiellen Übereinstimmung bei Verwendung von $(und Reduzieren der Funktionsdefinition auf 1 Zeile ) gespeichert

mnel
quelle
Ich denke (y=...)eher als (y<-...)ist auch gültig, und ein Byte weniger.
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}

Mein allererster Golf.

Edit: Danke manatwork für die tollen Vorschläge.

emagdne
quelle
Es ist nicht nötig, Variablen zuzuweisen, anonymes Proc ist genug; formale Parameter müssen nicht in Klammern gesetzt werden; Das Herausnehmen des ersten Elements des Arrays ist bei paralleler Zuweisung und Splat kürzer. map‚s Codeblock kann das Array als mehrere Parameter erfolgen: ->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}. Ansonsten schönes erstes Golfen.
Manatwork
Pflücken von einer 3 - Element - Array mit dem Raumschiff - Operator ist kürzer als 2 ternäre Operatoren: [[u],[*u+1..t],[*t..u-1].reverse][t<=>u].
Manatwork
1

Perl 6, 94 Bytes

Ich bin momentan nicht besonders glücklich damit, wahrscheinlich mache ich später eine weitere Aufnahme

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

PHP 5.4, 86 Bytes

Dies soll als eingeschlossene Datei verwendet werden, die das Ergebnis zurückgibt.

Die Werte werden als Kommandozeilenparameter übergeben.

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

Nicht gerade hübsch oder so, aber macht den Job.

Ismael Miguel
quelle
1

Python 3 , 76 Bytes

Erster Versuch einer Python-Antwort. Die Grundidee ist, wiederholt Paare in der Sequenz zu identifizieren, bei denen der Unterschied größer als ein Schritt ist, und ein (und nur ein) zusätzliches Element einzufügen, um die Sequenz in die richtige Richtung zu vervollständigen. Wiederholen, bis alle Unterschiede zwischen aufeinanderfolgenden Elementen zwischen +1 und -1 liegen.

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

Probieren Sie es online!

NofP
quelle
0

Lua, 156 Bytes

Eine Funktion, die ein Array als Parameter annimmt und das erweiterte Array zurückgibt.

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 und Erklärungen

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

Zur Vereinfachung der Verwendung können Sie die folgende Funktion verwenden, um das von zurückgegebene Array zu drucken f().

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

Wenn Sie diesen Beitrag testen, können Sie ihn folgendermaßen aufrufen:

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
quelle
0

Mathcad, 62 "Bytes"

Bildbeschreibung hier eingeben

Da Mathcad ein 2D-Whiteboard und spezielle Operatoren (z. B. Summationsoperator, Integrationsoperator) verwendet und in einem XML-Format speichert, kann ein tatsächliches Arbeitsblatt mehrere hundert (oder mehr) Zeichen enthalten. Für die Zwecke von Code Golf habe ich die Anzahl der Zeichen oder Operatoren, die der Benutzer eingeben muss, um das Arbeitsblatt zu erstellen, als Mathcad-Bytezahl definiert.

Wenn Sie die Funktionsdefinition in ein einfaches Programm konvertieren und die Variable lst durch einen einzelnen Zeichennamen ersetzen, erhalten Sie insgesamt 62 "Bytes". Mit der Funktion, die ein einzelnes Zeichen anstelle des vollständigen Namens verwendet, erhöht sich dies auf 65 "Bytes" für die Definition und weitere 4 "Bytes" für jeden Aufruf (vorausgesetzt, die Erstellung der Liste selbst ist nicht im Gesamtbyte enthalten count (Die Verwendung der integrierten Tabellen von Mathcad ist eine weitere Möglichkeit, die Liste einzugeben.)

Stuart Bruff
quelle
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;}
Explosionszeichnung
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;
}
Eingabe / Funktionsaufruf
f([ bound1, bound2, bound3, ... ]);
Ausgabe
[int, int, int, int, ...]

Es ist chaotisch und klobig, und ich werde später versuchen, es zu optimieren. Es erstellt range()aus jedem Paar benachbarter Wertepaare ein und setzt sie dann zusammen (nachdem popdas Ende der vorherigen Kumulierung entfernt wurde Array).

Ricdesi
quelle
0

Perl6, 21

.join ist die Abkürzung für $ _. 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

Ausgabe

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

R 74 Bytes

Eine andere R-Lösung

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

Probieren Sie es online!

NofP
quelle
Dies funktioniert nicht ganz, da der letzte Wert zu fehlen scheint ...
Giuseppe