Колеблющиеся диапазоны

19

Получив список с номером, выведите следующие диапазоны:

Вход: [0, 5, 0]станет [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0].

Это отображение диапазона через массив, так что мы должны сначала создать диапазон [0, 5], который [0, 1, 2, 3, 4, 5]. После этого мы используем 5для создания диапазона [5, 0]. Добавленный в нашем предыдущем диапазоне, это дает нам:

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

Давайте посмотрим на тестовый пример с двумя одинаковыми цифрами рядом друг с другом:

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

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

Так что это даст нам [3, 4, 5, 5, 4, 3].

Некоторые другие тестовые случаи:

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

На входе всегда будет как минимум 2 целых числа.

Кратчайший ответ выигрывает!

Lamaro
источник
3
Связанный. Связанный.
Мартин Эндер
1
Каким образом связаны вход и выход? Что представляет собой действительный вклад?
flawr

Ответы:

21

05AB1E, 1 байт

Ÿ

Попробуйте онлайн!

Как это устроено

Это встроенный.

Деннис
источник
18
У вас есть словарь со всеми встроенными модулями всех esolangs в вашей голове, или как? ;)
ETHproductions
2
Что ж, спасибо за использование osabie: P
Adnan
7
Почему у него даже есть встроенный для этого?
Нил
Должна быть компиляция всех 0-байтовых и 1-байтовых (может быть, даже 2-байтовых) программ, которые делают вещи.
CalculatorFeline
2
@Neil Это, в основном, инклюзивная функция диапазона, это действительно не так уж и впечатляюще.
Аднан
5

Javascript, 99 95 93 байта

4 6 байтов от спасибо @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>

удален
источник
1
Сохранить 3 байта с помощью y<b?b-y:y-b||1. Сохраните другой байт с помощью y>b||y-b&&-1.
Нил
@Neil. Хорошие!! Спасибо :)
удалено
1
На самом деле y<b?-1:y>bеще лучше.
Нил
5

JavaScript (SpiderMonkey 30+), 81 76 байт

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

Протестировано в Firefox 44. Использует потрясающие возможности ES6 по уничтожению аргументов и понимание массивов ES7 (которые, к сожалению, были удалены из спецификации ES7).

ETHproductions
источник
Не работает на [3, 0, 0, -3]. Я исправил RangeError и сохранил 10 байтов, но он все еще не работает:([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])
Нил
Извини, я имел ввиду ([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n])конечно.
Нил
@Neil Исправлено, с кучей новых игроков в процессе игры
ETHproductions
4

JavaScript (ES6) 66 72

Рекурсивная функция, которая многократно добавляет значения в массив, чтобы заполнить пробелы между близкими числами

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

Тестовое задание

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
источник
3

C 120 + 12 = 132 байта

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

Пример вызова:

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

Тест живи на идеоне .

удален
источник
3

Python 2, 77 байт

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

Попробуйте онлайн

Спасибо Нилу, DenkerAffe и Эрвану за указание на улучшения, которые я пропустил

Mego
источник
Конечно, это +1не нужно?
Нил
почему бы не пойти с lambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])? сохраняет несколько байтов.
Денкер
Я очень устал, когда писал это :) Ответь сначала, улучшайся позже.
Mego
Я думаю, что вы можете заменить [1,-1][y+1<x]на 2*(y>x)-1(также я не понимаю, почему вы используете, y<=x а не просто y<x)
Эрван
n[0:1]эквивалентно n[:1].
Джонатан Фрех
3

Perl, 47 байт

Включает +3 для -p(код содержит $'пробел и -счет тоже)

Дайте список номеров на STDIN:

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

fluctuating.pl:

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

Временная переменная и все эти скобки кажутся неоптимальными ...

Тон Хоспел
источник
Похоже, что вы отправили неправильный ответ: он, кажется, не работает, и что $' вы упомянули, не в коде ...
Дада
@ Дада: Да, снова вставил старую непроверенную версию кода вместо фиксированной. Спасибо и исправил
Тон Хоспел
2

Haskell, 63 55 байт

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

Пример использования: g [3,5,5,3]-> [3,4,5,5,4,3].

Это модификация моего ответа на связанный вызов . Опять же, основная работа выполняется путем конкатенации списка aсверху вниз b-1и aвниз b+1(где один список будет пустым) и рекурсивного вызова. Чтобы обработать a==bслучай, когда оба списка пусты, мы добавляем, [a|a==b]который оценивает, [a]если a==bи []иначе.

Ними
источник
2

R 86 82 75 байт

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

сохранил 4 байта, используя rep, а не rep.int (код, гольф, а не производительность!) сохранил еще 7 байтов, используя встроенное частичное соответствие при использовании $(и свернув определение функции в 1 строку

mnel
источник
Я думаю (y=...), что не (y<-...)является также действительным, и на один байт меньше.
Джузеппе
2

Рубин, 116 82 байта

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

Мой первый в мире гольф.

Изменить: Спасибо Manatwork за удивительные предложения.

emagdne
источник
Нет необходимости присваивать переменной, достаточно анонимного процесса; нет необходимости ставить скобки вокруг формального параметра; извлечение первого элемента массива короче с параллельным присваиванием и сплатом; mapБлочный код «S может принимать массив в качестве нескольких параметров: ->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}. В противном случае хороший первый гольф.
manatwork
Выбор из массива 3 элемента с помощью оператора космического корабля короче 2 тройных операторы: [[u],[*u+1..t],[*t..u-1].reverse][t<=>u].
manatwork
1

Perl 6, 94 байта

Я не очень доволен этим прямо сейчас, я, вероятно, сделаю еще один выстрел позже

{reduce {|@^a[0..*-2],|@^b},map {@_[0]!= @_[1]??(@_[0]...@_[1])!!(@_[0],@_[1])},.rotor(2=>-1)}
Клавиатурный
источник
1

PHP 5.4, 86 байт

Он предназначен для использования в качестве включенного файла, который возвращает результат.

Значения передаются как параметры командной строки.

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

Не совсем красиво или что-то еще, но делает работу.

Исмаэль Мигель
источник
1

Python 3 , 76 байт

Первая попытка ответа на Python. Основная идея состоит в том, чтобы повторно идентифицировать пары в последовательности, где разница больше шага, и вставить один (и только один) дополнительный элемент для завершения последовательности в правильном направлении. Повторяйте, пока все различия между последовательными элементами не будут между +1 и -1.

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

Попробуйте онлайн!

NofP
источник
0

Луа, 156 байт

Функция, которая принимает массив в параметре и возвращает расширенный массив.

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

Неуправляемый и объяснения

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

Для простоты использования вы можете использовать следующую функцию для печати возвращаемого массива f().

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

При тестировании этого представления вы можете назвать его следующим образом:

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
источник
0

Mathcad, 62 "байта"

введите описание изображения здесь

Поскольку Mathcad использует «белую доску» 2D и специальные операторы (например, оператор суммирования, интегральный оператор) и сохраняет в формате XML, фактическая рабочая таблица может содержать несколько сотен (или более) символов. Для целей Code Golf я взял число байтов Mathcad в качестве количества символов или операторов, которые пользователь должен ввести для создания таблицы.

Преобразование определения функции в прямую программу и замена переменной lst на имя одного символа дает в общей сложности 62 "байта". С помощью функции, использующей один символ, а не полное имя, это увеличивается до 65 «байтов» для определения и еще 4 «байтов» для каждого вызова (при условии, что создание самого списка не включено в общий байт count (использование встроенных таблиц Mathcad - еще один способ ввода списка).

Стюарт Бруфф
источник
0

PHP, 144 байта

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;}
В разобранном виде
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;
}
Вход / вызов функции
f([ bound1, bound2, bound3, ... ]);
Выход
[int, int, int, int, ...]

Это грязно и коротко, и я постараюсь оптимизировать это позже. Он создает range()из каждой пары соседних пар значений, а затем объединяет их (после popокончания предыдущего накопительного значения Array).

ricdesi
источник
0

Perl6, 21

.join - это сокращение от $ _. join

say EVAL .join: "..."

Тест (ракудо)

perl6 -MMONKEY-SEE-NO-EVAL -e'say EVAL @*ARGS.join: "..."' 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)
Demayl
источник
-1

R , 74 байта

Другое решение 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}

Попробуйте онлайн!

NofP
источник
это не совсем работает, так как последнее значение, кажется, отсутствует ...
Джузеппе