Imprimir um livreto


39

É fácil ler um livro, mas imprimir um livro pode ser um pouco complicado. Ao imprimir um livreto, a impressora precisa ter as páginas organizadas de uma certa maneira para serem lidas da esquerda para a direita. A maneira como isso é feito é usar um padrão como abaixo

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…

Casos de teste

Livreto de 4 páginas: 4, 1, 2, 3

Livreto de 8 páginas: 8,1,2,7,6,3,4,5

Livreto de 12 páginas: 12,1,2,11,10,3,4,9,8,5,6,7

Livreto de 16 páginas: 16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9

Livreto de 20 páginas: 20,1,2,19,18,3,4,17,16,5,6,15,14,7,8,13,12,9,10,11

Tarefa

Sua tarefa é, dado um número inteiro nmúltiplo de 4, exibir uma matriz de números que possa ser usada para imprimir um livro de npáginas.

Nota: Desde que a saída gere os números corretos, sejam delimitados por espaços, vírgulas, hífens ou parênteses, qualquer método para chegar a uma solução pode ser usado

Esta é uma questão de para que as respostas sejam pontuadas em bytes, com o menor número possível de bytes.


Temos a garantia de que a entrada sempre será divisível por 4 ou mesmo por um número par? De qualquer forma, você poderia adicionar mais alguns casos de teste, por favor? E bem-vindo ao PPCG :)
Shaggy

8
Bem-vindo ao PPCG e bom primeiro desafio! Observe que é recomendável propor novos desafios na sandbox antes de publicá-los.
Oliver Ni

1
Sua entrada precisa ser um múltiplo de 4
tisaconundrum

1
Seria bom (mas talvez trivial) para apoiar qualquer valor, enchendo com páginas em branco, se necessário (um outro desafio, talvez?)
Barranka

1
Podemos delimitar a matriz com um espaço, hífen ou outro delimitador em vez de vírgula?
TehPers

Respostas:


8

05AB1E , 9 8 7 bytes

L`[Žˆrˆ

Experimente online!

Explicação

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 bytes

Salvo 4 bytes com a ajuda de @RickHitchcock

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

Demo


Não recursivo, 51 bytes

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

Demo


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

1
@ RickHitchcock n<aé realmente suficiente, então são 4 bytes salvos. Obrigado!
Arnauld

6

Python 2, 99 93 88 58 56 55 bytes

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

Experimente online!

-6 bytes removendo recuo desnecessário, obrigado Oliver Ni

-5 bytes alterando o condicional, obrigado Luis Mendo

-30 bytes, otimizando as instruções de impressão, obrigado Arnold Palmer

-2 bytes colocando o loop em uma linha, obrigado nedla2004

-1 byte fazendo algumas magias, obrigado Sr. Xcoder


Salvar bytes usando um espaço em vez de 4.
Oliver Ni

Ah, sim, eu sempre esqueço disso. Obrigado.
quer tocar hoje

1
-29 bytes usando a lambda(embora isso possa ser diferente o suficiente para garantir uma resposta separada).
notjagan

@notjagan Vá em frente e publique você mesmo, se quiser.
precisa saber é o seguinte

58 bytes , alterando sua impressão um pouco. Agora ele é impresso f-i+1,i,i+1,f-iem cada loop, em vez de imprimir condicionalmente o último valor. Isso também permitiu remover a inicial print f,.
Arnold Palmer

6

Python 2 , 46 bytes

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

Experimente online!

Gera o intervalo [1..n]e aparece de frente e de trás no padrão de repetiçãoback, front, front, back, ...


Python 2 , 49 bytes

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

Experimente online!

Gera os 4 primeiros elementos e continua recursivamente com o valor superior ndiminuído em 2 e o valor inferior kaumentado em 2.


Python 2 , 49 bytes

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

Experimente online!

Gera diretamente o i'ésimo valor da lista, usando -i%4/2como um booleano para levar o valor mais baixo ou mais alto.



5

MATL , 19 17 10 bytes

:t"0&)@o?P

Experimente online!

Explicação

:          % 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

Gelatina ,  12  11 bytes

Aprimorado para 11 bytes, "Métodos Combinatórios":

9Bṁ×ḶṚÆ¡‘Œ?

Experimente online!

Quão?

Utiliza cálculos de permutação e o sistema de números fatoriais:

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]

Interproved 12 byter, "Knitting Patterns":

RṚ‘żRs2Z€FḊṁ

Experimente online!

Quão?

Essa é a abordagem simples, ela cria dois fios, os entrelaça e apara as pontas soltas:

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]

Isso é inteligente. +1
Erik the Outgolfer

4

Oitava , 43 36 bytes

Uma porta desta resposta em C (gcc) pode ser encontrada aqui .

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

Explicação

  1. k=1:2:n/2: Gera uma sequência linear de 1 a n/2 nas etapas de 2. Observe que isso é usado imediatamente na próxima etapa.
  2. [n-k+1;k;k+1;n-k]: Cria uma matriz de 4 linhas, de modo que a primeira linha crie a sequência n, n-2, n-4...até n-(n/2)+2a segunda linha, 1, 3, 5...atén/2 - 1 , a terceira linha é a segunda linha adicionada por 1 e a quarta linha é a primeira linha adicionada por 1.
  3. [n-k+1;k;k+1;n-k](:)': Empilha todas as colunas dessa matriz da esquerda para a direita para criar um vetor de coluna única e a transpõe para um vetor de linha para facilitar a exibição. Empilhar as colunas juntas dessa maneira cria com precisão a sequência desejada.

Observe que essa é uma função anônima, portanto, você pode atribuí-la a uma variável antes de usá-la ou pode usar o recurso interno ans variável interna criada após a criação da função.

Experimente online!


1
Olá, acho que você pode até encurtar, tornando-a uma função anônima, para não precisar chamar entrada. Veja este link: gnu.org/software/octave/doc/v4.0.3/…
Michthan

1
@Michthan True. Eu originalmente fiz dessa maneira porque o código era mais de uma instrução. Tomei outra rachadura para remover a chamada inpute abusei da sintaxe um pouco mais armazenando o vetor incremental de base enquanto criava a primeira linha e obtendo a entrada nda própria função anônima para que eu possa encaixá-la agora. uma afirmação. Obrigado!
rayryeng - Reinstala Monica

3

R , 48 bytes (aprimorado)

Graças a @ Giuseppe por -7 bytes!

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

O truque é que x=1:n;x[order(x%%2)]é equivalente aorder(1:n%%2) .

Experimente online!

R , 55 bytes (original)

Golfe

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

Ungolfed com comentários

Leia a npartir de stdin.

n=scan()

Defina xcomo sequência de páginas de 1 a n.

x=1:n

Encomende páginas para que páginas pares estejam antes de páginas irregulares.

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

Ordene as páginas em ordem decrescente em relação ao centro do livro calculado por n/2+.5.

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

Exemplo com 8 páginas:

  • o centro é 4,5;
  • as páginas 1 e 8 são as mais distantes do centro, mas 8 vem primeiro porque 8 é par;
  • as páginas 2 e 7 são as próximas mais distantes do centro, mas 2 vem primeiro, pois 2 é par;
  • e assim por diante.

Experimente online!


1
bom, muito melhor do que a minha solução (roubado)
Giuseppe


1
O truque foi perceber que (1:n)[order(1:n%%2)]é o mesmo queorder(1:n%%2)
Giuseppe

2

Mathematica, 54 53 45 bytes

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

Explicação

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 bytes

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

Experimente online!

Um byte a mais:

Haskell, 43 bytes

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

2

Java 8, 84 72 bytes

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

ou

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

-12 bytes graças a @TheLethalCoder comentário de na resposta C #.

Resposta antiga (84 bytes):

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

Explicação:

Experimente aqui.

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 bytes

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

Experimente online!

Swift 3 , 60 bytes

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

Por alguma razão, isso não funciona em nenhum ambiente online que eu tentei até agora. Se você quiser testá-lo, coloque-o var g=na frente e chame-o print(g(12))no Xcode (Playgrounds) .

Aqui está uma foto depois de executá-la em um playground do Xcode, versão 8.3.1 (Running Swift 3.1):

insira a descrição da imagem aqui


1

QBIC , 25 bytes

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

Embora a entrada seja% 4, o ritmo real é baseado em 2.

Explicação

[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 bytes

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

Experimente online!

Explicação

                            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 bytes 60

Devastadoramente superado por djhurio ! Sua resposta é bastante elegante, vá para votação.

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

Um porto da resposta oitava de rayryeng .

Experimente online!

solução original (64 bytes):

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

Função recursiva.

Experimente online!


A primeira vez que alguém usou uma resposta minha como inspiração. Obrigado :)
rayryeng - Reinstate Monica

1
Foi difícil vencer você, mas eu consegui isso com resposta de 55 bytes ( codegolf.stackexchange.com/a/138045/13849 ).
djhurio

1

Bash + Perl + Groff + Psutils, 48 ​​bytes

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

Mostra a saída ativada stderr. A saída contém algum lixo à direita.

Exemplo de uso:

$ 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

Pitão , 21 20 bytes

sm[hK-QddhdK):1/Q2 2

Suíte de teste.

Se a saída como uma lista aninhada for permitida:

Pitão , 20 19 bytes

m[hK-QddhdK):1/Q2 2

Suíte de teste.


Explicação

sm [hK-QddhdK): 1 / Q2 2 - Programa completo.

 m: 1 / Q2 2 - Mapa acima da faixa (1, entrada () / 2,2) com uma variável d.
  [) - Construa uma lista com:
   hK-Qd - Entrada - d + 1,
        d - d
         hd - d + 1 e
           K - Entrada - d.
s - Nivela a lista e imprime implicitamente.


0

C #, 107 bytes

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

Mantenha dois contadores, um começando em 1, um na p. Em cada iteração do loop, escreva quatro elementos e apenas aumente ou diminua os contadores após cada entrada. Quando os contadores se encontrarem no meio, pare.

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

Você pode salvar alguns bytes colocando o método em um delegado. Seu código ficaria assim:, 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;};com a System.Func<int, int[]> f =não inclusão do bytecount. Além disso, você pode adicionar um link ao TIO, o que é muito útil ao tentar permitir que as pessoas testem seu código sozinhas!
Ian H.

@IanH. Ao usar um lambda, o ponto e vírgula à direita pode ser omitido.
TheLethalCoder

Inicializar qpara 0e pré incremento de q<p-> ++q<pe, em seguida, remover o segundo post incremento para salvar um byte. Mova as duas instruções de loop à direita para o último estágio do loop for para remover os chavetas.
TheLethalCoder

2
Se uma vírgula à direita for permitida, o seguinte funcionará para 71 bytes p=>{for(int q=0;++q<p;)System.Console.Write(p--+$",{q++},{q},{p--},");}. TIO.
TheLethalCoder


0

Pitão , 27 24 23 bytes

-3 bytes, imprimindo todo em vez de no final.

-1 Obrigado ao Sr. Xcoder

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

Experimente online!

Ou no Compilador / Executor online

Este é o meu primeiro programa real em Pyth, então provavelmente existem métodos melhores que eu não conheço.

Explicação

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)

Encontrei algumas melhorias e decidi que elas mereciam sua própria resposta.
Mr. Xcoder

By the way, substituir FNcom Va -1 byte
Mr. Xcoder

0

C ++ (gcc) , 89 84 68 bytes

Como lambda genérico sem nome. né #pages (% 4 == 0) e Cé um parâmetro de referência para o resultado, como um contêiner vazio vector<int>(apenas push_backé necessário).

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

solução anterior:

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

Experimente online!

Ligeiramente não destruído:

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

solução anterior ligeiramente destruída :

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

Foi bastante simples e há algumas otimizações menores na aritmética.

  • Edit1: unificação da aritmética economizada 5 bytes
  • Edit2: após a unificação, as 4 etapas foram combinadas

Uso:

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

Variante de impressão, 77 bytes desatualizados

Se você insistir em imprimir os valores, existe esta solução:

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

Onde oestá o seu desejado std::ostream, comostd::cout

Uso (se o segundo lambda foi atribuído a g):

g(n, std::cout);


0

Lua, 94 bytes

Para esse desafio, na verdade, criei 2 métodos diferentes, ambos com 94 bytes.

Método 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

Código comentado:

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

Método 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

Este método é semelhante ao primeiro método, no entanto, em vez disso, estou retornando uma string concatenada em vez de string.format ()

Nos dois métodos, usei o conceito de ne aproximando-me


0

PHP, 51 + 1 bytes

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

imprime números de página separados por sublinhado com um delimitador à direita.
Execute como pipe -nRou experimente online .


0

J , 22 bytes

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

Experimente online!

Explicação

($,)_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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.