Plecionka algorytmiczna - na dzień matki

11

Zadanie:

Twoim zadaniem jest stworzenie programu, który, biorąc pod uwagę liczbę nici i liczbę iteracji warkocza, powie, gdzie idzie każda nić. Zasady są następujące:

  • Liczba pasm będzie zawsze nieparzysta i będzie wynosić od 3 do 6000 (włącznie)
  • Kiedy zaczniesz, nici zostaną podzielone na 2 (prawie) równe pęczki, leftoraz right. leftBędzie miał jeszcze jedną nić po uruchomieniu.

Dla wejścia 7:

/ / / / \ \ \
1 2 3 4 5 6 7
  • Podczas każdej iteracji najbardziej zewnętrzna część boku z większą liczbą pasm zostanie umieszczona na środku w kierunku przeciwnym. Środek jest zdefiniowany między przeciwnych nici przeciwległych: ////middle\\\.

1 iteracja wejścia 7 (nić 1 została przesunięta na środek):

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

Przykład:

Wejście:

3 4

Obliczenia:

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

Wynik:

3 1 2

Zasady:

  • Nie trzeba wyświetlać ukośników dla kierunku nici, tylko liczby.
  • Musisz tylko wyświetlić liczby po ostatniej iteracji.
  • Twój wynik to rozdzielone spacjami identyfikatory pasm
  • Dane wejściowe będą miały postać: strands [space] iterations
  • Liczba pasm zawsze będzie nieparzysta, a 3 <= x <= 6000
  • To jest , więc wygrywa najkrótszy kod!
Doktor
źródło
3
Czy nie byłoby 3 do 5999, ponieważ 6000 nie jest dziwne, więc nie będziesz mieć „do 6000”?
kitcar2000
więc wynik 11 2byłby 2345611178910?
Martin Ender
1
@Howard Twoje zgłoszenie złamało moją zmianę
TheDoctor
1
@TheDoctor Moja odpowiedź była tam przed Twoją zmianą.
Howard
1
Myślę, że twój przykład powinien przeczytać 123 -> 213 -> 231 -> 321 -> 312.
Howard

Odpowiedzi:

6

GolfScript, 33 znaki

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

Dane wejściowe należy podać na standardowym wejściu.

Przykłady (możesz przetestować online ):

> 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
Howard
źródło
6

Python: 179 240 , 152 znaków

Po pierwsze, 179

W przypadku Nnici i iiteracji ta odpowiedź wykorzystuje O(1)przestrzeń i O(N)czas. Po prostu obliczam pozycję końcową każdego pasma, nigdy nie iterując po pozycjach pośrednich!

duża edycja: przejrzałem tę odpowiedź, zmieniając warunkową na algebrę logiczną. Napisałem też obszerne wyjaśnienie, jak to działa. TL; DR: wzory formalne, podział 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)),

Teraz 152

To jest bardziej rozsądny golfowy python. (edycja: dzięki Alexowi Thorntonowi za edycję od 165 do 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)
wrongu
źródło
Grałeś w golfa jeszcze bardziej do 151, jeśli jesteś zainteresowany: pastebin.com/1pbwax6s
Alex Thornton
proste zmiany, ale bardzo skuteczne. dzięki!
wrongu
Myślę, że można wyciąć go jeszcze bardziej poprzez usunięcie li vzmienne oraz zmianę insertdo przypisania plasterka.
użytkownik2357112 obsługuje Monikę
Jestem pewien, że golf może być krótszy. Szczerze mówiąc, oczekiwałem tylko komentarzy do pierwszego, jeśli w ogóle!
wrongu
I tak napisałem wyjaśnienie i zaktualizowałem post :)
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=' ')

Kod musiał zostać przekupiony przez Python 2, aby pokazać zalety gry w golfa w porównaniu do Pythona 3: zakresy są listami, podział zaokrągla w dół do liczby całkowitej, druk nie rozpoczyna nowej linii. Dziwne 0-i%2jest, ponieważ -i%2ocenia jako (-i)%2.

Prawdopodobnie istnieje bardziej wydajne podejście niż iteracja, a mianowicie bezpośrednie obliczanie każdego wyniku końcowego. Operacja oplatania ma okres 2 * s, więc nie może być tak skomplikowana.

xnor
źródło
2

Ruby, 105

Po prostu dużo manipulacji zestawem. Pchaj, pop, cofaj i przesuwaj! Próbowałem nie konwertować danych wejściowych na liczby całkowite, ale dodało to około 20 znaków.

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

li r(left i right) są kolejkami „wątkowymi”. rightjest odwrócony, więc zaczynamy ciągnąć z zewnątrz.

toraz f( toi from) zacząć jako rightileft , ale w miarę upływu czasu wymieniamy je, dzięki czemu zawsze możemy przesunąć ostatni „wątek” fromi przesunąć go do to( f,t=t<<f.shift,f). To oszczędza dużo miejsca.

Następnie po prostu cofamy rightna końcu.

Dziennik zmian:

2.2 105 o tak, mapa może zająć proc

2.1 108 I właściwie, po prostu przerzucaj rzeczy w ramach manipulacji.

2.0 116 nie używają tej tymczasowej tablicy. Zamiast tego użyj dwóch zmiennych wskaźnikowych, którymi możemy manipulować i ciągle przekierowywać. Następnie wyświetl tylko koniec

1.0 123 wstępny pomysł

Nie ten Charles
źródło
0

Java, 270 znaków

grał w golfa:

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

bez golfa:

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

Uruchom online

Hopper Hunter
źródło