การถักเปียขั้นตอน - สำหรับวันแม่


11

งาน:

งานของคุณคือการสร้างโปรแกรมที่เมื่อได้รับจำนวนของเส้นและจำนวนซ้ำของถักเปียจะบอกว่าแต่ละเส้นจะไปที่ไหน กฎมีดังนี้:

  • จำนวนของเส้นจะคี่เสมอและระหว่าง 3 และ 6000 (รวม)
  • เมื่อคุณเริ่มต้นเส้นจะถูกแบ่งออกเป็น 2 (เกือบ) ที่อัดแน่นเท่ากันและleft จะมีสาระอีกหนึ่งเมื่อคุณเริ่มต้นrightleft

สำหรับอินพุต 7:

/ / / / \ \ \
1 2 3 4 5 6 7
  • การวนซ้ำทุกครั้งเส้นด้านนอกสุดของด้านที่มีเส้นเพิ่มเติมจะถูกวางตรงกลางหันหน้าไปในทิศทางตรงกันข้าม ////middle\\\ศูนย์ถูกกำหนดให้เป็นระหว่างเส้นหันหน้าไปทางตรงข้าม

1 การวนซ้ำของอินพุต 7 (สาระ 1 ถูกย้ายไปที่กึ่งกลาง):

/ / / \ \ \ \
2 3 4 1 5 6 7

ตัวอย่าง:

การป้อนข้อมูล:

3 4

การคำนวณ:

1 2 3
 \
2 1 3
   /
2 3 1
 \
3 2 1
   /
3 1 2

เอาท์พุท:

3 1 2

กฎ:

  • คุณไม่จำเป็นต้องแสดงเครื่องหมายสแลชสำหรับทิศทางของสแตรนด์เท่านั้นที่เป็นตัวเลข
  • คุณจะต้องแสดงตัวเลขหลังการทำซ้ำครั้งล่าสุด
  • ผลลัพธ์ของคุณจะเป็นรหัสพื้นที่ที่ถูกกำหนดขอบเขต
  • ข้อมูลที่ป้อนจะอยู่ในรูปแบบ: strands [space] iterations
  • จำนวนของเส้นจะคี่เสมอและ 3 <= x <= 6000
  • นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ!

3
จะไม่เป็น 3 ถึง 5999 เพราะ 6,000 ไม่แปลกดังนั้นคุณจะไม่ 'สูงถึง 6000'
kitcar2000

ดังนั้นผลลัพธ์สำหรับ11 2จะเป็น2345611178910อย่างไร
Martin Ender

1
@Howard การส่งของคุณทำให้การเปลี่ยนแปลงของฉันพัง
TheDoctor

1
@TheDoctor คำตอบของฉันอยู่ที่นั่นก่อนการเปลี่ยนแปลงของคุณ
Howard

1
123 -> 213 -> 231 -> 321 -> 312ผมคิดว่าตัวอย่างของคุณควรอ่าน
Howard

คำตอบ:



6

Python: 179 240 , 152 ตัวอักษร

ครั้งแรกที่ 179

สำหรับNเส้นและiการวนซ้ำคำตอบนี้ใช้O(1)พื้นที่และO(N)เวลา ฉันแค่คำนวณตำแหน่งสุดท้ายของแต่ละเส้นเกลียวไม่วนซ้ำตำแหน่งกลาง!

ใหญ่แก้ไข: golfed คำตอบนี้โดยการเปลี่ยน conditionals เป็นพีชคณิตแบบบูล ฉันยังเขียนคำอธิบายที่ยาวถึงวิธีการทำงาน TL; DR: รูปแบบสูตร, การหารโมดูโล

from sys import *
N,i=map(int,stdin.readline().split())
h,t=N/2,3*N
f=lambda p:(p>N)*(t/2-(p&-2))+p/2+1
for s in xrange(N):print f((2*s+1+(s>h)*(t-4*s-2)+i*(N+1-N*(s!=h)))%(2*N)),

ตอนนี้เป็น 152

นี่คืองูหลาม golfed สมเหตุสมผลมากขึ้น (แก้ไข: ขอบคุณ Alex Thornton สำหรับการแก้ไขจาก 165 เป็น 152)

from sys import*;l=map;r=range;n,m=l(int,stdin.readline().split());b=r(1,n+1)
for k in r(m):v=b.pop((0,n-1)[k%2]);b.insert(n/2,v)
print' '.join(l(str,b)

ลองตีมันลงไปอีกถึง 151 หากคุณสนใจ: pastebin.com/1pbwax6s
Alex Thornton

การเปลี่ยนแปลงง่าย ๆ แต่มีประสิทธิภาพมาก ขอบคุณ!
misu

ฉันคิดว่าคุณสามารถลดมันลงได้อีกโดยการลบlและvตัวแปรและเปลี่ยนการinsertมอบหมายชิ้น
user2357112 รองรับ Monica

ฉันแน่ใจว่าสนามกอล์ฟจะสั้นลง สุจริตฉันแค่คาดว่าจะแสดงความคิดเห็นในครั้งแรกถ้ามีอะไร!
misu

ผมเขียนขึ้นอยู่ดีคำอธิบายและการปรับปรุงการโพสต์ :)
wrongu

2

Python 2 (109) / Python 3 (121)

Python 2

s,n=map(int,raw_input().split())
b=range(s)
for i in range(n):b[s/2:s/2]=[b.pop(0-i%2)]
for x in b:print x+1,

Python 3

s,n=map(int,input().split())
b=list(range(s))
for i in range(n):b[s//2:s//2]=[b.pop(0-i%2)]
for x in b:print(x+1,end=' ')

รหัสจะต้องได้รับการติดสินบนจาก Python 2 เพื่อแสดงความได้เปรียบในการเล่นกอล์ฟของ Python 3: ช่วงที่เป็นรายการส่วนที่ปัดเศษลงเป็น int พิมพ์ไม่เริ่มขึ้นบรรทัดใหม่ แปลก0-i%2เป็นเพราะประเมินเป็น-i%2(-i)%2

อาจมีวิธีที่มีประสิทธิภาพมากกว่าการวนซ้ำนั่นคือการคำนวณผลลัพธ์สุดท้ายแต่ละรายการโดยตรง การถักเปียมีระยะเวลา 2 * s ดังนั้นมันจึงไม่ซับซ้อน


2

ทับทิม, 105

เพียงจัดการชุดจำนวนมาก กดป๊อปย้อนกลับและเปลี่ยน! ฉันพยายามไม่แปลงอินพุตเป็นจำนวนเต็ม แต่เพิ่มขึ้นประมาณ 20 ตัวอักษร

n,i=$*.map(&:to_i)
f=l=(1..n).to_a
t=r=l.pop(n/2).reverse
i.times{f,t=t<<f.shift,f}
$><<(l+r.reverse)*' '

lและr( leftและright) เป็นคิว "เธรด" rightกลับด้านดังนั้นเราจึงเริ่มดึงจากด้านนอก

tและf( toและfrom) เริ่มจากrightและleftตามลำดับ แต่เมื่อเราไปเราจะทำการสลับพวกเขาเพื่อให้เราสามารถเปลี่ยน "เธรด" ล่าสุดจากfromและกดเป็นto( f,t=t<<f.shift,f) สิ่งนี้ช่วยประหยัดพื้นที่ได้มาก

จากนั้นเราก็ย้อนกลับrightในตอนท้าย

การเปลี่ยนแปลง:

2.2 105ใช่แล้วแผนที่สามารถรับพรได้

2.1 108และที่จริงเพียงแค่พลิกสิ่งต่าง ๆ เป็นส่วนหนึ่งของการจัดการ

2.0 116อย่าใช้อาร์เรย์ชั่วคราวนั้น ให้ใช้ตัวแปรพอยน์เตอร์สองตัวแทนเราสามารถจัดการและคงการชี้ซ้ำ จากนั้นแสดงเฉพาะจุดสิ้นสุด

1.0 123แนวคิดเริ่มต้น


0

Java, 270 ตัวอักษร

แข็งแรงเล่นกอล์ฟ:

import java.util.*;class B{public static void main(String[] a){int n=Integer.valueOf(a[0]),t=Integer.valueOf(a[1]),i=0;List<Integer> r=new ArrayList<Integer>();for(;i<n;i++){r.add(i+1);}for(i=0;i<t;i++){int k=i%2==0?0:n-1;r.add(n/2,r.remove(k));}System.out.println(r);}}

ยกเลิกแข็งแรงเล่นกอล์ฟ:

import java.util.*;
public class Braid {
    public static void main(String[] args) {
        int num = Integer.valueOf(args[0]);
        int iterations = Integer.valueOf(args[1]);

        //populate array
        List<Integer> arr = new ArrayList<Integer>();
        for (int i=0; i < num; i++) {
            arr.add(i+1);
        }
        for (int i=0; i < iterations; i++) {
            int index = i%2==0?0:num-1; 
            arr.add(num/2, arr.remove(index));
        }
        System.out.println(arr);
    }
}

ทำงานออนไลน์

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