Bện thuật toán - cho ngày của mẹ


11

Bài tập:

Nhiệm vụ của bạn là tạo ra một chương trình, khi được cung cấp một số chuỗi và số lần lặp của một bím tóc, sẽ cho biết mỗi chuỗi đi đâu. Các quy tắc như sau:

  • Số lượng các chuỗi sẽ luôn là số lẻ và từ 3 đến 6000 (đã bao gồm)
  • Khi bạn bắt đầu, các chuỗi sẽ được chia thành 2 (gần như) bó bằng nhau, leftright. Các leftsẽ có một sợi hơn khi bạn bắt đầu.

Đối với đầu vào là 7:

/ / / / \ \ \
1 2 3 4 5 6 7
  • Mỗi lần lặp lại, chuỗi ngoài cùng của bên có nhiều chuỗi sẽ được đặt ở trung tâm đối diện với hướng ngược lại. Trung tâm được định nghĩa là giữa các sợi đối diện : ////middle\\\.

Lặp lại 1 đầu vào 7 (chuỗi 1 đã được chuyển đến trung tâm):

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

Thí dụ:

Đầu vào:

3 4

Tính toán:

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

Đầu ra:

3 1 2

Quy tắc:

  • Bạn không cần hiển thị dấu gạch chéo cho hướng chuỗi, chỉ các số.
  • Bạn chỉ cần hiển thị các số sau lần lặp cuối cùng.
  • Đầu ra của bạn sẽ là id phân định không gian của các chuỗi
  • Đầu vào sẽ có dạng: strands [space] iterations
  • Số lượng các chuỗi sẽ luôn là số lẻ và 3 <= x <= 6000
  • Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng!

3
Nó sẽ không phải là 3 đến 5999 vì 6000 không phải là số lẻ nên bạn sẽ không có 'tới 6000'?
kitcar2000

Vì vậy, đầu ra cho 11 2sẽ là 2345611178910?
Martin Ender

1
@Howard Trình của bạn đã phá vỡ sự thay đổi của tôi
TheDoctor

1
@TheDoctor Câu trả lời của tôi đã có trước khi bạn thay đổi.
Howard

1
Tôi nghĩ rằng ví dụ của bạn nên đọc 123 -> 213 -> 231 -> 321 -> 312.
Howard

Câu trả lời:


6

GolfScript, 33 ký tự

~\),(@{:^1$[=]:y-.,2//y*^~}*;' '*

Đầu vào phải được cung cấp trên stdin.

Ví dụ (bạn có thể kiểm tra trực tuyến ):

> 7 1
2 3 4 1 5 6 7

> 3 4
3 1 2

> 11 2
2 3 4 5 6 11 1 7 8 9 10

6

Python: 179 240 , 152 ký tự

Đầu tiên, 179

Đối với các Nchuỗi và ilặp, câu trả lời này sử dụng O(1)không gian và O(N)thời gian. Tôi chỉ đơn giản là tính toán vị trí kết thúc của mỗi chuỗi, không bao giờ lặp qua các vị trí trung gian!

chỉnh sửa lớn: đánh golf câu trả lời này bằng cách thay đổi các điều kiện thành đại số boolean. Tôi cũng đã viết một lời giải thích dài về cách nó hoạt động. TL; DR: mô hình công thức, phân chia modulo.

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

Bây giờ là 152

Đây là con trăn chơi golf hợp lý hơn. (chỉnh sửa: cảm ơn Alex Thornton vì đã chỉnh sửa từ 165 đến 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)

Đã chơi gôn thậm chí còn xuống tới 151 nếu bạn quan tâm: pastebin.com/1pbwax6s
Alex Thornton

thay đổi đơn giản, nhưng rất hiệu quả. cảm ơn!
sai

Tôi nghĩ bạn có thể cắt nó xuống hơn nữa bằng cách loại bỏ các lvcác biến và thay đổi insertđến một giao lát.
user2357112 hỗ trợ Monica

Tôi chắc rằng golf có thể ngắn hơn. Thành thật tôi chỉ mong nhận xét về người đầu tiên nếu có bất cứ điều gì!
sai

Dù sao tôi cũng đã viết một lời giải thích và cập nhật bài viết :)
sai

2

Python 2 (109) / Python 3 (121)

Con trăn 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,

Con trăn 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=' ')

Mã phải được Python 2 mua chuộc để thể hiện lợi thế chơi gôn của nó so với Python 3: các phạm vi là danh sách, phân chia làm tròn thành một int, in không bắt đầu một dòng mới. Điều kỳ lạ 0-i%2là vì -i%2đánh giá là (-i)%2.

Có lẽ có một cách tiếp cận hiệu quả hơn lặp đi lặp lại, cụ thể là tính toán trực tiếp từng kết quả cuối cùng. Hoạt động bện có thời gian 2 * s, vì vậy nó không thể phức tạp như vậy.


2

Hồng ngọc, 105

Chỉ cần nhiều thao tác thiết lập. Đẩy, bật, đảo ngược và thay đổi! Tôi đã cố gắng không chuyển đổi đầu vào thành số nguyên, nhưng nó đã thêm khoảng 20 ký tự.

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)*' '

lr( leftright) là hàng đợi "luồng". rightđược đảo ngược để chúng ta bắt đầu kéo từ bên ngoài.

tf( tofrom) bắt đầu như rightleft, tương ứng, nhưng khi chúng ta tiếp tục hoán đổi chúng để chúng ta luôn có thể chuyển "luồng" cuối cùng từ fromvà đẩy nó sang to( f,t=t<<f.shift,f). Điều này tiết kiệm rất nhiều không gian.

Sau đó, chúng tôi chỉ đảo ngược rightở cuối.

Thay đổi:

2.2 105 oh yeah, bản đồ có thể mất một Proc

2.1 108 Và thực tế, chỉ cần lật mọi thứ như một phần của thao tác.

2.0 116 không sử dụng mảng tạm thời đó. Thay vào đó sử dụng hai biến con trỏ, chúng ta có thể thao tác và tiếp tục trỏ lại. Sau đó chỉ hiển thị kết thúc

1.0 123 ý tưởng ban đầu


0

Java, 270 ký tự

đánh gôn

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

không chơi gôn

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

Chạy trên đường

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.