有限的康托尔对角线


20

给定一个N整数列表(每个整数都有N数字),输出一个因第一个数字而与第一个数字不同的数字,由于第二个数字而与第二个数字不同的数字,依此类推。

鉴于此列表:

1234
4815
1623
4211

数字2932的第一个数字与第一个数字的第一个数字不同,第二个数字与第二个数字的第二个数字不同,依此类推。因此,它是有效的输出。

输入项

  • 您可以同时使用列表和N输入,也可以根据需要仅使用列表。
  • 列表中的每个整数必须与列表的长度(N)一样多
  • 数字不会有任何前导零
  • 输入列表必须包含数字,而不是字符串。
  • 您可以通过STDIN或类似方式将输入作为函数参数。
  • 您可以假设列表的长度不超过10个元素(列表中的任何数字都不能大于2147483647)。

产出

  • 输出不在列表中是不够的。位数必须如上所述。
  • 您可以使用任何遵循不同数字约束的数字选择策略。
  • 该数字不能有前导零
  • 您可以通过输出数字STDOUT,从函数返回数字等。

测试用例

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

计分

这是,因此最短的答案以字节为单位。


那么我们必须STDIN在解析之前将转换为整数吗?
Leaky Nun

@KennyLau输入必须是数字,如果您的语言可以直接解析数字,则无需进行任何转换。
致命

STDIN默认情况下为字符串...
Leaky Nun

然后将输入字符串转换为整数列表。
致命

我们可以输出数字列表吗?
科纳·奥布莱恩

Answers:


4

果冻,8 7个字节

感谢Dennis,节省了1个字节。

DŒDḢỊ‘Ḍ

在线尝试!

说明

DŒDḢỊ‘Ḍ    Main link. Takes list as argument.
D          Convert each integer to decimal.
 ŒD        Get the diagonals.
   Ḣ       Get the first diagonal.
    Ị      Check if every digit <= 1.
     ‘     Increment every digit.
      Ḍ    Convert back to integer from decimal.

将每个数字来1,除了012


8

CJam(15 14字节)

qN/ee{:=i2%)}%

在线演示

感谢Adnan节省了一个字节。

解剖

qN/    e# Split input on newlines
ee{    e# Label each line with its index and map:
  :=i  e#   Get the character at the same index (i.e. diagonalise)
  2%)  e#   Compute (ASCII value mod 2) + 1
       e#   Maps 0 1 2 3 4 5 6 7 8 9
       e#     to 1 2 1 2 1 2 1 2 1 2
}%

1
@Adnan,可以,谢谢。或者,i2%)可以49&)直接使用字符而不是ASCII代码。
彼得·泰勒

7

Python 2,47 45字节

lambda x,n:int(`x`[1::n+3])%(10**n/2)+10**n/9

感谢@xnor打高尔夫球2个字节!

Ideone上进行测试

怎么运行的

`x`产生列表x的字符串表示形式。

对于第一个测试用例,这给出了字符串

[92345678, 23456789, 34567890, 45678901, 56789012, 67890123, 78901234, 89012345]

[1::n+3]检索每个第(n + 3)字符-其中nx的长度,从第二字符开始。为占2个字符,,我们获取第一个数字的第一位数字,第二个数字的第二位数字,依此类推。

[92345678, 23456789, 34567890, 45678901, 56789012, 67890123, 78901234, 89012345]
 ^          ^          ^          ^          ^          ^          ^          ^

现在,我们以10 n ÷2为模数来映射[0,4]范围内的第一个数字。

对于93579135,我们得到93579135%50000000 = 43579135

最后,我们将10 n ÷9加到最后一个结果上,这将增加–从90环绕–所有数字加1(无进位)或2(有进位)。

对于43579135,我们得到43579135 + 11111111 = 54690246


4

MATL,11 10 9字节

VXd9\QV!U

仅将整数的列向量作为输入。N没有提供。

在线尝试

说明

    % Implicity grab input as column vector of numbers
V   % Convert the input column vector into a 2D character array
Xd  % Grab the diagonal elements of the character array
9\  % Take the modulus of each ASCII code and 9
Q   % Add 1 to remove all zeros
V   % Convert the result to a string
!   % Transpose to yield a row vector of characters
U   % Convert back to an integer (as per the rules)
    % Implicitly display result

1
@LuisMendo哦,好吧。尽管当第一个数字为2matl.tryitonline.net
Suever 2016年

也许VXd9\QV!U
Suever,2013年

哦,我没想到要领先于零...
路易斯·门多

@LuisMendo它们不是唯一的有关系吗?只要它们与输入的值不同,就没关系。
Suever

你完全正确。我想的是错误的方式
路易斯·门多

3

Pyth,11个字节

jk.eh!ts@`b

简单循环,将每个数字更改为1,但1变为2。


很好地使用隐式Qk!不过,您可以在数字转换期间保存一个字节:s.eh-12@`b
雅库贝(Jakube)'16

3

视网膜 39 38 37

(?<=(.*¶)*)(?<-1>.)*(.).*¶
$2
T`d`121

保存了1个字节,谢谢马丁!

在输入中需要尾随换行符。

获取对角线并将0和2-9转换为1和1转换为2。

获取对角线的基本思想是将捕获的每一行推到当前行的上方,然后使用捕获来匹配一个字符,然后保留下一个字符。

在线尝试


3

J,26 22字节

1+1>:i.@#{"_1"."0@":"0

使用对角线的<= 1increment方法,与其他方法类似。

用法

只需要整数列表作为参数。

   f =: 1+1>:i.@#{"_1"."0@":"0
   f 1234 4815 1623 4211
2 1 1 2
   f 92345678 23456789 34567890 45678901 56789012 67890123 78901234 89012345
1 1 1 1 1 2 1 1

抱歉打破第一个连胜...
NoOneIsHere16年


2

Java,94个字节

int c(int[]d){int p=1,r=0,l=d.length,i=0;for(;i<l;p*=10)r+=(d[l-++i]/p%10==1?2:1)*p;return r;}

纯数字运算取胜!:)

样本输入/输出:

8            <-- size
12345678     <-- start of list
23456789
34567890
45678901
56789012
67890123
78901234
89012345     <-- end of list
21111211     <-- result from ungolfed code
21111211     <-- result from golfed code

完整程序(带有非高尔夫代码):

import java.util.Scanner;

public class Q79444 {
    int cantor_ungolfed(int[] data){
        int power = 1;
        int result = 0;
        for(int i=0;i<data.length;i++){
            result += (((data[data.length-i-1]/power))%10==1? 2 : 1)*power;
            power *= 10;
        }
        return result;
    }
    int c(int[]d){int p=1,r=0,l=d.length,i=0;for(;i<l;p*=10)r+=(d[l-++i]/p%10==1?2:1)*p;return r;}
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] input = new int[n];
        for(int i=0;i<n;i++){
            input[i] = sc.nextInt();
        }
        System.out.println(new Q79444().cantor_ungolfed(input));
        System.out.println(new Q79444().c(input));
        sc.close();
    }
}

2

Java,93个字节

String k(int n,int[]a){String s="";for(int i=0;i<n;)s+=(a[i]+s).charAt(i++)<57?9:1;return s;}

不打高尔夫球

String k(int n, int[] a) {
    String s = "";
    for (int i = 0; i < n; ) 
        s += (a[i] + s).charAt(i++) < 57 ? 9 : 1;
    return s;
}

输出量

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Output:
99991999

Input:
1234
4815
1623
4211

Output:
9999

1

J,37个字节

f@(9&-@"."0@((>:@#*i.@#){f=:[:,":"0))

可能可以打高尔夫球,但我忘记了是否有“对角线”命令。


我以前看过它,马丁在这里用过对角线。
FryAmTheEggman '16

@FryAmTheEggman是的,很近。我仍在寻找,但可能没有。
科纳·奥布莱恩

如果对角线以9开头,这似乎会产生前导零
。– Zgarb

如果你把输入您可以创建数字表n使用<list> (#:~#&10) <n>。可以找到第一个对角线,(< 0 1) |: <list>其中的其中(< 0 1)一个是供轴选择的框,两者都使用|:
英里

1

Reng v.3.3,60个字节

k1-#kaiír1ø          ~; !nb$<
1[å{$}k*$k1-#k)9(-#oa$;]o)ks^$

对于Reng来说,这很简单。在这里尝试!输入是用空格分隔的数字列表。

1:初始化

k1-#kaiír1ø

k是输入的数量(数字的数量),我们递减1并在循环阶段恢复。aií接受所有输入。r反转堆栈以处理输入。转到下一行。

2:循环

1[å{$}k*$k1-#k)9(-#oa$;]o)ks^$

1[将最上面的物品从堆栈中取出并放入新的堆栈中。å将其拆分为数字。{$}推送一个包含“ drop”操作的代码块;这被重复k次数(k*)和码块被丢弃($k1-#k递减k)9(看跌期权9在STOS,并-减去从STOS TOS。#o存储在这个数字o,并a$;丢弃该堆栈的所有成员。]关闭所述父堆栈。o看跌期权o在背顶部;这是我们要保存的数字,)将其移至底部,以便我们可以继续循环。s通常检查非输入内容(即与相等-1),但是当出现以下情况时,我们可以使用它来打破循环k == -1所以s^当上升k == -1。从堆栈中$删除k,我们的循环再次开始。

3:最终

                     ~; !nb$<

<将指针指向左侧,并从堆栈中$删除kb是一个左侧的镜子,因此我们通过它进入,但在击打;堆栈条件镜子时会反弹回来。!n当且仅当我们要走时才输出一个数字。~完成打印后,结束程序。


1

Mathematica 52字节

FromDigits[Mod[#,2]+1&/@Diagonal[IntegerDigits/@#]]&

这遵循了Peter Taylor等人的方法(不使用Ascii代码)。

FromDigits[Mod[#,2]+1&/@Diagonal[IntegerDigits/@ #]]&[{1234,4815,1623,4211}]

2112


1

ClojureScript,58个字符

#(int(apply str(map-indexed(fn[i x](- 9(get(str x)i)))%)))

类型要求使它比必要的时间更长,而且map-indexed太多的字符对您没有帮助。

通常,我提交的内容也是有效的Clojure,但这使用的是ClojureScript的JavaScript漏洞。数字和字符串相减将字符串强制为数字-即(- 9 "5")equals 4


1

PHP,46/41/40字节

while($a=$argv[++$i])echo($b=9-$a[$i-1])?$b:1;

while($a=$argv[++$i])echo$a[$i-1]==7?6:7;

while($a=$argv[++$i])echo($a[$i-1]%2)+1;

各种数字选择器进行比较。我以为“ 9位数”是最短的,但是特殊的情况需要使第一个数字中的零保持不变。

从CLI参数中获取:

php -r "while($a=$argv[++$i])echo($b=9-$a[$i-1])?$b:1;" 12345678 23456789 34567890 45678901 56789012 67890123 78901234 89012345
86421864

1

Ruby,21个字节

$><<$_[$.-1].hex%2+1

完整的程序。与-n标志一起运行。使用以下映射:n -> n%2+1


1

JavaScript(ES6),41

%9 + 1技巧是从Suever的答案中借来的。.reduce节拍一次.map。注意,+=运算符用于避免括号。

a=>+a.reduce((t,n,d)=>t+=(n+t)[d]%9+1,'')

1

Perl,18个字节

包括+1 -p

使用STDIN上的输入线运行。输出为1,对角线为1时除2外

cantor.pl

#!/usr/bin/perl -p
pos=$.;$_=/1\G/+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.