Dalgalanan aralıklar


19

Sayı içeren bir liste verildiğinde, aralıkları şu şekilde çıktılayın:

Girdi: [0, 5, 0]olur [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0].

Bu dizi boyunca bir aralığı eşleştiriyor, bu yüzden önce aralığı oluşturmalıyız [0, 5], yani [0, 1, 2, 3, 4, 5]. Bundan sonra 5aralığı oluşturmak için the kullanıyoruz [5, 0]. Önceki serimize eklendiğinde, bu bize şunları sağlar:

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

Yan yana iki basamaklı bir test senaryosunu inceleyelim:

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

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

Yani bu bize verecekti [3, 4, 5, 5, 4, 3].

Diğer bazı test durumları:

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

Giriş her zaman en az 2 tamsayıya sahip olacaktır.

En kısa cevap kazanır!



1
Girdi ve çıktı ne şekilde ilişkilidir? Geçerli bir girdi nedir?
Kusur

Yanıtlar:


21

05AB1E, 1 bayt

Ÿ

Çevrimiçi deneyin!

Nasıl çalışır

Yerleşik.


18
Kafanızdaki tüm esolanglardaki tüm yerleşik sözlüklerin bir sözlüğü var mı? ;)
ETHproductions 5:16

2
Osabie'yi kullandığınız için teşekkürler: P
Adnan

7
Neden bunun için bir yerleşik var?
Neil

Bir şeyler yapan 0bayt ve 1 bayt (hatta 2 bayt) programların bir derlemesi olmalıdır.
CalculatorFeline

2
@Neil Temelde kapsamlı bir aralık işlevi, gerçekten o kadar da muhteşem değil.
Adnan

5

Javascript, 99 95 93 bayt

4 6 bayt kapalı @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
Düğmesini kullanarak 3 bayt kaydedin y<b?b-y:y-b||1. Düğmesini kullanarak başka bir bayt kaydedin y>b||y-b&&-1.
Neil

@Neil. İyi olanlar!! Thanks :)
kaldırıldı

1
Aslında y<b?-1:y>bhala daha iyi.
Neil

5

JavaScript (SpiderMonkey 30+), 81 76 bayt

([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'te test edilmiştir. ES6'nın harika argüman yok etme yeteneklerini ve ES7'nin dizi kavramalarını (ne yazık ki ES7 spesifikasyonundan kaldırılmıştır) kullanır.


Üzerinde çalışmaz [3, 0, 0, -3]. RangeError'u düzelttim ve 10 bayt kazandım, ancak hala çalışmıyor:([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

Üzgünüm, ([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n])elbette demek istedim .
Neil

@Neil Sabit, süreçte daha fazla golf sahasında
ETHproductions

4

JavaScript (ES6) 66 72

Yakın sayılar arasındaki boşlukları doldurmak için dizinin içine tekrar tekrar değer ekleyen yinelemeli işlev

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

Ölçek

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 bayt

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

Örnek çağrı:

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

Test ideone üzerinde canlı .


3

Python 2, 77 bayt

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

Çevrimiçi deneyin

Neil, DenkerAffe ve Erwan'a kaçırdığım gelişmeleri işaret ettikleri için teşekkürler


Elbette +1gereksiz mi?
Neil

neden olmasın ile gitmek lambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])? bazı baytlar kaydeder.
Denker

Bunu yazarken çok yorgundum :) Önce cevap ver, sonra geliştir.
Mego

i yerini alabilir mi [1,-1][y+1<x]tarafından 2*(y>x)-1(Kullanmak neden Ayrıca ben anlamıyorum y<=x sadece değil y<x)
Erwan

n[0:1]eşittir n[:1].
Jonathan Frech

3

Perl, 47 bayt

İçin +3 içerir -p(kod $'çok boşluk ve -sayı içerir )

STDIN'deki numaraların listesini verin:

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

fluctuating.pl:

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

Geçici değişken ve tüm bu parantezler yetersizdir ...


Görünüşe göre yanlış cevap gönderdiniz: Çalışmıyor gibi görünüyor ve $' bahsettiğiniz kodda değil ...
Dada

@Dada: Evet, kodun sabit bir yerine test edilmemiş eski bir sürümünü tekrar yapıştırdı. Teşekkürler ve düzeltildi
Ton Hospel

2

Haskell, 63 55 bayt

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

Kullanım örneği: g [3,5,5,3]-> [3,4,5,5,4,3].

Bu , ilgili bir zorluğa cevabımın bir modifikasyonudur . Yine, ana iş ile ilgili liste birleştirerek yapılır için yukarı ve gelen aşağı doğru (bir liste boş açıklanacaktır) ve yinelemeli çağrı. İşlemek için iki liste de boş durumda biz prepend için değerlendirdiği takdirde ve aksi.ab-1ab+1a==b[a|a==b][a]a==b[]


2

R, 86 82 75 bayt

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

rep değil rep.int kullanarak 4 bayt kaydedildi (kod golf değil performans!) dahili kısmi eşleme kullanarak başka bir 7 bayt kaydetti $(ve fonksiyon tanımını 1 satıra daralttı


Bence (y=...)ziyade (y<-...)bir byte az da geçerlidir ve.
Giuseppe

2

Yakut, 116 82 bayt

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

Benim ilk golf.

Düzenleme: Harika öneriler için teşekkürler manatwork.


Değişkene atamaya gerek yoktur, anonim proc yeterlidir; parantezin resmi parametrenin etrafına yerleştirilmesine gerek yoktur; dizinin ilk elemanının çıkarılması paralel atama ve uyarıyla daha kısadır; mapbireyin kod bloğu birden parametre olarak diziyi alabilir: ->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}. Aksi takdirde güzel ilk golf.
manatwork

Uzay operatör tarafından bir 3 eleman diziden Çekme daha kısa 2 üçlü operatörleri: [[u],[*u+1..t],[*t..u-1].reverse][t<=>u].
işi


1

Perl 6, 94 bayt

Şu an bununla çok mutlu değilim, muhtemelen daha sonra başka bir çekim yapacağım

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

1

PHP 5.4, 86 bayt

Bu, sonucu döndüren dahil edilen bir dosya olarak kullanılmak üzere tasarlanmıştır.

Değerler komut satırı parametreleri olarak iletilir.

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

Tam olarak hoş bir şey değil, ama iş yapıyor.


1

Python 3 , 76 bayt

İlk Python cevabını deneyin. Temel fikir, farkın bir adımdan daha büyük olduğu sekanstaki çiftleri tekrar tekrar tanımlamak ve sekansı doğru yönde tamamlamak için bir (ve sadece bir) ek eleman yerleştirmektir. Ardışık elemanlar arasındaki tüm farklar +1 ile -1 arasında olana kadar tekrarlayın.

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

Çevrimiçi deneyin!


0

Lua, 156 Bayt

Parametrede bir dizi alan ve genişletilmiş diziyi döndüren bir işlev.

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 ve açıklamalar

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

Kullanım kolaylığı için, döndürülen diziyi yazdırmak üzere aşağıdaki işlevi kullanabilirsiniz f().

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

Bu sunumu test ederken şöyle diyebilirsiniz:

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 "bayt"

enter image description here

Mathcad bir 2B "beyaz tahta" ve özel işleçler (örn. Toplama işleci, tümleşik işleci) kullandığından ve bir XML biçiminde kaydettiğinden, gerçek bir çalışma sayfasında birkaç yüz (veya daha fazla) karakter bulunabilir. Code Golf amacıyla, kullanıcının çalışma sayfasını oluşturmak için girmesi gereken karakter veya operatör sayısı olarak bir Mathcad "bayt sayısı" aldım.

İşlev tanımını düz bir programa dönüştürmek ve lst değişkenini tek bir karakter adıyla değiştirmek, toplam 62 "bayt" verir. İşlev ile, tam ad yerine tek bir karakter kullanılarak, tanım için 65 "bayt" ve her çağrı için 4 "bayt" artar (listenin kendisinin oluşturulmasının genel bayta dahil olmadığı varsayılarak) count (Mathcad'ın yerleşik tablolarını kullanmak, listeyi girmenin başka bir yoludur).


0

PHP, 144 bayt

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;}
Parçalarına ayrıştırılmış görünü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;
}
Giriş / işlev çağrısı
f([ bound1, bound2, bound3, ... ]);
Çıktı
[int, int, int, int, ...]

Dağınık ve tıknaz ve daha sonra optimize etmeye çalışacağım. range()Bitişik değer çiftlerinin her bir çiftinden bir tane oluşturur , ardından bunları birleştirir ( popönceki kümülatifin sonunu çıkardıktan sonra Array).


0

Perl6, 21

.join $ _ için kısadır.

say EVAL .join: "..."

Test (rakudo)

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

Çıktı

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


-1

R, , 74 bayt

Başka bir R çözümü

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

Çevrimiçi deneyin!


son değer eksik gibi görünüyor bu pek işe yaramıyor ...
Giuseppe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.