N số gần nhất với số không giữ cân bằng


10

Mục tiêu : Cho một số nguyên dương n:

  • Nếu nlà số lẻ, hãy xuất danh sách các nsố gần nhất 0theo thứ tự tăng dần
  • Nếu nlà chẵn, xuất giá trị Falsey.

Các trường hợp thử nghiệm :

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

Thực hiện tham khảo

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>


Đầu ra có thể là một đối tượng phạm vi chứ không phải là một danh sách?
Brad Gilbert b2gills

@ BradGilbertb2gills Xin lỗi, một đối tượng phạm vi là đầu ra không hợp lệ.
Conor O'Brien

Danh sách trống không phải lúc nào cũng chập chờn.
SuperJedi224

@ SuperJedi224 Trong bối cảnh nào?
Conor O'Brien

Có các ngôn ngữ (IE Javascript) trong đó danh sách trống được coi là giá trị trung thực.
SuperJedi224

Câu trả lời:


4

Bình thường, 10 byte

*-R/Q2Q%Q2

Hãy thử trực tuyến.

Làm thế nào nó hoạt động

            (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

Cảm ơn @Dennis cho -2 byte!

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

Đây là một tàu đơn nguyên cung cấp một mảng trống cho đầu vào chẵn. Dưới đây là sơ đồ:

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

Đầu tiên, ⊢×2|⊢đưa ra lần đầu vào mod 2 của nó; nghĩa là, tỷ lệ cược sẽ tự cung cấp và evens cho 0. Chúng tôi sử dụng để tạo danh sách các số từ 1 đến đó ( ⍳0đưa ra mảng trống), và sau đó chúng tôi trừ đi một nửa đầu vào và sàn.


5

Toán học, 32 30 24 byte

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

Thủ thuật đánh gôn bằng mã: Đối số cuối cùng Andkhông nhất thiết phải là một boolean.


Bạn có thể lưu một byte bằng cách sử dụng dấu ngoặc Unicode cho Floor.
Martin Ender

Ngoài ra, Range[-a,a=...]dường như để làm việc, tiết kiệm một byte khác.
Martin Ender

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

4

PowerShell, 50 52 byte

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

Ôi. Câu trả lời khá dài dòng. Lấy đầu vào $a, sau đó đặt một biến mới $blà "sàn" của $a/2. Tạo một phạm vi số mới từ (0-$b)đến $b, sau đó joinlà phạm vi có khoảng trắng và có đó là phần tử thứ hai của mảng hai phần tử (phần tử đầu tiên là 0). Sau đó sử dụng $a%2để lập chỉ mục vào mảng đó cho đầu ra.

Phiên bản thay thế sử dụng luồng if / other "truyền thống" hơn, ở mức 54 byte:

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

Chỉnh sửa - Cần thêm một số logic để xuất giá trị falsey nếu đầu vào chẵn


Lưu 3 byte bằng cách thay đổi (0-$b)thành chỉ -$b. Ngoài ra, chỉ cần nhân với *0sẽ tạo ra một chuỗi null (ước tính thành false trong powershell). (xem: 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..]

Mất cân bằng được chỉ định bởi danh sách trống. Ví dụ sử dụng: g 7-> [-3,-2,-1,0,1,2,3].

@xnor tìm thấy 5 byte. Cảm ơn!


Có cách nào để làm cho trường hợp danh sách trống là một điều kiện? Làm g n=[x|x<-[-div n 2..(n+1)/2],odd n]cũng dài không kém.
xnor

34:g n=[1|odd n]>>[-div n 2..div n 2]
xnor

Bạn nên chỉnh sửa nó, đó là một thay đổi nhỏ.
xnor

g n=[1|odd n]>>take n[-div n 2..]cũng tiết kiệm một char.
xnor

1
@xnor: bạn đang chơi golf nhanh hơn tôi có thể chỉnh sửa bài viết của mình.
nimi

4

JavaScript (ES6), 44 43 42 41 byte

gạch bỏ 44 vẫn là 44 thường xuyên (

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

Đối với các đầu vào lẻ, trả về một mảng số nguyên có độ dài x, tập trung tại 0; cho chẵn, trả về 0. Tôi nghĩ rằng điều này là ngắn như nó có thể nhận được. (Đã lưu một vài byte nhờ @ edc65 và @ nɟuɐɯɹɐ ן oɯ!)

Thay thế ES6: (42 byte, nhờ @intrepidcoder)

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

Đề nghị chào mừng!


Sử dụng x%2&&[for(y of...]tiết kiệm một byte.
intrepidcoder

ES6, 43, n=>Array(n&1&&n--).fill().map((x,i)=>i-n/2)nếu trả về một mảng trống được cho phép
edc65

@intrepidcoder Cảm ơn! Tôi đã thay đổi điều này.
Sản xuất ETH

@ edc65 Cảm ơn là tốt! Tôi đã thêm điều này vào câu trả lời.
Sản xuất ETH

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

3

Chồn 0,10 , 18 byte

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

Giải trình

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&|

Đây là một động từ đơn âm trả về 0(falsy) cho các số chẵn. Dùng thử trực tuyến với J.js .

Chạy thử nghiệm

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

Làm thế nào nó hoạt động

              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 ẩn danh. Sử dụng:

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

Giải trình

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

Ngay bây giờ tôi không chắc mình có thể xuất bất cứ thứ gì tôi muốn hay không nếu nó không cân bằng, vì vậy hiện tại điều này chỉ trả về một danh sách trống trong trường hợp cơ sở có thể mất cân bằng. Đây là một hàm lambda ẩn danh, vì vậy hãy đặt tên cho nó để sử dụng nó.

lambda k:k%2*range(-k/2+1,-~k/2)

Nếu bạn làm như vậy k%2*, bạn có thể tránh các parens.
xnor

2

CJam, 13 12 byte

{_2md@,@f-*}

Đây là một hàm ẩn danh bật một số nguyên từ ngăn xếp và đẩy một mảng chữ số (cơ sở lẻ) hoặc một mảng trống (cơ sở chẵn) đổi lại. Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

_          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 byte

Tôi sẽ chơi golf này vào ngày mai, nhưng tôi thực sự nên đi ngủ bây giờ.

D2M) [& 1] D1-i *} \ [D2 / NaO2 +]
D Sao y đầu vào.
 2M) [& 1] Nếu đầu vào là chẵn (đầu vào% 2 = 0) tạo ra một ngăn xếp mới
                              và đẩy 1 vào nó.
        D Sao y giá trị hàng đầu - nếu không phải là số chẵn, đây sẽ là đầu vào. Nếu không, nó là một.
         1- Trừ đi một (để cân bằng khoảng 0)
           i * Đảo ngược
             } Chuyển qua một mục trong ngăn xếp - điều này đảm bảo rằng
                              chúng tôi có đầu vào hoặc một trên đầu trang.
              \ [] Lặp lại thời gian nhập.
                D2 / N Sao chép mục trên cùng và in ra.
                    aO Dòng mới (Tôi khá chắc chắn đây là phân tách hợp lệ)
                      2+ Thêm một vào mục trên cùng của ngăn xếp.

"Var toàn cầu cuối cùng" nghe có vẻ dữ dội
Conor O'Brien

3
Thật dữ dội.
Addison Crump

@ CᴏɴᴏʀO'Bʀɪᴇɴ intensifies cường
Addison Crump

2

TeaScript , 16 byte 18

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

Khá đơn giản. Các ký tự đặc biệt thực sự chỉ là "viết tắt" cho các chuỗi mã dài hơn.

Tôi vẫn chưa tạo permalinks để bạn sẽ phải sao chép dán vào trình thông dịch

Giải trình

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
)

Câu trả lời này là không cạnh tranh


Tôi nên thực hiện những chữ viết tắt char đặc biệt này vào Japt. :) BTW, bạn có chắc Ω là 1 byte không?
Sản phẩm ETH

@ETHproductions Aww :( quên kiểm tra điều đó trước khi tôi thực hiện điều đó. Tôi sẽ sửa nó trong lần cam kết tiếp theo
Downgoat

1
@ Vɪʜᴀɴ Nah, đó là một thử thách / giải quyết tốt đẹp khiến mọi thứ trở nên thú vị. Bên cạnh đó, chars không thể nhìn thấy mát mẻ.
Mama Fun Roll

4
@ Nɟuɐɯɹɐ ן oɯ Miễn là bạn thực sự có thể nhìn thấy chúng. Trên điện thoại của tôi, thậm chí không thấy tên ngôn ngữ của bạn . : P
Dennis

2
@Dennis Nó thêm vào hào quang bí ẩn của ngôn ngữ ...
Mama Fun Roll



2

Japt, 21 19 byte

Japt là phiên bản rút gọn của Ja vaScri pt .

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

Đối với các đầu vào lẻ, trả về một mảng số nguyên có độ dài x, tập trung tại 0; cho chẵn, trả về 0. Bản dịch JS thô:

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

nơi x.range(y)tạo ra một danh sách các số nguyên từ xđến y. Kiểm tra nó trực tuyến!


Trong Japt hiện đại, đây chỉ là 11 byte:

u ©Uo-U/2-½

Hãy thử trực tuyến!


5
Để bất cứ ai hạ thấp câu trả lời này, bạn có thể vui lòng giải thích tại sao? Tôi muốn biết tôi đã sai ở đâu để tôi có thể sửa nó. Cảm ơn. :-)
Sản phẩm ETH

3
Có lẽ họ không thích ngôn ngữ? (Tôi yêu ngôn ngữ này, mặc dù tôi có thể thấy những người khác có thể không như thế nào.)
Conor O'Brien

1

R, 30 byte

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

Đại khái, x:-xtrả về số nguyên từ xđến -x, nơi tôi đặt xđể (1-n)/2. Tôi cũng sử dụng yếu tố modulo-2 n%%2trong định nghĩa về xlực xbằng 0 khi ntrong trường hợp chẵn, trong trường hợp đó, 0:0trả về 0(falsey).


1

Perl, 36 byte

Tôi có một cảm giác điều này có thể được rút ngắn:

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

Phạm vi coi các số float là số nguyên, vì vậy, ví dụ 5/2 = 2.5 được chuyển đổi âm thầm thành 2.

(Nếu định dạng không thành vấn đề, thì hãy xóa $,=$";tổng cộng 30 byte).


1

Powershell, 49 byte

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

Các số chẵn được đánh giá $falsevì chúng cung cấp một đầu ra dòng trống.

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

Số lẻ xuất chuỗi tham chiếu chính xác. Bạn có thể lưu thêm 4 byte (ngay bây giờ 45) bằng cách xóa []chuỗi đầu ra.

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 byte

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

Điều này có cùng kết quả falsey nhưng đưa ra danh sách các số được phân tách bằng dòng mới:

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

Biểu thức lambda ngắn nhất tôi có thể đưa ra để đưa ra một danh sách thay vì một phạm vi là:

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

Kiểm tra:

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

Điều này lợi dụng thực tế là Perl 6 coi số đó 0là một giá trị sai. Nếu đầu ra phải chính xác, Falsebạn có thể thay thế $_%2bằng $_!%%2.


1

05AB1E , 8 byte (không cạnh tranh)

Ngôn ngữ hoãn thách thức và do đó không cạnh tranh. Mã số:

È#¹;D(ŸR

Hãy thử trực tuyến!

Giải trình:

È#        # 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

Sử dụng mã hóa CP-1252 .


0

PHP, 50 byte

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

chương trình, lấy đầu vào từ STDIN, in _danh sách phân cách hoặc 0.

hoặc là

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

Hàm lấy đối số, trả về mảng hoặc 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);}}}

Giải thích: Xin lỗi, tôi biết điều này thực sự dài. Tôi không thấy câu trả lời cho java nên tôi quyết định đặt một câu hỏi. Hãy cho tôi biết nếu tôi cần viết hàm chính (Tôi không chắc đó có phải là chính sách hay không). Về cơ bản, nó chia số cho hai và nhân nó với -1 cho giới hạn dưới và cho giới hạn trên, nó chỉ sử dụng số chia cho hai. Tôi là người mới đối với trang này vì vậy nếu tôi không định dạng bất cứ điều gì đúng thì hãy cho tôi biết. Ngoài ra, tôi biết rằng các câu trả lời có thể được rút ngắn bằng các hàm lambda nhưng tôi không biết cách sử dụng chúng và tôi không chắc liệu Java có hỗ trợ chúng không.

Đây là một phiên bản dễ đọc hơn mà ít chơi gôn hơn:

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

Quy tắc thông thường là bạn cần viết chương trình hoặc hàm. Trong Java, một hàm sẽ luôn luôn ngắn hơn (đặc biệt là khi nó cho phép bạn xuất qua return- giá trị trả về là một dạng đầu ra hợp pháp - thay vì cần sử dụng System.out, mặc dù trong trường hợp này returnđể làm việc bạn cần lưu trữ một phần danh sách xây dựng trong một chuỗi). Java gần đây không hỗ trợ lambdas và chúng thường xuất hiện ngắn hơn định nghĩa hàm "thông thường". (Ngoài ra, tại sao khoảng trắng hàng đầu?)

@ ais523 Khoảng trắng hàng đầu chỉ là thói quen cá nhân của riêng tôi và tôi đã không đưa nó vào số byte, tôi đoán tôi nên loại bỏ nó. Cảm ơn đã giúp đỡ!
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?}

Tạo một hàm lambda ẩn danh sẽ trả về mảng các nsố gần nhất bằng 0 nếu n là số lẻ và trả về nil (giá trị falsey trong ruby) nếu không.

Ruby làm tròn phép chia số nguyên của nó theo hướng vô cực, nhưng 0-n/2ngắn hơn -n/2+1(vì dấu trừ có ở đó) và vì bây giờ n được coi là dương, nên việc làm tròn có lợi cho tôi.

Phiên bản cũ (28 byte)

->n{[*-n/2+1..n/2]if n.odd?}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.