Коливання діапазонів


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 цілих числа.

Найкоротша відповідь виграє!



1
Яким чином пов'язані введення та вихід? Що являє собою дійсний внесок?
flawr

Відповіді:


21

05AB1E, 1 байт

Ÿ

Спробуйте в Інтернеті!

Як це працює

Це вбудований.


18
Чи є у вас в голові словник усіх вбудованих езолангів чи що? ;)
ETHproductions

2
Ну, дякую за використання osabie: P
Аднан

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).


Не працює [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>


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"

Тестуйте наживо на ideone .


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

Спробуйте в Інтернеті

Дякуємо Нілу, ДенкерАффе та Ервану за вказівку на покращення, які я пропустив


Звичайно, +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:])],[])? зберігає деякі байти.
Денкер

Я дуже втомився, коли писав це :) Відповідь спочатку, вдосконалення пізніше.
Мего

Я думаю, ви можете замінити [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

Тимчасова змінна і всі ці дужки відчувають себе неоптимально ...


Схоже, ви написали неправильну відповідь: це, здається, не працює, і те, що $' ви згадали, не в коді ...
Дада

@Dada: Так, знову вставив стару неперевірену версію коду замість виправленої. Дякуємо та виправляємо
Тон Євангелія

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 not rep.int (код гольфу не є продуктивністю!) збережено ще 7 байт за допомогою вбудованого часткового узгодження при використанні $(та визначення функції функції на 1 рядок


Я думаю (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}

Мій перший в історії гольф.

Редагувати: подякуйте за маневрові роботи за чудові пропозиції.


Не потрібно призначати змінну, достатньо анонімних процедур; не потрібно ставити дужки навколо формального параметра; виймання першого елемента масиву коротше з паралельним присвоєнням та шлейфом; 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}. Інакше приємний перший гольф.
манатура

Вибір з масиву 3 елементи з допомогою оператора космічного корабля коротше 2 потрійних оператори: [[u],[*u+1..t],[*t..u-1].reverse][t<=>u].
манатура


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

Спробуйте в Інтернеті!


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]

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).


0

Перл6, 21

.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)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.