สร้างวิธีเรียงสับเปลี่ยนของมด


13

บทนำ

ฉันกำหนดระดับของพีชคณิต antsy ในความท้าทายที่ก่อนหน้านี้ เพื่อเป็นการเตือนความจำการเปลี่ยนแปลงpของตัวเลขจาก0ถึงr-1นั้นน่ากลัวถ้าสำหรับทุก ๆ รายการp [i]ยกเว้นอันดับแรกมีบางรายการก่อนหน้านี้p [ik]ซึ่งp [i] == p [ IK] ± 1 ในฐานะที่เป็นจริงสนุกฉันยังระบุว่าสำหรับR ≥ 1มีว่า2 R-1พีชคณิต antsy ของความยาวR ซึ่งหมายความว่ามีการติดต่อแบบหนึ่งต่อหนึ่งระหว่างการเรียงสับเปลี่ยนของความยาวอาร์และอาร์คเวกเตอร์ไบนารีของความยาวr-1. ในการท้าทายนี้งานของคุณคือการนำจดหมายโต้ตอบไปใช้

งาน

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในเวกเตอร์ไบนารีของความยาว1 ≤ n ≤ 99 , และผลเปลี่ยนแปลง antsy ของความยาว1 + n การเรียงสับเปลี่ยนอาจเป็น 0-based ของ 1-based (แต่ต้องสอดคล้องกัน) และอินพุตและเอาต์พุตสามารถอยู่ในรูปแบบที่สมเหตุสมผล นอกจากนี้อินพุตที่ต่างกันจะต้องให้เอาต์พุตที่แตกต่างกันเสมอ นอกเหนือจากนั้นคุณมีอิสระที่จะคืนค่าสิ่งที่คุณต้องการ

จำนวนไบต์ต่ำสุดชนะ

ตัวอย่าง

พีชคณิต (0-based) เรียงสับเปลี่ยนของความยาว 4 คือ

0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
2 1 0 3
2 1 3 0
2 3 1 0
3 2 1 0

และโปรแกรมของคุณควรคืนหนึ่งในนั้นสำหรับแต่ละเวกเตอร์แปดบิตที่มีความยาว 3:

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

โปรแกรมสามารถใช้การแทนค่าจำนวนเต็มของแต่ละเวกเตอร์ไบนารีแทนได้หรือไม่
mbomb007

1
@ mbomb007 ไม่เพราะศูนย์นำหน้ามีความสำคัญ 0 1และ0 0 1ควรให้ผลลัพธ์ที่มีความยาวต่างกัน
Zgarb

คำตอบ:


3

เจลลี่ , 12 11 10 ไบต์

ḟẋLṭ+
0;ç/

ลองออนไลน์! หรือสร้างพีชคณิตทั้งหมดของความยาว 4

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

0;ç/   Main link. Argument: B (bit array)

0;     Prepend a 0 to B.
  ç/   Reduce [0] + B by the helper link.


ḟẋLṭ+  Helper link. Left argument: A (array or 0). Right argument: b (bit)

 ẋ     Repeat A b times, yielding A or [].
ḟ      Filter false; remove the elements of A or [] from A.
  L    Get the length of the resulting array.
       This yield len(A) if b = 0 and 0 if b = 1.
    +  Add b to all elements of A.
   ṭ   Tack; append the result to the left to the result to the right.

3

Python 2, 62 60 ไบต์

x=0,
for n in input():x=[t-n+1for t in x]+[n*len(x)]
print x

ขอบคุณ @xnor สำหรับการเล่นกอล์ฟ 2 ไบต์!

ทดสอบบนIdeone


คุณต้องการเครื่องหมายจุลภาคx=0,หรือไม่
ETHproductions

0,เป็นสิ่งอันดับ หากไม่มีเครื่องหมายจุลภาคการจับคู่กับxจะล้มเหลว
เดนนิส

ฉันคิดว่าคุณสามารถพลิกnไปทำ[n*len(x)]และเปลี่ยนแผนที่เป็นรายการคอมพ์
xnor

@xnor แน่นอน ขอบคุณ!
เดนนิส

3

Python ขนาด 54 ไบต์

lambda l:[i-i*x+sum(l[i:])for i,x in enumerate([1]+l)]

ใช้ขั้นตอนต่อไปนี้:

  1. เติม 1 ลงในรายการ
  2. สำหรับแต่ละรายการ 0 เขียนตำแหน่งในรายการ 0 ดัชนี
  3. สำหรับแต่ละรายการเขียนหมายเลข 1 ของทางด้านขวาของมันไม่นับตัวเอง
  4. เพิ่มผลลัพธ์ของขั้นตอนที่ 2 และ 3 ตามเข็มนาฬิกา

ตัวอย่างเช่นl=[1,0,1,0]ให้f(l) == [2,1,3,0,4]

List with prepended 1         1 1 0 1 0

0-indexed position for 0's        2   4
Number of 1's to right        2 1 1 0 0
Sum of above two              2 1 3 0 4

การเตรียม 0 จะให้ผลเหมือนกัน enumerateเป็น clunky ผมจะดูว่าจะสามารถทำได้ดีกว่าซ้ำ


เทคนิคที่ฉลาด! มันน่าทึ่งที่เทคนิคต่างกันดีที่สุดในแต่ละภาษา ฉันพยายามย้ายสิ่งนี้ไปยัง JS แต่มันจบลงที่ 57 เนื่องจากการขาดsumและการแบ่งไวยากรณ์
ETHproductions

3

JavaScript (ES6), 48 47 45 ไบต์

a=>[h=l=0,...a.map(c=>c?--l:++h)].map(e=>e-l)

สิ่งนี้กลายเป็นคล้ายกับวิธีการ @ETHproductions ยกเว้นว่าฉันได้เริ่มต้นโดยการคำนวณองค์ประกอบแรกโดยตรงแล้วใช้ไบนารีเวกเตอร์เพื่อตรวจสอบว่าแต่ละหลักนั้นสูงหรือต่ำใหม่หรือไม่ แก้ไข: บันทึก 1 ไบต์ขอบคุณ @ETHproductions บันทึก 2 ไบต์โดยเริ่มจากศูนย์และปรับหลังจากนั้น วิธีการก่อนหน้าของฉันกลายเป็นคล้ายกับวิธีการของ @ Dennis แต่ใช้เวลา 54 ไบต์:

a=>a.reduce((r,b)=>[...r.map(e=>b+e),r.length*!b],[0])

2

Perl, 33 ไบต์

รวม +1 สำหรับ -p

ให้เวกเตอร์เป็นสตริงโดยไม่มีช่องว่างใน STDIN:

antsy.pl <<< 110

antsy.pl:

#!/usr/bin/perl -p
s%^|.%y/0//+($&?++$a:$b--).$"%eg

2

JavaScript (ES6), 52 ไบต์

v=>[...v,l=0].map(x=>x?l++:h--,h=v.length).reverse()

ทดสอบมัน:

f=v=>[...v,l=0].map(x=>x?l++:h--,h=v.length).reverse()
g=v=>console.log(f((v.match(/[01]/g)||[]).map(x=>+x)))
<input oninput="g(this.value)" value="010">

คำอธิบาย

สิ่งนี้ใช้ประโยชน์จากความจริงที่ว่าเมื่อมีการย้อนกลับการเรียงสับเปลี่ยนของแต่ละรายการจะเป็น 1 มากกว่าค่าสูงสุดของค่าต่ำสุดก่อนหน้าหรือ 1 น้อยกว่าค่าต่ำสุดของค่าสูงก่อนหน้านี้ โดยแสดงถึงรายการที่สูงขึ้นเป็น0และเป็นรายการที่ต่ำกว่าเป็น1เราสามารถสร้างที่แน่นอนหนึ่งต่อหนึ่ง correspondance ระหว่างพีชคณิต antsy ของความยาวnและเวกเตอร์ไบนารีของความยาวn - 1

สิ่งที่ดีที่สุดที่ฉันสามารถทำได้ด้วยเทคนิคของเดนนิสคือ57 51 ไบต์:

v=>v.reduce((x,n)=>[...x.map(i=>i+n),!n*++j],[j=0])
v=>v.map(n=>x=[...x.map(i=>i+n),!n*++j],x=[j=0])&&x

โซลูชันของ xnor คือ 56 (บันทึก 1 ไบต์ขอบคุณ @Neil):

l=>[1,...l].map((x,i)=>i*!x+eval(l.slice(i).join`+`||0))

i-i*xi*!xอาจจะเป็น
Neil

@ Neil Ah ใช่ขอบคุณ
ETHproductions

0

Haskell, 40 ไบต์

foldl(\r a->map(+0^a)r++[a*length r])[0]

วิธีการแก้ปัญหาหลามเดนนิส Golfs เยี่ยมยอดใน Haskell ด้วยและmap foldมันสั้นกว่าความพยายามของฉันในการสร้างพอร์ตสัญญาณเข้าของฉันโดยตรง:

f l=[i*0^x+sum(drop i l)|(i,x)<-zip[0..]$0:l]
f l=[a+c-b*c|(a,c,b)<-zip3(scanr(+)0l)[0..]$0:l]

0

แบตช์ 127 ไบต์

@set s=%*
@set/an=h=l=%s: =+%
@for %%b in (%*)do @call:%%b
:0
@echo %n%
@set/an=h+=1
@exit/b
:1
@echo %n%
@set/an=l-=1

รับอินพุตเป็นพารามิเตอร์บรรทัดคำสั่งเอาต์พุตถูกคั่นด้วยบรรทัด (เป็นไปได้ที่จะป้อนข้อมูลแบบคั่นด้วยช่องว่างบน STDIN โดยไม่มีค่าใช้จ่ายเพิ่มเติม)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.