输出我的对角线位置的平方


18

给定一个数字n,输出一个落在n*n方矩阵的对角线上的从1开始的索引的有序列表。

例:

输入以下内容3

正方形应为:

1 2 3
4 5 6
7 8 9

现在,我们选择所有所代表的指数\/X#或者非对角线位置被拒绝)

\ # /
# X #
/ # \

输出应为:

[1,3,5,7,9]

测试用例:

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]

没有可接受的答案。我想知道每种语言的最短代码。


1
问题是要求图像中\,/和​​X字符的(1索引)索引。本质上这不是一个坏问题,但是缺乏解释。
Arfie '17

如果您愿意对想要的内容提供简短清晰的说明,我们可能会重新讨论,因为这不是一个坏挑战。到目前为止,还很不清楚
Xcoder先生17年

我已投票决定重新开放,尽管您也可能希望将ascii图像移出示例区域,以避免混淆。起初我不确定是否也必须产生那些(但是我知道想要的输出只是索引列表)
Arfie

7
顺序重要吗?
Xcoder先生17年

9
我认为FWIW的订单无关紧要,可能会使高尔夫变得更有趣……
Jonathan Allan

Answers:



7

JavaScript(ES6),48个字节

将以破折号分隔的整数列表作为字符串输出。

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

格式化和评论

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

测试用例


不错的解决方法,使用符号作为分隔符。您可以使用bitwsie &保存一个字节吗?
毛茸茸的

@Shaggy不,那是行不通的。例如:4%3并且4%5没有共同的1位,但是两者都不为零。
Arnauld

是的,只是对其进行了测试n=5,发现它不起作用。
毛茸茸的

k%~-n&&k%-~n应该管用。分隔符很好玩!
泰特斯

@Titus这并不是说,当谈到高尔夫,但...是啊,这可能是它真正的问题稍微更具可读性。:
Arnauld

7

R38 35 34 38字节

当我想起which函数的存在时节省了3个字节...,@ Rift节省了1个字节

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

ec=T当由完整程序调用时,参数的+4字节source()

在线尝试!

说明:

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个字节d=diag(n<-scan());which(d|d[n:1,])
Rift

当以完整程序(source)的形式运行该程序时,不会打印任何内容。你必须打电话cat。请参阅meta上的这篇文章
JAD

@JarkoDubbeldam足够公平!我一直以提供TIO上的有效输出为基础,从未真正考虑过成为“完整程序”的要求。
user2390246

尽管我不打算返回并编辑所有旧答案以解决此问题!
user2390246

这有点含糊,因为R的控制台环境和代码段是使用它的主要方式。随时分享我链接的元线程的见解。它没有收到太多的输入。
JAD


5

八度41 37字节

顺便说一下,这也可以在MATLAB中使用。没有偷偷摸摸的八度特定功能:)

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

在线尝试!

说明:

我发现不用计算正方形矩阵,而是找到两个对角线,而是直接计算对角线。这短了17个字节!=)

@(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

没有它,它就是这样的unique

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

是的,我可能应该将对角线的顺序翻转为更人性化。


5

MATL,6个字节

XytP+f

在线尝试!

说明

与我的八度音阶答案相同的方法。

以输入3为例。

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]

线性索引是基于列的,基于1的索引。有关更多信息,请参见此处的 length-12片段。


“移调”应该是什么意思?
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer对不起,我不好。t是重复的,不能转置。此外,我还添加了一个
可行的

惊人!如果要完成此操作,将需要两个循环。
mr5

@LuisMendo我怀疑是这样,因为转置身份矩阵没有意义...嗯,我设法用您的算法保存了一个字节。
暴民埃里克(Erik the Outgolfer)


4

八度,68 54字节

感谢@Stewie Griffin节省了14个字节!

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

在线尝试!

MATLAB,68个字节

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

说明:

@(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谢谢,吉米是我的最爱。
Steadybox

4

Mathematica,42个字节

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

在线尝试!

@KellyLowder打了下去。

Mathematica,37个字节

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

@alephalpha扔掉桌子!

Mathematica,34个字节

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

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&短5个字节
Kelly Lowder

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




2

C#(.NET Core)97 83字节

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

在线尝试!

此处的更改基于要查找的数字之间的转换。从0开始的两班是n-1n+1,因此,如果n=5,对于数字n-10,4,8,12,16,20n+10,6,12,18,24。将这些组合并给出1索引(而不是0索引)可得出1,5,7,9,13,17,19,21,25。从偏移n使用按位求反(按位求补操作),其中,实现~-n==n-1-~n==n+1

旧版本

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

在线尝试!

此方法使用列索引和行索引来确定数字是否在对角线上。i/n给出行索引,i%n给出列索引。

仅返回数字数组

如果仅构造数字数组被认为已计入字节成本,则可以根据Dennis.Verweij的建议(using System.Linq;增加18个字节)执行以下操作:

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

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

在线尝试!


您可以通过消除多余的内容来减少代码&。额外的&是那里才打破比较,如果第一输入是假的MSDN
Dennis.Verweij

实际上,使用Linq可以拥有92个字节。在线尝试!
Dennis.Verweij

@ Dennis.Verweij整洁,我不确​​定在TIO中可以转移多少到页眉或页脚。我将和我一起玩耍。
Ayb4btu

您必须记住要包括18个字节,以引用linq(使用System.Linq;),这很不幸,但是它是如何工作的:S
Dennis.Verweij

喔好吧。但这对using System;吗?(我认为将其包装在里面namespace System.Linq是无效的吗?)
Ayb4btu

2

Javascript,73 63字节

旧版本

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

@Shaggy节省了10个字节

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

第一次打高尔夫球!希望我不会太糟。


欢迎使用PPCG :)与我正在研究的解决方案类似的解决方案(仅我的索引为0)。您可以通过在filter函数中使用以下命令来保存一些字节:!(--x%(n+1)&&x%(n-1))并通过像这样创建数组:[...Array(n*n+1).keys()]
Shaggy

@Shaggy谢谢!下班回家后,我会尽力改善您的建议!
Marco Lepore

别客气。顺便说一句:“ 比创建[1...n*n]范围要短一些Array(n*n).fill().map((x,i)=>i+1) ”- [...Array(n*n)].map((_,y)=>y+1)是一种更短的实现方式,以供将来参考。
毛茸茸的

做了更多的工作,并最终得到了56个字节:n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
Shaggy

@Shaggy我尝试了您的最后一个版本,但是它将为f(1)和f(2)输出一个额外的零,尽管它在[1 ... n * n]范围内起作用,所以我使用了您在先前的评论。或者也许我搞砸了?
Marco Lepore


1

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

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

在线尝试!


-n不应该是+3吗?
sergiol

1
否。假定的命令行为perl -e。此示例的命令行为perl -ne。两者相差+1。
Xcali


1

Japt,16字节

似乎没有比这更好的方法,但是我敢肯定这是可能的。由于我们使用1索引的不必要要求,不得不牺牲2个字节。

²õ f@´XvUÉ ªXvUÄ

测试一下



0

PHP,56 54 + 1字节

+1字节的-R标志

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

打印以破折号开头的数字。与管道一起运行-nR在线尝试

需要PHP 5.6或更高版本的**运营商。
为较旧的PHP添加一个字节:替换;$z**.5<$n=$argn$z=$argn;$z<$n*$n


0

Ruby,45个字节

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

在内部作为零索引工作。检查是否取in+1n-1为0,如果是,则打印i+1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.