Алгоритмічне плетіння - на день матері


11

Завдання:

Ваше завдання - створити програму, яка при дачі кількості прядок і кількості ітерацій коси підкаже, куди йде кожна пасмо. Правила такі:

  • Кількість пасм завжди буде непарною і буде від 3 до 6000 (включно)
  • Коли ви почнете, пасма будуть розділені на 2 (майже) рівні пучки, leftі right. У вас leftбуде ще одна нитка, коли ви почнете.

Для введення 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, оскільки 6000 не дивно, тому у вас не буде "до 6000"?
kitcar2000

Так вихід для 11 2буде 2345611178910?
Мартін Ендер

1
@Howard Ваше подання порушило мою зміну
TheDoctor

1
@TheDoctor Моя відповідь була перед вашими змінами.
Говард

1
Я думаю, ваш приклад повинен прочитати 123 -> 213 -> 231 -> 321 -> 312.
Говард

Відповіді:


6

GolfScript, 33 символи

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

Вхід повинен бути наданий на stdin.

Приклади (ви можете протестувати в Інтернеті ):

> 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

Пітон: 179 240 , 152 символи

По-перше, 179

Для Nниток та iітерацій ця відповідь використовує O(1)простір та O(N)час. Я просто обчислюю кінцеве положення кожної пасма, ніколи не повторюючи проміжні положення!

велика редакція: гольф цю відповідь змінивши умовні умови на булева алгебра. Я також написав тривале пояснення, як це працює. 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

Це більш розумно гольф пітон. (редагувати: дякую Алексу Торнтону за редагування від 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

прості зміни, але дуже ефективні. Дякую!
неправильно

Я думаю, ви могли б ще скоротити її, видаливши lі vзмінні, змінивши призначення insertна фрагмент.
user2357112 підтримує Моніку

Я впевнений, що гольф міг би бути коротшим. Чесно кажучи, я просто очікував коментарів до першого, якщо що!
неправильно

Я все-таки написав пояснення і оновив пост :)
неправильно

2

Пітон 2 (109) / Пітон 3 (121)

Пітон 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,

Пітон 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: діапазони - це списки, округлення поділу до цілої, друк, не починаючи новий рядок. Дивно 0-i%2, тому що -i%2оцінює як (-i)%2.

Можливо, існує більш ефективний підхід, ніж ітерація, а саме обчислення кожного кінцевого результату безпосередньо. Операція плетіння має період 2 * с, тому вона не може бути такою складною.


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

Ява, 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);
    }
}

Запустити онлайн

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.