ตัวเลข N ใกล้เคียงกับการมีศูนย์สมดุล


10

วัตถุประสงค์ : ได้รับจำนวนเต็มบวกn:

  • ถ้าnเป็นเลขคี่ให้แสดงรายการของnตัวเลขที่ใกล้เคียงกับ0ลำดับที่เพิ่มขึ้น
  • ถ้าnเป็นเช่นนั้นให้ส่งออกค่า Falsey

กรณีทดสอบ :

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

การดำเนินการอ้างอิง

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>


เอาต์พุตสามารถเป็นวัตถุช่วงแทนที่จะเป็นรายการได้หรือไม่?
Brad Gilbert b2gills

@ BradGilbertb2gills ขออภัยวัตถุช่วงเป็นผลลัพธ์ที่ไม่ถูกต้อง
Conor O'Brien

รายการที่ว่างเปล่าไม่ได้เป็นเท็จ
SuperJedi224

@ SuperJedi224 ในบริบทใด
Conor O'Brien

มีหลายภาษา (IE Javascript) ซึ่งรายการว่างถือเป็นค่าความจริง
SuperJedi224

คำตอบ:



5

APL, 16 15 13 ไบต์

ขอบคุณ @Dennis สำหรับ -2 ไบต์!

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

รถไฟขบวนนี้เป็น monadic ที่ให้อาเรย์ที่ว่างสำหรับการป้อนข้อมูลแบบสม่ำเสมอ ด้านล่างเป็นแผนภาพ:

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

ก่อนอื่น⊢×2|⊢ให้อินพุตด้วย mod 2 นั่นคืออัตราต่อรองที่จะให้ตัวเองและ evens ให้ 0 เราใช้ในการสร้างรายการของตัวเลขจาก 1 ถึงที่ ( ⍳0ให้อาร์เรย์ที่ว่างเปล่า) จากนั้นเราลบครึ่งอินพุตและพื้น


5

Mathematica, 32 30 24 ไบต์

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

เคล็ดลับการเล่นกอล์ฟรหัส: อาร์กิวเมนต์สุดท้ายที่Andไม่จำเป็นต้องเป็นบูลีน


คุณสามารถบันทึกไบต์โดยใช้วงเล็บ Unicode Floorสำหรับ
Martin Ender

นอกจากนี้Range[-a,a=...]ดูเหมือนว่าจะทำงานประหยัดไบต์อีก
Martin Ender

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

4

PowerShell, 50 52 ไบต์

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

OOF คำตอบที่ค่อนข้างสวย จะเข้า$aแล้วกำหนดตัวแปรใหม่$bเป็น "ชั้น" $a/2ของ สร้างช่วงจำนวนใหม่จาก(0-$b)ถึง$bแล้วจึงjoinเป็นช่วงที่มีช่องว่างและมีช่วงนั้นเป็นองค์ประกอบที่สองของอาร์เรย์สององค์ประกอบ (องค์ประกอบแรกคือ0) จากนั้นใช้$a%2เพื่อจัดทำดัชนีในอาร์เรย์นั้นสำหรับเอาต์พุต

รุ่นอื่นที่ใช้กระแสข้อมูลแบบดั้งเดิมมากขึ้นถ้า / else มีขนาด 54 ไบต์

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

แก้ไข - จำเป็นต้องเพิ่มตรรกะบางอย่างเพื่อส่งออกค่าเท็จถ้าการป้อนข้อมูลเป็นคู่


บันทึก 3 ไบต์โดยการเปลี่ยนเพียงแค่(0-$b) -$bนอกจากนี้เพียงแค่คูณด้วย*0จะส่งออกสตริงว่าง (ประเมินเป็นเท็จใน PowerShell) (ดู: codegolf.stackexchange.com/a/63005/45925 )
Jonathan Leech-Pepin

4

Haskell, 37 36 31 ไบต์

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

ไม่สมดุลถูกระบุโดยรายการที่ว่างเปล่า ตัวอย่างการใช้งาน: ->g 7 [-3,-2,-1,0,1,2,3]

@xnor พบ 5 ไบต์ ขอบคุณ!


ไม่มีวิธีที่จะทำให้เงื่อนไขรายการว่างเปล่าเป็นเงื่อนไขหรือไม่? การทำg n=[x|x<-[-div n 2..(n+1)/2],odd n]มีความยาวเท่ากัน
xnor

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

คุณควรแก้ไขในมันเป็นการเปลี่ยนแปลงเล็กน้อย
xnor

g n=[1|odd n]>>take n[-div n 2..]ยังช่วยประหยัดถ่าน
xnor

1
@xnor: คุณกำลังเล่นกอล์ฟมันลงเร็วกว่าที่ฉันสามารถแก้ไขโพสต์ของฉัน
nimi

4

JavaScript (ES6), 44 43 42 41 ไบต์

ขีดฆ่า 44 ยังคงเป็นปกติ 44; (

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

สำหรับอินพุตคี่ส่งคืนอาร์เรย์ความยาวจำนวนเต็มxกึ่งกลางที่0; สำหรับแม้กระทั่งผลตอบแทน 0 ฉันคิดว่านี่สั้นที่สุดเท่าที่จะเป็นไปได้ (บันทึกสองสามไบต์ขอบคุณ @ edc65 และ @ ןnɟuɐɯɹɐןoɯ!)

ทางเลือก ES6: (42 ไบต์ขอบคุณ @intrepidcoder)

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

ยินดีต้อนรับข้อเสนอแนะ!


การใช้x%2&&[for(y of...]บันทึกไบต์
intrepidcoder

ES6, 43, n=>Array(n&1&&n--).fill().map((x,i)=>i-n/2)ถ้าอนุญาตให้ส่งคืนอาเรย์ที่ว่างเปล่าได้
edc65

@intrepidcoder ขอบคุณ! ฉันเปลี่ยนสิ่งนี้
ETHproductions

@ edc65 ขอบคุณเช่นกัน! ฉันได้เพิ่มสิ่งนี้ลงในคำตอบ
ETHproductions

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

3

Minkolang 0.10 , 18 ไบต์

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

คำอธิบาย

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 ไบต์

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

นี่คือคำกริยา monadic ที่ส่งกลับ0(falsy) สำหรับเลขคู่ ลองมันออนไลน์กับJ.js

ทดสอบการทำงาน

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

มันทำงานอย่างไร

              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 ไบต์

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

Try it here.

แลมบ์ดานิรนาม การใช้งาน:

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

คำอธิบาย

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

ตอนนี้ฉันไม่แน่ใจว่าฉันสามารถเอาท์พุทอะไรก็ได้ที่ฉันต้องการหากมันไม่สมดุลกันดังนั้นตอนนี้แค่ส่งคืนรายการเปล่าในกรณีฐานที่ไม่สมดุล มันเป็นฟังก์ชั่นแลมบ์ดานิรนามดังนั้นให้ตั้งชื่อเพื่อใช้งาน

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

หากคุณทำk%2*คุณสามารถหลีกเลี่ยงการ parens
xnor

2

CJam, 13 12 ไบต์

{_2md@,@f-*}

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ปรากฏจำนวนเต็มจากสแต็กและผลักอาร์เรย์หลัก (ฐานคี่) หรืออาร์เรย์ที่ว่างเปล่า (แม้ฐาน) ในทางกลับกัน ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

_          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

O, 18

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

การสาธิตสด


5
มีภาษาสำหรับตัวพิมพ์ใหญ่ทุกตัวอักษรภาษาอังกฤษหรือไม่!
Conor O'Brien

ควรระบุไว้ในลำดับที่เพิ่มขึ้นด้วย
Geobits

@MickeyT แก้ไขว่าด้วยราคา 5 ไบต์
kirbyfan64sos

@Geobits แก้ไขเช่นกัน
kirbyfan64sos


2

Vitsy, 27 25 ไบต์

พรุ่งนี้ฉันจะลงเล่นกอล์ฟนี้ แต่ฉันควรเข้านอนจริงๆ

D2M) [& 1] D1-i *} \ [D2 / NaO2 +]
D ป้อนข้อมูลซ้ำ
 2M) [& 1] หากอินพุตเป็นเลขคู่ (อินพุต% 2 = 0) จะสร้างสแต็กใหม่
                              และกด 1 ลงไป
        D ซ้ำค่าสูงสุด - ถ้ามันไม่เท่ากันนี่จะเป็นอินพุต มิฉะนั้นมันเป็นหนึ่ง
         1- ลบหนึ่ง (เพื่อความสมดุลประมาณศูนย์)
           i * กลับด้านเพิ่ม
             } เลื่อนไปที่ไอเท็มในสแต็ก - สิ่งนี้จะทำให้มั่นใจได้ว่า
                              เรามีทั้งอินพุตหรือหนึ่งอยู่ด้านบน
              \ [] ทำซ้ำเวลาอินพุต
                D2 / N ทำซ้ำรายการบนสุดแล้วพิมพ์ออกมา
                    aO Newline (ฉันค่อนข้างแน่ใจว่านี่คือการแยกที่ถูกต้อง)
                      2+ เพิ่มหนึ่งไปยังรายการด้านบนของสแต็ก

"var global สุดท้าย" ที่ฟังดูเข้มข้น
Conor O'Brien

3
มันเป็นรุนแรง
Addison Crump

ความเข้มของ
แอดดิสันครัม

2

TeaScript , 16 ไบต์18

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

ค่อนข้างง่าย อักขระพิเศษเป็นเพียง "ตัวย่อ" สำหรับลำดับรหัสที่ยาวขึ้น

ฉันยังไม่ได้ทำการเปลี่ยนแปลงดังนั้นคุณจะต้องคัดลอกแปะลงในล่าม

คำอธิบาย

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
)

คำตอบนี้ไม่ใช่การแข่งขัน


ฉันควรใช้ตัวย่อพิเศษพิเศษเหล่านี้ใน Japt :) BTW คุณแน่ใจΩคือ 1 ไบต์หรือไม่
ETHproductions

@ETHproductions Aww :( ลืมที่จะตรวจสอบก่อนที่ฉันจะนำมาใช้ฉันจะแก้ไขมันในการกระทำครั้งต่อไป
Downgoat

1
@ Vɪʜᴀɴ Nah มันเป็นความท้าทายที่ดี / การเล่นโวหารที่ทำให้สิ่งที่น่าสนใจ นอกจากนี้ตัวอักษรที่ไม่สามารถพิมพ์ได้จะดูดี
Mama Fun Roll

4
@ ןnɟuɐɯɹɐןoɯตราบใดที่คุณสามารถเห็นพวกเขาจริง ๆ ในโทรศัพท์ของฉันไม่เห็นแม้แต่ชื่อภาษาของคุณ : P
Dennis

2
@Dennis มันเพิ่มกลิ่นอายลึกลับของภาษา ...
Mama Fun Roll


2

𝔼𝕊𝕄𝕚𝕟, 21 ตัวอักษร / 37 ไบต์

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

Try it here (Firefox only).

ต่อไปนี้เป็นคำตอบ 20-char / 35-byte (ไม่ใช่การแข่งขันเนื่องจากคำตอบใช้การเปลี่ยนแปลงที่ดำเนินการหลังจากคำถามถูกถาม):

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

Try it here (Firefox only).


2

Japt, 21 19 ไบต์

Japtเป็นรุ่นสั้นJa vaScri พอยต์

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

สำหรับอินพุตคี่ส่งคืนอาร์เรย์ความยาวจำนวนเต็มxกึ่งกลางที่0; สำหรับคู่ส่งคืน 0 การแปล JS แบบหยาบ:

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

ที่x.range(y)สร้างรายชื่อของจำนวนเต็มจากไปx ทดสอบออนไลน์!y


ใน Japt ที่ทันสมัยนี่เป็นเพียง 11 ไบต์:

u ©Uo-U/2-½

ลองออนไลน์!


5
สำหรับผู้ที่ลงคะแนนคำตอบนี้คุณช่วยอธิบายได้ไหม ฉันต้องการทราบว่าฉันไปผิดที่ไหนฉันจึงสามารถแก้ไขได้ ขอบคุณ :-)
ETHproductions

3
บางทีพวกเขาอาจไม่ชอบภาษา? (ฉันรักภาษาแม้ว่าฉันจะเห็นว่าคนอื่นอาจไม่ได้)
Conor O'Brien

1

R, 30 ไบต์

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

ประมาณx:-xผลตอบแทนจำนวนเต็มจากxการ-xที่เราได้ตั้งไว้เพื่อx (1-n)/2ฉันยังใช้ตัวประกอบโมดูโล -2 n%%2ในคำจำกัดความของxการบังคับxให้เป็นศูนย์เมื่อnถึงแม้ในกรณีนี้0:0ผลตอบแทน0(เท็จ)


1

Perl, 36 ไบต์

ฉันรู้สึกว่ามันสั้นลง:

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

ช่วงถือว่าลอยเป็นจำนวนเต็มดังนั้นเช่น 5/2 = 2.5 ได้รับการแปลงเงียบเป็น 2

(หากการจัดรูปแบบไม่สำคัญให้ลบออก$,=$";ทั้งหมด 30 ไบต์)


1

Powershell, 49 ไบต์

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

แม้กระทั่งการประเมินตัวเลข$falseเนื่องจากพวกเขาให้ผลลัพธ์บรรทัดว่างเปล่า

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

ตัวเลขคี่จะส่งออกสตริงอ้างอิงที่แน่นอน คุณสามารถบันทึกได้อีก 4 ไบต์ (ตอนนี้45) โดยการลบ[]สตริงออก

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 ไบต์

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

สิ่งนี้มีผลลัพธ์ที่ผิดพลาดเหมือนกัน แต่เอาท์พุทรายการตัวเลขคั่นด้วยบรรทัดใหม่:

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 ไบต์

แลมบ์ดาที่สั้นที่สุดที่ฉันสามารถหาได้มีรายการมากกว่าช่วงคือ:

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

การทดสอบ:

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

นี่ใช้ประโยชน์จากความจริงที่ว่า Perl 6 ปฏิบัติต่อตัวเลข0เป็นค่าเท็จ หากการส่งออกจะต้องว่าFalseคุณสามารถแทนที่ด้วย$_%2$_!%%2


1

05AB1E , 8 ไบต์ (ไม่แข่งขัน)

ภาษานี้โพสต์ความท้าทายและดังนั้นจึงไม่ใช่การแข่งขัน รหัส:

È#¹;D(ŸR

ลองออนไลน์!

คำอธิบาย:

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

ใช้การเข้ารหัสCP-1252


0

PHP, 50 ไบต์

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

โปรแกรมใช้ข้อมูลจาก STDIN พิมพ์คั่นรายการหรือ_0

หรือ

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

0ฟังก์ชั่นใช้เวลาอาร์กิวเมนต์อาร์เรย์หรือผลตอบแทน


0

Java, 145 ไบต์

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

คำอธิบาย: ขออภัยฉันรู้ว่ามันยาวจริงๆ ฉันไม่เห็นคำตอบสำหรับ java ดังนั้นฉันจึงตัดสินใจที่จะใส่เข้ามาให้ฉันรู้ว่าฉันต้องเขียนฟังก์ชั่นหลัก (ฉันไม่แน่ใจว่านั่นเป็นนโยบายหรือไม่) โดยทั่วไปมันจะหารจำนวนด้วยสองแล้วคูณด้วย -1 สำหรับขอบเขตล่างและสำหรับขอบเขตบนมันก็แค่ใช้จำนวนหารด้วยสอง ฉันเป็นคนใหม่ในหน้านี้ดังนั้นหากฉันไม่ได้จัดรูปแบบอะไรให้แจ้งให้ฉันทราบ นอกจากนี้ฉันรู้ว่าคำตอบสามารถย่อลงด้วยฟังก์ชั่นแลมบ์ดา แต่ฉันไม่ทราบวิธีการใช้และฉันไม่แน่ใจว่า Java รองรับพวกเขาหรือไม่

นี่คือรุ่นที่อ่านได้มากขึ้นซึ่งเล่นกอล์ฟน้อยกว่า:

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

กฎปกติคือคุณต้องเขียนโปรแกรมหรือฟังก์ชั่น ใน Java ฟังก์ชั่นจะเกือบจะสั้นกว่าเสมอ (โดยเฉพาะอย่างยิ่งเมื่อมันให้คุณส่งออกผ่านreturn- ค่าส่งคืนเป็นรูปแบบที่ถูกต้องของเอาท์พุท - แทนที่จะต้องการใช้งานSystem.outแม้ว่าในกรณีนี้สำหรับreturnการทำงานที่คุณต้องการเก็บไว้บางส่วน รายการที่สร้างในสตริง) Java ล่าสุดรองรับ lambdas และปกติแล้วจะสั้นกว่าคำจำกัดความฟังก์ชัน "ปกติ" (นอกจากนี้ทำไมช่องว่างชั้นนำ?)

@ ais523 ช่องว่างชั้นนำเป็นเพียงนิสัยส่วนตัวของฉันและฉันไม่ได้รวมไว้ในการนับไบต์ฉันคิดว่าฉันควรกำจัดมัน ขอบคุณสำหรับความช่วยเหลือ!
Henry


0

Ruby, 27 ไบต์

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

สร้างฟังก์ชั่นแลมบ์ดานิรนามที่จะส่งกลับอาร์เรย์ nตัวเลขที่ใกล้เคียงกับ 0 มากที่สุดถ้า n เป็นเลขคี่และส่งกลับค่าศูนย์ (ค่าเท็จในทับทิม) เป็นอย่างอื่น

Ruby ปัดเศษเลขจำนวนเต็มไปยัง -infinity แต่ 0-n/2สั้นกว่า-n/2+1(เนื่องจากเครื่องหมายลบมีอยู่แล้ว) และเนื่องจากตอนนี้ถือว่า n เป็นค่าบวกการปัดเศษจึงเหมาะกับฉัน

รุ่นเก่า (28 ไบต์)

->n{[*-n/2+1..n/2]if n.odd?}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.