Wydrukuj broszurę


39

Czytanie książki jest łatwe, ale wydrukowanie książki może być nieco trudne. Podczas drukowania broszury drukarka musi ułożyć strony w określony sposób, aby można je było czytać od lewej do prawej. Aby to zrobić, należy użyć wzoru podobnego do poniższego

n, 1, 2, n-1, n-2, 3, 4, n-3, n-4, 5, 6, n-5, n-6, 7, 8, n-7, n-8, 9, 10, n-9, n-10, 11, 12, n-11…

Przypadki testowe

4-stronicowa broszura: 4, 1, 2, 3

8-stronicowa broszura: 8,1,2,7,6,3,4,5

12-stronicowa broszura: 12,1,2,11,10,3,4,9,8,5,6,7

16-stronicowa broszura: 16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9

20-stronicowa broszura: 20,1,2,19,18,3,4,17,16,5,6,15,14,7,8,13,12,9,10,11

Zadanie

Twoim zadaniem jest, biorąc pod uwagę liczbę całkowitą nbędącą wielokrotnością 4, wyświetlanie tablicy liczb, których można użyć do wydrukowania książki nstron.

Uwaga: Dopóki dane wyjściowe generują poprawne liczby, niezależnie od tego, czy są rozdzielone spacjami, przecinkami, łącznikami lub nawiasami, można zastosować dowolną metodę uzyskania rozwiązania

To jest pytanie w więc odpowiedzi będą oceniane w bajtach, przy najmniejszej liczbie wygranych bajtów.


Czy mamy gwarancję, że dane wejściowe zawsze będą podzielne przez 4, a nawet liczbę parzystą? Tak czy inaczej, czy mógłbyś dodać jeszcze kilka przypadków testowych? I witamy w PPCG :)
Shaggy

8
Witamy w PPCG i miłym pierwszym wyzwaniu! Pamiętaj, że zalecamy opublikowanie nowych wyzwań w piaskownicy przed ich opublikowaniem.
Oliver Ni

1
Twój wkład musi być wielokrotnością 4
tisaconundrum

1
Byłoby miło (ale może trywialnie) wesprzeć dowolną wartość, wypełniając puste strony w razie potrzeby (może inne wyzwanie?)
Barranka

1
Czy możemy rozdzielić tablicę spacją, łącznikiem lub innym separatorem zamiast przecinka?
TehPers,

Odpowiedzi:


8

05AB1E , 9 8 7 bajtów

L`[Žˆrˆ

Wypróbuj online!

Wyjaśnienie

L           # push range [1 ... input]
 `          # split as separate to stack
  [Ž        # loop until stack is empty
    ˆ       # add top of stack to global list
     r      # reverse stack
      ˆ     # add top of stack to global list
            # implicitly display global list

13

JavaScript (ES6), 49 45 bajtów

Zapisano 4 bajty przy pomocy @RickHitchcock

f=(n,k=1)=>n<k?[]:[n,k,k+1,n-1,...f(n-2,k+2)]

Próbny


Nierekurencyjne, 51 bajtów

n=>[...Array(n)].map((_,i)=>[2*n-i,,++i][i&2]+1>>1)

Próbny


47 bajtów: f=(n,a=1)=>n<a+3?[]:[n,a,a+1,n-1,...f(n-2,a+2)]
Rick Hitchcock,

1
@ RickHitchcock n<ajest wystarczający, więc zaoszczędzono 4 bajty. Dzięki!
Arnauld,

6

Python 2, 99 93 88 58 56 55 bajtów

f=input()
for i in range(1,f/2,2):print-~f-i,i,i+1,f-i,

Wypróbuj online!

-6 bajtów poprzez usunięcie niepotrzebnego wcięcia, dzięki Oliver Ni

-5 bajtów, zmieniając warunki warunkowe, dzięki Luis Mendo

-30 bajtów dzięki optymalizacji instrukcji drukowania, dzięki Arnold Palmer

-2 bajty poprzez umieszczenie pętli w jednej linii, dzięki nedla2004

-1 bajt, wykonując czarodziejstwo, dzięki Mr. Xcoder


Zaoszczędź bajty, używając 1 spacji zamiast 4.
Oliver Ni

O tak, zawsze o tym zapominam. Dzięki.
LyricLy,

1
-29 bajtów przy użyciu lambda(chociaż może być na tyle inny, że uzasadnia osobną odpowiedź).
notjagan

@notjagan Śmiało i opublikuj to, jeśli chcesz.
LyricLy,

58 bajtów , zmieniając nieco wydruk. Teraz drukuje f-i+1,i,i+1,f-iw każdej pętli zamiast warunkowo drukować ostatnią wartość. Pozwoliło to również na usunięcie inicjału print f,.
Arnold Palmer,

6

Python 2 , 46 bajtów

lambda n:map(range(1,n+1).pop,n/4*[-1,0,0,-1])

Wypróbuj online!

Generuje zasięg [1..n]i wyskakuje z przodu iz tyłu w powtarzającym się wzorzeback, front, front, back, ...


Python 2 , 49 bajtów

f=lambda n,k=1:n/k*[0]and[n,k,k+1,n-1]+f(n-2,k+2)

Wypróbuj online!

Generuje pierwsze 4 elementy, następnie rekurencyjnie kontynuuje, przy czym górna wartość nzmniejsza się o 2, a dolna wartość kwzrasta o 2.


Python 2 , 49 bajtów

lambda n:[[n-i/2,i/2+1][-i%4/2]for i in range(n)]

Wypróbuj online!

Bezpośrednio generuje i„wartość listy”, używając -i%4/2jako wartości logicznej określającej, czy przyjąć niższą czy wyższą wartość.



5

MATL , 19 17 10 bajtów

:t"0&)@o?P

Wypróbuj online!

Wyjaśnienie

:          % Implicitly input n. Push range [1 2 ... n]
t          % Duplicate
"          % For each (that is, do n times)
  0&)      %   Push last element, and then subarray with remaining elements
  @        %   Push 1-based iteration index
  o?       %   Is it odd? If so
    P      %     Reverse subarray of remaining elements
           %   Implicit end
           % Implicit end
           % Implicitly display stack

5

Galaretka ,  12  11 bajtów

Poprawiono do 11 bajtów, „Metody kombinatoryczne”:

9Bṁ×ḶṚÆ¡‘Œ?

Wypróbuj online!

W jaki sposób?

Wykorzystuje to obliczenia permutacji i system liczb czynnikowych:

9Bṁ×ḶṚÆ¡‘Œ? - Link n                        e.g. 16
9B          - nine in binary                     [1,0,0,1]
  ṁ         - mould like n                       [1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1]
    Ḷ       - lowered range(n)                   [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
   ×        - multiply                           [0,0,0,3,4,0,0,7,8,0,0,11,12,0,0,15]
     Ṛ      - reverse                            [15,0,0,12,11,0,0,8,7,0,0,4,3,0,0,0]
      Æ¡    - convert from factorial base        19621302981954 (=15*15!+12*12!+...+3*3!)
        ‘   - increment                          19621302981955 (we actually wanted 1*0! too)
         Œ? - shortest permutation of natural numbers [1,2,...] that would reside at that
            -   index in a sorted list of all permutations of those same numbers
            -                                    [16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9]

Nieulepszony 12 bajtów, „Wzory dziewiarskie”:

RṚ‘żRs2Z€FḊṁ

Wypróbuj online!

W jaki sposób?

To proste podejście, tworzy dwa pasma, przeplata je, a następnie przycina luźne końce:

RṚ‘żRs2Z€FḊṁ - Link: n                      e.g. 8
R            - range(n)                          [1,2,3,4,5,6,7,8]
 Ṛ           - reverse                           [8,7,6,5,4,3,2,1]
  ‘          - increment                         [9,8,7,6,5,4,3,2]
    R        - range(n)                          [1,2,3,4,5,6,7,8]
   ż         - zip (interleave)                  [[9,1],[8,2],[7,3],[6,4],[5,5],[4,6],[3,7],[2,8]]
     s2      - split into chunks of length 2     [[[9,1],[8,2]],[[7,3],[6,4]],[[5,5],[4,6]],[[3,7],[2,8]]]
       Z€    - transpose €ach (cross-stitch?!)   [[[9,8],[1,2]],[[7,6],[3,4]],[[5,4],[5,6]],[[3,2],[7,8]]]
         F   - flatten                           [9,8,1,2,7,6,3,4,5,4,5,6,3,2,7,8]
          Ḋ  - dequeue (removes excess start)    [8,1,2,7,6,3,4,5,4,5,6,3,2,7,8]
           ṁ - mould like n (removes excess end) [8,1,2,7,6,3,4,5]

To jest sprytne. +1
Erik the Outgolfer

4

Oktawa , 43 36 bajtów

Port tej odpowiedzi w C (gcc) można znaleźć tutaj .

@(n)[n-(k=1:2:n/2)+1;k;k+1;n-k](:)';

Wyjaśnienie

  1. k=1:2:n/2: Generuje sekwencję liniową od 1 do n/2w krokach po 2. Zauważ, że jest ona natychmiast używana w następnym kroku.
  2. [n-k+1;k;k+1;n-k]: Tworzy macierz 4-rzędową, tak że pierwszy rząd tworzy sekwencję n, n-2, n-4...do n-(n/2)+2, drugi rząd 1, 3, 5...do n/2 - 1, trzeci rząd to drugi rząd dodany o 1, a czwarty rząd to pierwszy wiersz dodany o 1.
  3. [n-k+1;k;k+1;n-k](:)': Układa w stos wszystkie kolumny tej macierzy razem od lewej do prawej, tworząc wektor z pojedynczą kolumną, a my transponujemy go do wektora wiersza, aby ułatwić wyświetlanie. Układanie kolumn w ten sposób dokładnie tworzy pożądaną sekwencję.

Zauważ, że jest to funkcja anonimowa, więc możesz przypisać ją do zmiennej przed użyciem lub możesz użyć wbudowanej anszmiennej, która zostanie utworzona po utworzeniu funkcji.

Wypróbuj online!


1
Cześć, myślę, że można go nawet skrócić, czyniąc z niego anonimową funkcję, dzięki czemu nie trzeba wywoływać danych wejściowych. Zobacz ten link: gnu.org/software/octave/doc/v4.0.3/…
Michthan

1
@Michthan True. Zrobiłem to pierwotnie w ten sposób, ponieważ kod zawierał więcej niż jedną instrukcję. Wziąłem kolejny crack, więc usunę to wywołanie inputi trochę nadużyłem składni, przechowując podstawowy wektor przyrostowy podczas tworzenia pierwszego wiersza i biorąc dane wejściowe nz samego anonimowego wejścia funkcji, dzięki czemu mogę teraz dopasować go do jedno oświadczenie. Dzięki!
rayryeng - Przywróć Monikę

3

R , 48 bajtów (poprawiony)

Dzięki @Giuseppe za -7 bajtów!

n=scan();(x=order(1:n%%2))[order(-(n/2+.5-x)^2)]

Sztuką jest to, że x=1:n;x[order(x%%2)]jest równoważne order(1:n%%2).

Wypróbuj online!

R , 55 bajtów (oryginalny)

Grał w golfa

n=scan();x=1:n;x=x[order(x%%2)];x[order(-(n/2+.5-x)^2)]

Nie golfił z komentarzami

Czytaj nze standardowego.

n=scan()

Zdefiniuj xjako sekwencję stron od 1 do n.

x=1:n

Porządkuj strony tak, aby nawet strony znajdowały się przed nierównymi stronami.

x=x[order(x%%2)]

Ułóż strony w porządku malejącym w stosunku do środka obliczonej książki n/2+.5.

x[order(-(n/2+.5-x)^2)]

Przykład z 8 stron:

  • centrum ma 4,5;
  • strony 1 i 8 są najbardziej oddalone od centrum, ale 8 jest na pierwszym miejscu, ponieważ 8 jest parzyste;
  • strony 2 i 7 znajdują się najbliżej środka, ale 2 jest pierwsze, ponieważ 2 jest parzyste;
  • i tak dalej.

Wypróbuj online!


1
fajne, o wiele lepsze niż moje (skradzione) rozwiązanie
Giuseppe,


1
Sztuką było zauważenie, że (1:n)[order(1:n%%2)]jest to to samo, coorder(1:n%%2)
Giuseppe,

2

Mathematica, 54 53 45 bajtów

Join@@Range[#][[(-1)^k{k,-k}]]~Table~{k,#/2}&

Wyjaśnienie

Join@@Range[#][[(-1)^k{k,-k}]]~Table~{k,#/2}&  (* Input: # *)
                              ~Table~{k,#/2}   (* Iterate from k=1 to #/2 *)
      Range[#][[            ]]                 (* From {1..#}, take... *)
                      {k,-k}                   (* k-th and negative k-th element *)
                                               (* negative k-th = k-th from the end *)
                (-1)^k                         (* Reversed for odd k *)
Join@@                                         (* Join the result *)


2

Haskell, 42 bajty

n#a|n<a=[]|x<-n-2=n:a:a+1:n-1:x#(a+2)
(#1)

Wypróbuj online!

Jeden bajt dłużej:

Haskell, 43 bajty

f n=[1,3..div n 2]>>= \x->[n-x+1,x,x+1,n-x]

2

Java 8, 84 72 bajty

n->{for(int j=0;++j<n;System.out.printf("%d,%d,%d,%d,",n--,j++,j,n--));}

lub

n->{for(int j=0;++j<n;System.out.print(n--+","+j+++","+j+","+n--+","));}

-12 bajtów dzięki komentarzowi @TheLethalCoder do odpowiedzi w języku C #.

Stara odpowiedź (84 bajtów):

n->{int r[]=new int[n],i=1,N=n,J=1;for(r[0]=n;i<n;r[i]=-~i++%4<2?J++:--N);return r;}

Wyjaśnienie:

Wypróbuj tutaj.

n->{                  // Method with integer parameter and no return-type
  for(int j=0;++j<n;  //  Loop from 1 to `n` (exclusive)
    System.out.printf("%d,%d,%d,%d,",n--,j++,j,n--)
                      //   Print four numbers simultaneously
  );                  //  End of loop
}                     // End of method


1

Swift 3 , 74 bajty

func g(f:Int){for i in stride(from:1,to:f/2,by:2){print(f-i+1,i,i+1,f-i)}}

Wypróbuj online!

Swift 3 , 60 bajtów

{f in stride(from:1,to:f/2,by:2).map{(f-$0+1,$0,$0+1,f-$0)}}

Z jakiegoś powodu to nie działa w żadnym środowisku online, które próbowałem do tej pory. Jeśli chcesz przetestować go umieścić var g=przed nim, i nazywają go print(g(12))w Xcode (Place zabaw) .

Oto zdjęcie po uruchomieniu go na placu zabaw Xcode, wersja 8.3.1 (Running Swift 3.1):

wprowadź opis zdjęcia tutaj


1

QBIC , 25 bajtów

[1,:/2,2|?b-a+1,a,1+a,b-a

Chociaż wejście to% 4, rzeczywisty rytm jest oparty na 2.

Wyjaśnienie

[1,:/2,2|   FOR ( b=1; b <= <input>/2; b=b+2)               
?           PRINT
 b-a+1,     n
 a,         1
 1+a,       2
 b-a        n-1


1

cQuents , 21 bajtów

=n::n-z+1,z+1,x-1,z-1

Wypróbuj online!

Wyjaśnienie

                            Implicit input n
=n                          First item in the sequence is n
  ::                        Mode :: (Sequence 2): print sequence from 1 to n
                            Comma delimited items are rotated through
    n-z+1,                    n - previous + 1
          z+1,                previous + 1
              x-1,            third-previous - 1
                  z-1         previous - 1

1

R , 64 60 bajtów

Niszczycielsko obezwładniony przez djhurio ! Jego odpowiedź jest dość elegancka, idź do góry.

n=scan();matrix(c(n-(k=seq(1,n/2,2))+1,k,k+1,n-k),4,,T)[1:n]

Port odpowiedzi Octave rayryenga .

Wypróbuj online!

oryginalne rozwiązanie (64 bajty):

f=function(n,l=1:n)`if`(n,c(l[i<-c(n,1,2,n-1)],f(n-4,l[-i])),{})

Funkcja rekurencyjna.

Wypróbuj online!


Pierwszy raz ktoś użył mojej odpowiedzi jako inspiracji. Dzięki :)
rayryeng - Przywróć Monikę

1
Ciężko cię było pokonać, ale udało mi się to z odpowiedzią 55 bajtów ( codegolf.stackexchange.com/a/138045/13849 ).
djhurio

1

Bash + Perl + Groff + Psutils, 48 ​​bajtów

perl -nE'say".bp
"x--$_'|groff|psbook>/dev/null

Pokazuje wyjście na stderr. Dane wyjściowe zawierają niektóre śmieci.

Przykład zastosowania:

$ echo 20 | perl -nE'say".bp
> "x--$_'|groff|psbook>/dev/null
[20] [1] [2] [19] [18] [3] [4] [17] [16] [5] [6] [15] [14] [7] [8] [13] [12] 
[9] [10] [11] Wrote 20 pages, 4787 bytes

0

Pyth , 21 20 bajtów

sm[hK-QddhdK):1/Q2 2

Pakiet testowy.

Jeśli dane wyjściowe w postaci listy zagnieżdżonej są dozwolone:

Pyth , 20 19 bajtów

m[hK-QddhdK):1/Q2 2

Pakiet testowy.


Wyjaśnienie

sm [hK-QddhdK): 1 / Q2 2 - Pełny program.

 m: 1 / Q2 2 - Mapa ponad zakresem (1, wejście () / 2,2) ze zmienną d.
  [) - Zbuduj listę za pomocą:
   hK-Qd - Wejście - d + 1,
        d - d,
         hd - d + 1 i
           K - Wejście - d.
s - Spłaszcza listę i drukuje niejawnie.


0

C #, 107 bajtów

int[]F(int p){var a=new int[p];for(int i=0,q=1;q<p;a[i++]=p--){a[i++]=p--;a[i++]=q++;a[i++]=q++;}return a;}

Zachowaj dwa liczniki, jeden zaczynający się od 1, drugi od p. W każdej iteracji pętli napisz cztery elementy i po prostu zwiększ lub zmniejsz liczniki po każdym wpisie. Kiedy liczniki spotkają się na środku, zatrzymaj się.

int[] F(int p)
{
    var a = new int[p];
    for(int i = 0, q = 1; q < p; a[i++] = p--)
    {
        a[i++] = p--;
        a[i++] = q++;
        a[i++] = q++;
    }
    return a;
}

Możesz zapisać kilka bajtów, umieszczając metodę w delegacie. Twój kod będzie wyglądać następująco: p=>{var a=new int[p];for(int i=0,q=1;q<p;a[i++]=p--){a[i++]=p--;a[i++]=q++;a[i++]=q++;}return a;};, przy czym System.Func<int, int[]> f =nie mają dołączonego do bytecount. Możesz także dodać link do TIO, który jest bardzo przydatny, gdy próbujesz pozwolić innym na samodzielne wypróbowanie twojego kodu!
Ian H.

@IanH. Podczas korzystania z lambda można pominąć końcowy średnik.
TheLethalCoder

Uruchomienie qsię 0i wstępnie przyrost na q<p-> ++q<pa następnie usunąć drugi post przyrost aby zapisać bajt. Przenieś dwie końcowe instrukcje pętli do ostatniego etapu pętli for, abyś mógł usunąć nawiasy klamrowe.
TheLethalCoder

2
Jeśli dozwolony jest przecinek końcowy, poniższe czynności działają dla 71 bajtów p=>{for(int q=0;++q<p;)System.Console.Write(p--+$",{q++},{q},{p--},");}. TIO.
TheLethalCoder


0

Pyth , 27 24 23 bajtów

-3 bajty, drukując w całości zamiast na końcu.

-1 dzięki Mr. Xcoder

V:1/Q2 2pjd[-QtNNhN-QNk

Wypróbuj online!

Lub w internetowym kompilatorze / executorze

To jest mój pierwszy prawdziwy program w Pyth, więc prawdopodobnie są lepsze metody, o których nie wiem.

Wyjaśnienie

V:1/Q2 2pjd[-QtNNhN-QNk
V:1/Q2 2                   # For N in range(1, Q/2, 2):
        pjd                # print " ".join(...),
           [-QtNNhN-QNk    # The list [n - (N-1), N, N + 1, n - N, ""] (n is input)

Znalazłem kilka ulepszeń i zdecydowałem, że zasługują na własną odpowiedź.
Pan Xcoder,

Nawiasem mówiąc, należy wymienić FNz Vna -1 bajt
Pan Xcoder

0

C ++ (gcc) , 89 84 68 bajtów

Jako nienazwana ogólna lambda. njest # stronami (% 4 == 0) i Cjest parametrem odniesienia dla wyniku, podobnie jak pusty pojemnik vector<int>( push_backpotrzebny jest tylko ).

[](int n,auto&C){for(int i=0,j=0;i<n;C.push_back(++j%4<2?n--:++i));}

poprzednie rozwiązanie:

#define P C.push_back(
[](int n,auto&C){for(int i=0;i<n;P n--),P++i),P++i),P n--));}

Wypróbuj online!

Nieznacznie nie golfista:

auto f=
[](int n,auto&C){
 for(int i=0,j=0;
     i<n;
     C.push_back(++j%4<2 ? n-- : ++i));
}

poprzednie rozwiązanie lekko pozbawione golfa :

auto f=
[](int n, auto&C){
 for(
  int i=0;
  i<n;
   P n--),
   P++i),
   P++i),
   P n--)
 );
}
;

Został dość prosto opracowany i istnieją pewne drobne optymalizacje arytmetyki.

  • Edycja1: ujednolicenie arytmetyki zaoszczędzone 5 bajtów
  • Edycja2: po unifikacji połączono 4 kroki

Stosowanie:

std::vector<int> result;
f(n, result);

Wariant wydruku, 77 bajtów przestarzały

Jeśli nalegasz na wydrukowanie wartości, istnieje następujące rozwiązanie:

[](int n,auto&o){for(int i=0;i<n;o<<n--<<' '<<++i<<' '<<++i<<' '<<n--<<' ');}

Gdzie ojest pożądany std::ostream, jakstd::cout

Zastosowanie (jeśli przypisano 2. lambdę g):

g(n, std::cout);


0

Lua, 94 bajty

Do tego wyzwania wpadłem na 2 różne metody, z których każda ma 94 bajty.

Metoda 1:

function f(n,i)i=i or 1 return n>i and('%s,%s,%s,%s,%s'):format(n,i,i+1,n-1,f(n-2,i+2))or''end

Skomentowany kod:

function f(n,i)
  i=i or 1
  -- On the first iteration i will be nil so I'm setting it's value to 1 if it is.

  return n>i and ('%s,%s,%s,%s,%s'):format(n,i,i+1,n-1,f(n-2,i+2)) or ''
  -- Here i return a ternary statement
  -- If n>i is true, it will return a string using string.format() and part of this is recursion
  -- If it's false, it will just return an empty string
end

Metoda 2:

function f(n,i)i=i or 1 return n>i and n..','..i..','..i+1 ..','..n-1 ..','..f(n-2,i+2)or''end

Ta metoda jest podobna do pierwszej metody, jednak zamiast łańcucha zwracam zamiast łańcucha string.format ()

W obu metodach użyłem pojęcia n i zbliżam się do siebie


0

PHP, 51 + 1 bajtów

while($i<$k=&$argn)echo$k--,_,++$i,_,++$i,_,$k--,_;

drukuje numery stron oddzielone znakiem podkreślenia z końcowym separatorem.
Uruchom jako potok z -nRlub spróbuj online .


0

J , 22 bajty

($,)_2|.`]\1+],@,.&i.-

Wypróbuj online!

Wyjaśnienie

($,)_2|.`]\1+],@,.&i.-  Input: integer n
             ]          Identity
                     -  Negate
                  &i.   Form the ranges [0, 1, ..., n-1] and [n-1, ..., 1, 0]
                ,.      Interleave
              ,@        Flatten
           1+           Add 1
    _2    \             For each non-overlapping sublist of size 2
        `                 Cycle between these two operations
      |.                    Reverse for the first, third, ...
         ]                  Identity for the second, fourth, ...
  ,                     Flatten
 $                      Reshape to length n
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.