Posições diagonais de saída de mim ao quadrado


18

Dado um número n, produz uma lista ordenada de índices baseados em 1 que caem em qualquer uma das diagonais de uma n*nmatriz quadrada.

Exemplo:

Para uma entrada de 3:

O quadrado deve ser:

1 2 3
4 5 6
7 8 9

Agora, selecionamos todos os índices representados por \, /ou X( #ou as posições não diagonais são rejeitadas)

\ # /
# X #
/ # \

A saída deve ser:

[1,3,5,7,9]

Casos de teste:

1=>[1]
2=>[1,2,3,4]
3=>[1,3,5,7,9]
4=>[1,4,6,7,10,11,13,16]
5=>[1,5,7,9,13,17,19,21,25]

Não haverá resposta aceita. Quero saber o código mais curto para cada idioma.


1
A pergunta está pedindo os índices (indexados 1) dos caracteres \, / e X nas imagens. Não é uma pergunta ruim por si só, mas carece de explicação.
Arfie

Se você estiver disposto a fornecer uma explicação breve e clara do que deseja, provavelmente reabriremos isso, pois não é um mau desafio. A partir de agora, é apenas muito claro
Mr. Xcoder

Votei em reabrir, embora você também queira mover as imagens ascii para fora da área de exemplos para evitar confusão. No começo eu não tinha certeza se eu tinha para produzir as também (mas eu entendo a saída queria é apenas a lista de índices)
Arfie

7
O pedido importa?
Mr. Xcoder

9
FWIW Eu acho que ter a ordem ser irrelevante poderia fazer para campos de golfe mais interessantes ...
Jonathan Allan

Respostas:



7

JavaScript (ES6), 48 bytes

Produz uma lista separada por traços de números inteiros como uma sequência.

f=(n,k=n*n)=>--k?f(n,k)+(k%~-n&&k%-~n?'':~k):'1'

Formatado e comentado

f = (n, k = n * n) => // given n and starting with k = n²
  --k ?               // decrement k; if it does not equal zero:
    f(n, k) + (       //   return the result of a recursive call followed by:
      k % ~-n &&      //     if both k % (n - 1) and
      k % -~n ?       //             k % (n + 1) are non-zero:
        ''            //       an empty string
      :               //     else:
        ~k            //       -(k + 1) (instantly coerced to a string)
    )                 //   end of iteration
  :                   // else:
    '1'               //   return '1' and stop recursion

Casos de teste


Solução agradável, usando os sinais como separadores. Você poderia usar o bitwsie &para salvar um byte?
Shaggy

@ Shaggy Não, isso não funcionaria. Por exemplo: 4%3e 4%5não têm 1 bit em comum, mas ambos são diferentes de zero.
Arnauld

Sim, apenas testei n=5e descobri que não funcionaria.
Shaggy

k%~-n&&k%-~nDeveria trabalhar. belo truque com o separador!
Titus

@ Titus Não que isso realmente importe quando se trata de golfe, mas ... sim, isso pode ser um pouco mais legível. :-) (atualizado)
Arnauld

7

R , 38 35 34 38 bytes

3 bytes salvos quando me lembrei da existência da whichfunção ..., 1 byte salvo graças ao @Rift

d=diag(n<-scan());which(d|d[n:1,])

+4 bytes para o argumento ec=Tquando chamado como um programa completo porsource()

Experimente online!

Explicação:

n<-scan()            # take input
d=diag(n);           # create an identity matrix (ones on diagonal, zeros elsewhere)
d|d[n:1,]            # coerce d to logical and combine (OR) with a flipped version
which([d|d[n:1,]])   # Find indices for T values in the logical expression above

1
-1 byted=diag(n<-scan());which(d|d[n:1,])
Rift

Ao executar isso como um programa completo ( source), isso não imprime nada. Você tem que ligar cat. Veja este post na meta .
JAD

@JarkoDubbeldam Fair suficiente! Eu sempre trabalhei com base no fato de fornecer uma saída válida no TIO, nunca realmente considerei os requisitos de ser um "programa completo".
user2390246

Embora eu não esteja pensando em voltar e editar todas as minhas respostas antigas para corrigir isso!
user2390246

É um pouco vago, por causa do ambiente de console do R e dos trechos de código serem a principal maneira de usá-lo. Sinta-se à vontade para compartilhar informações sobre esse meta thread que vinculei. Não recebeu tanta informação.
JAD


5

Oitava , 41 37 bytes

A propósito, isso também funciona no MATLAB. Nenhuma funcionalidade específica oculta do Octave :)

@(x)unique([x:x-1:x^2-1;1:x+1:x*x+1])

Experimente online!

Explicação:

Em vez de criar uma matriz quadrada e encontrar as duas diagonais, imaginei que, em vez disso, calculasse as diagonais diretamente. Isso foi 17 bytes mais curto! =)

@(x)                                   % Anonymous function that takes 'x' as input
    unique(...                   ...)  % unique gives the unique elements, sorted
           [x:x-1:x^2-1                % The anti-diagonal (is that the correct word?)
                       ;               % New row
                        1:x+1:x*x+1])  % The regular diagonal

É assim que parece, sem unique:

ans =    
    6   11   16   21   26   31
    1    8   15   22   29   36

Sim, eu provavelmente deveria ter mudado a ordem das diagonais para torná-la mais amigável ao ser humano.


5

MATL , 6 bytes

XytP+f

Experimente online!

Explicação

A mesma abordagem da minha resposta do Oitava.

Considere a entrada 3como um exemplo.

Xy   % Implicit input. Identity matrix of that size
     % STACK: [1 0 0;
               0 1 0;
               0 0 1]
t    % Duplicate
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [1 0 0
               0 1 0
               0 0 1]
P    % Flip vertically
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [0 0 1
               0 1 0
               1 0 0]
+    % Add
     % STACK: [1 0 1
               0 2 0
               1 0 1]
f    % Linear indices of nonzero entries. Implicit display  
     % STACK:[1; 3; 5; 7; 9]

A indexação linear é baseada na coluna principal , 1. Para mais informações, consulte o fragmento length-12 aqui .


O que "transpor" deveria significar?
Erik the Outgolfer

@EriktheOutgolfer Desculpe, meu mal. té duplicado, não transpõe. Além disso, adicionei um exemplo elaborado
Luis Mendo

Surpreendente! Levaria dois loops se eu quisesse fazer isso.
Mr5

@LuisMendo Eu suspeitava que sim, porque transpor uma matriz de identidade não faz sentido ... hmm, consegui salvar um byte com seu algoritmo.
Erik the Outgolfer


4

Oitava, 68 54 bytes

Obrigado a Stewie Griffin por salvar 14 bytes!

@(x)unique([diag(m=reshape(1:x^2,x,x)),diag(flip(m))])

Experimente online!

MATLAB, 68 bytes

x=input('');m=reshape([1:x*x],x,x);unique([diag(m) diag(flipud(m))])

Explicação:

@(x)                               % Anonymous function
m=reshape([1:x*x],x,x);            % Create a vector from 1 to x^2 and
                                   % reshape it into an x*x matrix.
diag(m)                            % Find the values on the diagonal.
diag(flip(m))                      % Flip the matrix upside down and
                                   % find the values on the diagonal.
unique([])                         % Place the values from both diagonals
                                   % into a vector and remove duplicates.

@LuisMendo Obrigado, Jimi é o meu favorito.
Steadybox

4

Mathematica, 42 bytes

Union@Flatten@Table[{i,#+1-i}+i#-#,{i,#}]&

Experimente online!

@KellyLowder jogou para baixo para ..

Mathematica, 37 bytes

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&

e @alephalpha jogou fora a mesa!

Mathematica, 34 bytes

Union@@Range[{1,#},#^2,{#+1,#-1}]&

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&é 5 bytes mais curto #
Kelly Lowder

Union@@Range[{1,#},#^2,{#+1,#-1}]&
alephalpha




2

C # (.NET Core) , 97 83 bytes

f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}

Experimente online!

A alteração aqui é baseada no deslocamento entre os números a serem encontrados. Os dois turnos que começam em 0 são n-1e n+1, portanto n=5, se os números para n-1seriam 0,4,8,12,16,20e para n+1seriam 0,6,12,18,24. Combiná-los e fornecer indexação 1 (em vez de indexação 0) fornece 1,5,7,9,13,17,19,21,25. O deslocamento de né obtido usando negação bit a bit (operação de complemento bit a bit), onde ~-n==n-1e -~n==n+1.

Versão antiga

f=>{var s="[";for(int i=0;i<n*n-1;i++)s+=(i/n!=i%n&&n-1-i/n!=i%n?"":i+1+",");return s+$"{n*n}]";}

Experimente online!

Essa abordagem usa os índices de coluna e linha para determinar se os números estão nas diagonais. i/nfornece o índice da linha e i%no índice da coluna.

Retornando apenas a matriz numérica

Se a construção de apenas a matriz numérica for considerada como contando para o custo de bytes, o seguinte poderá ser feito, com base na sugestão de Dennis.Verweij ( using System.Linq;adiciona 18 bytes extras):

C # (.NET Core) , 66 + 18 = 84 bytes

x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()

Experimente online!


você pode reduzir o código se livrando do extra &. O adicional &é lá apenas para quebrar a comparação, se a primeira entrada é falso MSDN
Dennis.Verweij

na verdade, você pode ter 92 bytes usando o Linq Experimente online!
precisa saber é o seguinte

@ Dennis.Verweij Legal, eu não tinha certeza do quanto eu poderia mudar para o cabeçalho ou rodapé no TIO. Vou brincar com o meu.
precisa saber é o seguinte

você tem que se lembrar de incluir 18 bytes para a referência ao LINQ (usando System.Linq;) o que é lamentável, mas como ele funciona: S
Dennis.Verweij

Ah ok. Mas isso não é necessário using System;? (Presumo envolvê-lo em um namespace System.Linqnão é válido?)
Ayb4btu

2

Javascript, 73 63 bytes

versão antiga

n=>[...Array(y=n*n).keys(),y].filter(x=>(--x/n|0)==x%n||(x/n|0)==n-x%n-1)

Guardado 10 bytes graças a @Shaggy

n=>[...Array(n*n)].map((_,y)=>y+1).filter(x=>!(--x%-~n&&x%~-n))

Golfe pela primeira vez! espero que eu não tenha estragado muito.


Bem-vindo ao PPCG :) Uma solução semelhante à que eu estava trabalhando (apenas a minha é indexada em 0). Você pode ser capaz de salvar alguns bytes usando o seguinte em sua filterfunção: !(--x%(n+1)&&x%(n-1))e através da criação de sua matriz assim:[...Array(n*n+1).keys()]
Shaggy

@ Shaggy Obrigado! Vou tentar melhorar a resposta com sua sugestão assim que chegar em casa do trabalho!
Marco Lepore

Seja bem-vindo. A propósito: " é um pouco menor do que criar um [1...n*n]intervalo comArray(n*n).fill().map((x,i)=>i+1) " - [...Array(n*n)].map((_,y)=>y+1)é uma maneira mais curta de fazer isso, para referência futura.
Shaggy

Fiz um pouco mais com isso e acabei com isso por 56 bytes:n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
Shaggy

@ Shaygy Tentei a sua última versão, mas ela produziria um zero extra para f (1) ef (2), mas funciona com um intervalo [1 ... n * n], então usei o modo como você me mostrou no comentário anterior. Ou talvez eu errei de alguma maneira?
Marco Lepore


1

Perl 5 , 56 + 1 (-n) = 57 bytes

!(($_+1+$_/$,)%$,&&$_%($,+1))&&say++$_ for 0..($,=$_)**2

Experimente online!


`-N` não deveria ser +3?
sergiol

1
Não. A linha de comando assumida é perl -e. A linha de comando para este exemplo seria perl -ne. Essa é uma diferença de +1.
Xcali


1

Japt , 16 bytes

Não consigo fazer melhor que isso, mas tenho certeza de que é possível. Tivemos que sacrificar 2 bytes pelo requisito desnecessário de usar a indexação 1.

²õ f@´XvUÉ ªXvUÄ

Teste-o



0

PHP, 56 54 + 1 bytes

+1 byte para -Rsinalizador

for(;$z**.5<$n=$argn;$z++)$z%-~$n&&$z%~-$n||print~+$z;

imprime números precedidos por traços. Execute como pipe -nRou experimente online .

requer PHP 5.6 ou posterior para o **operador.
Adicione um byte para o PHP antigo: Substitua ;$z**.5<$n=$argnpor $z=$argn;$z<$n*$n.


0

Ruby, 45 bytes

->n{(n*n).times{|i|i%-~n>0&&i%~-n>0||p(i+1)}}

Funciona internamente como zero indexado. verifica se o imódulo n+1ou n-1é 0, se assim for i+1.

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.