Angka N paling dekat dengan nol tetap seimbang

10

Tujuan : Diberikan bilangan bulat positif n:

  • Jika nganjil, keluarkan daftar nangka yang paling dekat 0dalam urutan meningkat
  • Jika ngenap, hasilkan nilai Falsey.

Kasus uji :

5 -> [-2,-1,0,1,2]
4 -> false (or any Falsey value)
1 -> [0]

Implementasi referensi

function update(){
  var num = +document.getElementById("yield").value;
  if(num){
    var out = document.getElementById("output");
    if(num % 2 == 1){
      // base is balanced
      var baseArr = [];
      for(var i=0;i<num;i++){
        baseArr.push(i-Math.floor(num/2));
      }
      out.innerHTML = baseArr.join(" ");
    } else {
      out.innerHTML = "false";
    }
  } else {
    out.innerHTML = "<i>enter input</i>";
  }
}

setInterval(update,1);
* {
  font-family: "Constantia", "Consolas", monospace;
}

[type="number"] {
  width: 10px;
  width: 2em;
}

#output {
  font-family: "Consolas", monospace;
}
Input: <input type="number" id="yield" value="3"> is <span id="output"><i>enter input</i></span>

Conor O'Brien
sumber
Bisakah output menjadi objek rentang daripada daftar?
Brad Gilbert b2gills
@ BradGilbertb2gills Maaf, objek rentang adalah hasil yang tidak valid.
Conor O'Brien
Daftar kosong tidak selalu palsu.
SuperJedi224
@ SuperJedi224 Dalam konteks apa?
Conor O'Brien
Ada bahasa (IE Javascript) di mana daftar kosong dianggap sebagai nilai yang sebenarnya.
SuperJedi224

Jawaban:

4

Pyth, 10 byte

*-R/Q2Q%Q2

Cobalah online.

Bagaimana itu bekerja

            (implicit) Store the input in Q.
   /Q2      Calculate Q/2 (integer division).
 -R   Q     Subtract that value (-R) from each element in [0, ..., Q-1] (Q).
*      %Q2  Repeat the resulting array Q%2 times.
Dennis
sumber
5

APL, 16 15 13 byte

Berkat @Dennis untuk -2 byte!

⌊(⍳⊢×2|⊢)-÷∘2

Ini adalah kereta monadik yang memberikan array kosong untuk input genap. Di bawah ini adalah diagram:

┌────┴─────┐   
⌊ ┌────────┼─┐ 
┌─┴─┐      - ∘ 
⍳ ┌─┼───┐   ┌┴┐
  ⊢ × ┌─┼─┐ ÷ 2
      2 | ⊢    

Pertama, ⊢×2|⊢beri waktu input mod 2; yaitu, peluang akan memberikan diri mereka sendiri, dan bahkan memberi 0. Kita menggunakan untuk membuat daftar angka dari 1 hingga yang ( ⍳0memberikan array kosong), dan kemudian kita kurangi setengah input dan lantai.

lirtosiast
sumber
5

Mathematica, 32 30 24 byte

OddQ@#&&Range@#-(#+1)/2&

Trik kode-golf: Argumen terakhir untuk Andtidak harus menjadi boolean.

LegionMammal978
sumber
Anda dapat menyimpan byte dengan menggunakan tanda kurung Unicode untuk Floor.
Martin Ender 3-15
Juga, Range[-a,a=...]tampaknya berfungsi, menghemat byte lain.
Martin Ender 3-15
OddQ@#&&Range@#-(#+1)/2&
ngenisis
4

PowerShell, 50 52 Bytes

param($a)$b=$a/2-.5;(0,((0-$b)..$b-join' '))[($a%2)]

Oof. Jawabannya cukup verbose. Mengambil input $a, lalu menetapkan variabel baru $bsebagai "lantai" dari $a/2. Menghasilkan rentang angka baru dari (0-$b)hingga $b, kemudian joinrentang dengan spasi, dan menjadikannya sebagai elemen kedua dari array dua elemen (elemen pertama adalah 0). Kemudian gunakan $a%2untuk mengindeks ke dalam array untuk output.

Versi alternatif menggunakan lebih banyak "tradisional" jika / aliran lain, pada 54 byte:

param($a)$b=$a/2-.5;if($a%2){(0-$b)..$b-join' ';exit}0

Sunting - Diperlukan untuk menambahkan beberapa logika untuk menghasilkan nilai falsey jika inputnya genap

AdmBorkBork
sumber
Hemat 3 byte dengan mengubah (0-$b)menjadi adil -$b. Juga, hanya mengalikan dengan *0akan menghasilkan string nol (mengevaluasi ke false di PowerShell). (lihat: codegolf.stackexchange.com/a/63005/45925 )
Jonathan Leech-Pepin
4

Haskell, 37 36 31 byte

g n=take(n*mod n 2)[-div n 2..]

Ketidakseimbangan ditunjukkan oleh daftar kosong. Contoh penggunaan: g 7-> [-3,-2,-1,0,1,2,3].

@ xnor ditemukan 5 byte. Terima kasih!

nimi
sumber
Apakah tidak ada cara untuk membuat kasing kosong sebagai syarat? Melakukan g n=[x|x<-[-div n 2..(n+1)/2],odd n]sama panjang.
xnor 15
34:g n=[1|odd n]>>[-div n 2..div n 2]
xnor
Anda harus mengeditnya, itu adalah perubahan kecil.
xnor
g n=[1|odd n]>>take n[-div n 2..]juga menyimpan char.
xnor 15
1
@ xnor: Anda memutarnya lebih cepat daripada saya dapat mengedit posting saya.
nimi
4

JavaScript (ES6), 44 43 42 41 byte

dicoret 44 masih teratur 44; (

n=>[...Array(n&1&&n--)].map((x,i)=>i-n/2)

Untuk input ganjil, mengembalikan panjang array bilangan bulat x, berpusat di 0; bahkan, pengembalian 0. Saya pikir ini sesingkat yang bisa didapat. (Menyimpan beberapa byte berkat @ edc65 dan @ ן nɟuɐɯɹɐ ן oɯ!)

Alternatif ES6: (42 byte, terima kasih kepada @intrepidcoder)

x=>x%2&&[for(y of Array(x--).keys())y-x/2]

Saran diterima!

Produksi ETH
sumber
Menggunakan x%2&&[for(y of...]menghemat satu byte.
intrepidcoder
ES6, 43, n=>Array(n&1&&n--).fill().map((x,i)=>i-n/2)jika mengembalikan array kosong diizinkan
edc65
@intrepidcoder Terima kasih! Saya sudah mengubah ini.
ETHproduksi 3-15
@ edc65 Terima kasih juga! Saya telah menambahkan ini ke dalam jawabannya.
ETHproduksi 3-15
x=>x%2&&[for(y of Array(x--).keys())y-x/2]adalah 42.
intrepidcoder
3

Minkolang 0,10 , 18 byte

nd2%?.d2:~r[dN1+].

Penjelasan

n          Take input as integer (k)
d2%?.      Duplicate k and stop if it's even
d2:~       Duplicate k, then divide by 2 and negate to get first number
r          Put k on top
[    ].    Loop k times and then stop
 dN1+      Duplicate, output as integer, and increment
El'endia Starman
sumber
3

J, 12 byte

i:@%~2&!*2&|

Ini adalah kata kerja monadik yang mengembalikan 0(falsy) untuk bilangan genap. Cobalah online dengan J.js .

Uji coba

   (i:@%~2&!*2&|) 3
_1 0 1
   (i:@%~2&!*2&|) 2
0

Bagaimana itu bekerja

              Right argument: y
         2&|  Take y modulo 2.
     2&!      Calculate y C 2 = y(y-1)/2.
        *     Multiply the results.
   %~         Divide the product by y.
              This yields (y-1)*(y%2)/2 = (y-1)/2 (y even) | 0 (y odd).
  @           Take the result and...
i:              apply the bilateral index generator z -> (-z ... z).
Dennis
sumber
3

DUP , 31 byte

[a:a;2/b:[b;_[$b;<][$1+]#][0]?]

Try it here.

Lambda anonim Pemakaian:

5[a:a;2/b:[b;_[$b;<][$1+]#][0]?]!

Penjelasan

[                             ] {lambda}
 a:                             {store input to a}
   a;2/                         {divmod a by 2}
       b:                       {store quotient to b, top of stack is now remainder}
         [               ][ ]?  {conditional}
          b;_                   {if remainder is 1, get b and negate it}
             [    ][   ]#         {while loop}
              $b;<                {while top of stack is less than b}
                    $1+           {duplicate and increment}
                           0    {otherwise, leave falsy value}
Kat
sumber
2

Python 2, 34 32 Bytes

Saat ini saya tidak yakin apakah saya dapat menampilkan apa pun yang saya inginkan jika tidak seimbang, jadi saat ini ini hanya mengembalikan daftar kosong dalam kasus basis yang tidak seimbang. Ini adalah fungsi lambda anonim, jadi beri nama untuk menggunakannya.

lambda k:k%2*range(-k/2+1,-~k/2)
Kade
sumber
Jika ya k%2*, Anda dapat menghindari parens.
xnor 15
2

CJam, 13 12 byte

{_2md@,@f-*}

Ini adalah fungsi anonim yang mengeluarkan bilangan bulat dari tumpukan dan mendorong array digit (basis ganjil) atau array kosong (basis datar) sebagai imbalannya. Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

_          e# Copy the input (N).
 2md       e# Push N/2 and N%2.
    @      e# Rotate N on top of the stack.
     ,     e# Push [0 ... N-1].
      @    e# Rotate N/2 on top of the stack.
       f-  e# Subtract N/2 from each element of [0 ... N-1].
         * e# Repeat the resulting array N%2 times.
Dennis
sumber
2

O, 18

M(.e\2/.@{_}dmrr]p

Demo langsung.

kirbyfan64sos
sumber
5
Apakah ada bahasa untuk setiap huruf besar dalam alfabet Inggris ?!
Conor O'Brien
Mereka juga harus terdaftar dalam urutan yang meningkat.
Geobits
@MickeyT Memperbaiki itu dengan biaya 5 byte.
kirbyfan64sos
@ Geobits Memperbaiki itu juga.
kirbyfan64sos
2
@CᴏɴᴏʀO'Bʀɪᴇɴ Ada pasangan yang tersedia
fase
2

Vitsy, 27 25 Bytes

Aku akan main golf ini besok, tapi aku benar-benar harus pergi tidur sekarang.

D2M) [& 1] D1-i *} \ [D2 / NaO2 +]
D Gandakan input.
 2M) [& 1] Jika inputnya genap (input% 2 = 0) buat stack baru
                              dan dorong 1 ke sana.
        D Gandakan nilai teratas - jika tidak genap, ini akan menjadi input. Kalau tidak, itu satu.
         1- Kurangi satu (untuk menyeimbangkan sekitar nol)
           i * Secara positif membalikkan
             } Geser item di tumpukan - ini memastikan hal itu
                              kami memiliki input atau satu di atas.
              \ [] Ulangi input kali.
                D2 / N Gandakan item teratas dan cetaklah.
                    aO Newline (Saya cukup yakin ini adalah pemisahan yang valid)
                      2+ Tambahkan satu ke item atas tumpukan.
Addison Crump
sumber
"Final global var" yang kedengarannya intens
Conor O'Brien
3
Ini adalah intens.
Addison Crump
@CᴏɴᴏʀO'Bʀɪᴇɴ intensitas meningkat
Addison Crump
2

TeaScript , 16 byte 18

x%2Þr(xØ)ßl-x/2)

Cukup mudah. Karakter khusus sebenarnya hanya "singkatan" untuk urutan kode yang lebih panjang.

Saya masih belum membuat permalink sehingga Anda harus menyalin paste ke juru bahasa

Penjelasan

x%2 &&    // If x is NOT even return falsy, else...
r(x--)    // Range 0-input. Subtracts one from input
m(#       // Loop through range
  l-      // Current item in loop, minus...
    x/2   // input - 1, divided by two
)

Jawaban ini tidak bersaing

Downgoat
sumber
Saya harus menerapkan singkatan char khusus ini ke Japt. :) BTW, apakah Anda yakin Ω adalah 1 byte?
ETHproduk
@ ETHproductions Aww :( lupa untuk memeriksa itu sebelum saya menerapkannya. Saya akan memperbaikinya di komit berikutnya
Downgoat
1
@ Vɪʜᴀɴ Nah, ini tantangan / kekhasan yang bagus yang membuat hal-hal menarik. Selain itu, karakter yang tidak diinginkan terlihat keren.
Mama Fun Roll
4
@ ן nɟuɐɯɹɐ ן oɯ Selama Anda benar-benar dapat melihatnya. Di ponsel saya, bahkan nama bahasa Anda pun tidak terlihat. : P
Dennis
2
@Dennis Ini menambah aura misterius bahasa ...
Mama Fun Roll
2

F #, 38 byte

Hasil falsey adalah daftar kosong.

let O n=if n%2<1 then[]else[-n/2..n/2]
Makanan Tangan
sumber
2

𝔼𝕊𝕄𝕚𝕟, 21 karakter / 37 byte

ô[…Ѧ(ï&1⅋ï‡)]ć⇀_-ï/2⸩

Try it here (Firefox only).

Inilah jawaban 20-char / 35-byte (tidak bersaing, karena jawaban tersebut menggunakan perubahan yang diterapkan setelah pertanyaan diajukan):

ô(ï%2⅋ѨĶ(ï‡)ć⇀$-ï/2⸩

Try it here (Firefox only).

Mama Fun Roll
sumber
2

Japt, 21 19 byte

Japt adalah versi singkat dari Ja vaScri pt .

U%2&&(X=-U/2+K o1-X

Untuk input ganjil, mengembalikan panjang array bilangan bulat x, berpusat di 0; bahkan, menghasilkan 0. Terjemahan JS kasar:

output(U%2&&(X=-U/2+.5).range(1-X));

di mana x.range(y)membuat daftar bilangan bulat dari xke y. Uji secara online!


Di Japt modern, ini hanya 11 byte:

u ©Uo-U/2-½

Cobalah online!

Produksi ETH
sumber
5
Kepada siapa pun yang menolak jawaban ini, dapatkah Anda menjelaskan alasannya? Saya ingin tahu di mana kesalahan saya sehingga saya bisa memperbaikinya. Terima kasih. :-)
ETHproduk
3
Mungkin mereka tidak suka bahasanya? (Saya suka bahasanya, meskipun saya bisa melihat bagaimana orang lain mungkin tidak.)
Conor O'Brien
1

R, 30 byte

function(n)(x=(1-n)/2*n%%2):-x

Kira-kira, x:-xmengembalikan bilangan bulat dari xke -x, di mana saya set xke (1-n)/2. Saya juga menggunakan faktor modulo-2 n%%2dalam definisi xuntuk memaksa xke nol ketika ngenap, dalam hal ini, 0:0pengembalian 0(falsey).

flodel
sumber
1

Perl, 36 byte

Saya merasa ini bisa disingkat:

$,=$";$n=<>;print$n%2?-$n/2..$n/2:0;

Range memperlakukan float sebagai bilangan bulat, jadi, misal 5/2 = 2.5 dikonversi secara diam-diam menjadi 2.

(Jika pemformatan tidak masalah, maka hapus $,=$";total 30 byte).

ChicagoRedSox
sumber
1

Powershell, 49 byte

param($a)$b=$a/2-.5;"[$(-$b..$b-join",")]"*($a%2)

Bahkan angka dievaluasi $falsekarena mereka memberikan output garis kosong.

("[$(-$b..$b-join",")]"*($a%2))-eq $True ===> False

Angka ganjil menghasilkan string referensi yang tepat. Anda dapat menyimpan 4 byte lagi (sekarang 45) dengan menghapus []dari string output.

PS> .\balanced.ps1 4


PS> .\balanced.ps1 5
[-2,-1,0,1,2]

PS> .\balanced.ps1 0


PS> .\balanced.ps1 1
[0]

PS> 

Powershell, 36 Bytes

param($a)$b=$a/2-.5;(-$b..$b)*($a%2)

Ini memiliki hasil falsey yang sama tetapi menampilkan daftar angka yang dipisahkan oleh baris baru:

PS> .\balanced-newline.ps1 4

PS> .\balanced-newline.ps1 1
0

PS> .\balanced-newline.ps1 5
-2
-1
0
1
2

PS>
Jonathan Leech-Pepin
sumber
1

Perl 6, 25 byte

Ekspresi lambda terpendek yang bisa saya buat dengan yang menampilkan daftar daripada rentang adalah:

{$_%2&&|((1-$_)/2..$_/2)} # 25

Pengujian:

for 0..10 -> $a {
  if {$_%2&&|((1-$_)/2..$_/2)}($a) -> $b {
    say "$a.fmt('%5s')  $b"
  } else {
    say "$a.fmt('%5s')  False"
  }
}
    0  False
    1  0
    2  False
    3  -1 0 1
    4  False
    5  -2 -1 0 1 2
    6  False
    7  -3 -2 -1 0 1 2 3
    8  False
    9  -4 -3 -2 -1 0 1 2 3 4
   10  False

Ini mengambil keuntungan dari fakta bahwa Perl 6 memperlakukan angka tersebut 0sebagai nilai palsu. Jika output harus persis FalseAnda dapat menggantinya $_%2dengan $_!%%2.

Brad Gilbert b2gills
sumber
1

05AB1E , 8 byte (tidak bersaing)

Bahasa ini mengungguli tantangan dan karenanya tidak bersaing. Kode:

È#¹;D(ŸR

Cobalah online!

Penjelasan:

È#        # If input % 2 == 0, end the program
  ¹       # Push the first input from the register
   ;      # Halve, push input / 2 rounded down
    D     # Duplicate top of the stack
     (    # Negate
      Ÿ   # Inclusive range, pushes [a .. b]
       R  # Reverse the array

Menggunakan pengodean CP-1252 .

Adnan
sumber
0

PHP, 50 byte

<?=($n=$argv[1])&1?join(_,range(-$k=$n/2|0,$k)):0;

program, mengambil input dari STDIN, mencetak _daftar terbatas atau 0.

atau

function f($n){return$n&1?range(-$k=$n/2|0,$k):0;}

fungsi mengambil argumen, mengembalikan array atau 0.

Titus
sumber
0

Java, 145 byte

public class c{static void c(int n){for(int i=n/2*-1;i<=n/2;i++){if(n%2==0){System.out.print("false");break;}System.out.print(i);}}}

Penjelasan: Maaf, saya tahu ini sangat panjang. Saya tidak melihat jawaban untuk java jadi saya memutuskan untuk memasukkannya. Beri tahu saya jika saya perlu menulis fungsi utama (Saya tidak yakin apakah itu kebijakannya atau tidak). Pada dasarnya ini membagi angka dengan dua dan mengalikannya dengan -1 untuk batas bawah dan untuk batas atas hanya menggunakan angka dibagi dua. Saya agak baru di halaman ini, jadi jika saya tidak memformat apa pun, beri tahu saya. Juga, saya tahu bahwa jawaban dapat disingkat dengan fungsi lambda tetapi saya tidak tahu bagaimana menggunakannya dan saya tidak yakin apakah Java mendukungnya.

Ini adalah versi yang lebih mudah dibaca yang tidak terlalu golf:

public class StackOverflow {
static void c(int n){
    for (int i = n/2*-1; i<=n/2; i++){
        if(n%2==0){
            System.out.print("false");
            break;
        }
        System.out.print(" " + i);
    }
}
}
Henry
sumber
Aturan normalnya adalah Anda perlu menulis sebuah program atau fungsi. Di Jawa, suatu fungsi akan hampir selalu lebih pendek (terutama karena memungkinkan Anda menghasilkan melalui return- nilai pengembalian adalah bentuk yang sah dari keluaran - daripada perlu untuk digunakan System.out, meskipun dalam hal ini untuk returnbekerja Anda harus menyimpan sebagian daftar yang dibangun dalam sebuah string). Java terbaru mendukung lambda, dan biasanya keluar lebih pendek dari definisi fungsi "biasa". (Juga, mengapa spasi putih terkemuka?)
@ ais523 Ruang putih terkemuka hanya kebiasaan pribadi saya dan saya tidak memasukkannya dalam hitungan byte, saya kira saya harus menyingkirkannya. Terima kasih untuk bantuannya!
Henry
0

Ruby, 25 byte

->n{n%2>0&&[*(-n/=2)..n]}
GB
sumber
0

Ruby, 27 byte

->n{[*0-n/2..n/2]if n.odd?}

Membuat fungsi lambda anonim yang akan mengembalikan array nangka yang paling dekat dengan 0 jika n ganjil, dan mengembalikan nil (nilai falsey dalam ruby) jika tidak.

Ruby mengitari divisi integernya menuju -infinity, tetapi 0-n/2lebih pendek dari -n/2+1(karena tanda minusnya ada di sana), dan karena n sekarang dianggap positif, pembulatan bekerja sesuai keinginan saya.

Versi Lama (28 byte)

->n{[*-n/2+1..n/2]if n.odd?}
IMP1
sumber