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>


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.

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.


5

Mathematica, 32 30 24 byte

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

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


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


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!


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!


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

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

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}

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)

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.


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.

"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


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]


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!


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


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


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>

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.


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 .


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.


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

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

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?}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.