Đường chéo hữu hạn


20

Đưa ra một danh sách các Nsố nguyên, mỗi Nsố có chữ số, xuất ra một số khác với số thứ nhất vì chữ số thứ nhất, số thứ hai vì chữ số thứ hai, v.v.

Thí dụ

Đưa ra danh sách này:

1234
4815
1623
4211

Chữ số 2932đầu tiên của số khác với chữ số thứ nhất của số thứ nhất, chữ số thứ hai của nó khác với chữ số thứ hai của số thứ hai, v.v. Do đó, nó sẽ là đầu ra hợp lệ.

Đầu vào

  • Bạn có thể lấy cả danh sách và Nlàm đầu vào, hoặc chỉ danh sách nếu bạn muốn.
  • Mỗi số nguyên trong danh sách sẽ nhất thiết phải có nhiều chữ số bằng độ dài của danh sách ( N)
  • Số sẽ không có số 0 đứng đầu
  • Danh sách đầu vào phải chứa số và không phải chuỗi.
  • Bạn có thể lấy đầu vào làm đối số chức năng, thông qua STDINhoặc bất cứ điều gì tương tự.
  • Bạn có thể cho rằng danh sách sẽ không dài hơn 10 phần tử (và không có số nào trong danh sách sẽ lớn hơn 2147483647)

Đầu ra

  • Nó không đủ mà đầu ra không có trong danh sách. Các chữ số phải khác nhau như được giải thích ở trên.
  • Bạn có thể sử dụng bất kỳ chiến lược lựa chọn chữ số nào tôn trọng các ràng buộc của các chữ số khác nhau.
  • Số không thể có số 0 đứng đầu
  • Bạn có thể xuất số thông qua STDOUT, trả về từ một hàm, v.v.

Các trường hợp thử nghiệm

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


Vậy chúng ta phải chuyển đổi STDINthành số nguyên trước khi phân tích cú pháp?
Leaky Nun

Đầu vào @KennyLau phải là số, nếu ngôn ngữ của bạn có thể phân tích các chữ số trực tiếp, bạn không phải chuyển đổi bất cứ thứ gì.
Gây tử vong vào

Nhưng STDINtheo mặc định là chuỗi ...
Leaky Nun

Sau đó chuyển đổi chuỗi đầu vào thành một danh sách các số nguyên.
Gây tử vong vào

Chúng tôi có thể xuất ra một danh sách các chữ số?
Conor O'Brien

Câu trả lời:


4

Thạch, 8 7 byte

Lưu 1 byte nhờ Dennis.

DŒDḢỊ‘Ḍ

Hãy thử trực tuyến!

Giải trình

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.

Chuyển đổi từng chữ số thành 1, ngoại trừ 01trở thành 2.


8

CJam ( 15 14 byte)

qN/ee{:=i2%)}%

Bản demo trực tuyến

Cảm ơn Adnan vì đã tiết kiệm một byte.

Mổ xẻ

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
@Ad Nam, không hoạt động, cảm ơn. Ngoài ra, i2%)có thể 49&), làm việc trực tiếp với các ký tự thay vì mã ASCII.
Peter Taylor

7

Python 2, 47 45 byte

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

Cảm ơn @xnor vì đã chơi golf 2 byte!

Kiểm tra nó trên Ideone .

Làm thế nào nó hoạt động

`x`mang lại một chuỗi đại diện của danh sách x .

Đối với trường hợp thử nghiệm đầu tiên, điều này mang lại chuỗi

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

[1::n+3]lấy ra mỗi (n + 3) ký tự thứ - trong đó n là độ dài của x bắt đầu bằng ký tự thứ hai. Kế toán 2 ký tự cho ,, chúng tôi lấy chữ số đầu tiên của số thứ nhất, chữ số thứ hai của số thứ hai, v.v.

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

Bây giờ chúng ta lấy số modulo 10 n 2 để ánh xạ chữ số đầu tiên trong phạm vi [0, 4] .

Đối với 93579135 , chúng tôi nhận được 93579135% 50000000 = 43579135 .

Cuối cùng, chúng tôi thêm 10 n ÷ 9 vào kết quả cuối cùng, tăng dần - bao quanh từ 9 đến 0 - tất cả các chữ số bằng 1 (không mang theo) hoặc 2 (có mang theo).

Đối với 43579135 , chúng tôi nhận được 43579135 + 11111111 = 54690246 .


4

MATL, 11 10 9 byte

VXd9\QV!U

Chỉ lấy một vectơ cột của số nguyên làm đầu vào. Nkhông được cung cấp.

Dùng thử trực tuyến

Giải trình

    % 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 Ôi trời ơi. Có vẻ như nó có một vấn đề không hàng đầu mặc dù khi chữ số đầu tiên là 2: matl.tryitonline.net/iêu
Suever

Có lẽVXd9\QV!U
Suever

Ồ, tôi đã không nghĩ đến việc dẫn đầu số 0 ...
Luis Mendo

@LuisMendo Có vấn đề gì không phải là duy nhất? Miễn là chúng không có cùng giá trị với đầu vào thì không nên quan trọng.
Suever

Bạn hoàn toàn đúng. Tôi đã suy nghĩ về nó một cách sai lầm
Luis Mendo

3

Bình thường, 11 byte

jk.eh!ts@`b

Vòng lặp đơn giản, thay đổi mỗi chữ số thành 1, ngoại trừ 1 trở thành 2.


Sử dụng tốt đẹp của ngầm Qk! Bạn có thể lưu một byte trong khi chuyển đổi chữ số:s.eh-12@`b
Jakube

3

Võng mạc, 39 38 37

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

Đã lưu 1 byte nhờ Martin!

Yêu cầu một linefeed trailing trong đầu vào.

Lấy các đường chéo và dịch 0 và 2-9 thành 1 và 1 thành 2.

Ý tưởng cơ bản để có được các đường chéo là đẩy một bản chụp cho mỗi hàng phía trên hàng hiện tại và sau đó sử dụng một bản chụp để khớp với một ký tự, sau đó giữ ký tự tiếp theo.

Dùng thử trực tuyến


3

J, 26 22 byte

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

Cách tiếp cận tương tự với những người khác bằng cách sử dụng <= 1incrementphương pháp của đường chéo.

Sử dụng

Chỉ yêu cầu danh sách các số nguyên làm đối số.

   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

Xin lỗi để phá vỡ chuỗi 1 ...
NoOneIsHãy là


2

Java, 94 byte

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

Hoạt động số thuần túy cho chiến thắng! :)

Mẫu đầu vào / đầu ra:

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

Chương trình đầy đủ (với mã không mã hóa):

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 byte

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

Ung dung

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

Đầu ra

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Output:
99991999

Input:
1234
4815
1623
4211

Output:
9999

1

J, 37 byte

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

Có thể chơi gôn, nhưng tôi quên nếu có lệnh "đường chéo".


Tôi đã thấy nó được sử dụng trước đây, Martin đã sử dụng các đường chéo ở đây .
FryAmTheEggman

@FryAmTheEggman Vâng, đó là gần. Tôi vẫn đang tìm kiếm, nhưng có thể không có.
Conor O'Brien

Điều này dường như tạo ra số 0 đứng đầu nếu đường chéo bắt đầu bằng số 9.
Zgarb

Bạn có thể tạo bảng chữ số nếu bạn lấy đầu vào n sử dụng<list> (#:~#&10) <n> . Đường chéo đầu tiên có thể được tìm thấy với (< 0 1) |: <list>nơi (< 0 1)là một hộp cho các trục để chọn, sử dụng cả hai, với|:
dặm

1

Reng v.3.3, 60 byte

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

Đối với Reng, điều đó khá đơn giản. Hãy thử nó ở đây! Đầu vào là một danh sách các số được phân tách bằng dấu cách.

1: init

k1-#kaiír1ø

klà số lượng đầu vào (số lượng số) và chúng tôi giảm đi 1 và khôi phục cho giai đoạn vòng lặp. aiímất tất cả đầu vào. rđảo ngược ngăn xếp để xử lý đầu vào. đi đến dòng tiếp theo

2: vòng lặp

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

1[lấy mục trên cùng ra khỏi ngăn xếp và vào một ngăn xếp mới. åchia nó thành các chữ số. {$}đẩy một khối mã chứa hoạt động "thả"; đây là lần lặp lại k( k*) và khối mã bị hủy ( $. k1-#kdecrementsk . )9(puts 9tại STO, và -trừ TOS từ STO. #ocửa hàng số này trong o, và a$;giảm tất cả các thành viên của ngăn xếp. ]đóng chồng mẹ. oputs osao tại trên cùng, đây là chữ số của chúng tôi, chúng tôi đang lưu. )di chuyển nó xuống dưới cùng để chúng tôi có thể tiếp tục vòng lặp của mình. sThường kiểm tra không phải đầu vào (nghĩa là bình đẳng với -1), nhưng chúng tôi có thể sử dụng nó để thoát ra khỏi vòng lặp của chúng tôi khi k == -1. Vì thếs^đi lên khi k == -1. $giảm ktừ ngăn xếp, và vòng lặp của chúng tôi bắt đầu lại.

3: chung kết

                     ~; !nb$<

<hướng con trỏ sang trái và $rơi ktừ ngăn xếp.blà một gương bên trái, vì vậy chúng ta đi qua nó, nhưng nó bật lại khi đánh ;, một gương điều kiện ngăn xếp. !nin một chữ số nếu và chỉ khi chúng ta đi bên trái. ~kết thúc chương trình khi chúng tôi in xong.


1

Toán học 52 byte

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

Điều này tuân theo cách tiếp cận của Peter Taylor và những người khác (không sử dụng mã Ascii).

Thí dụ

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

2112


1

ClojureScript, 58 ký tự

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

Loại yêu cầu làm cho điều này lâu hơn một chút so với cần thiết, và map-indexed rất nhiều ký tự không giúp được.

Thường thì các bài nộp của tôi cũng hợp lệ với Clojure, nhưng điều này đang sử dụng một số rò rỉ của ClojureScript với JavaScript. Phép trừ một số và chuỗi ép buộc chuỗi thành một số - nghĩa là (- 9 "5")bằng 4.


1

PHP, 46/41 / 40 byte

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;

Lựa chọn chữ số khác nhau để so sánh. Tôi nghĩ rằng "9 chữ số" sẽ là ngắn nhất, nhưng trường hợp đặc biệt cần thiết để giữ số 0 trong số đầu tiên áp đảo nó.

Fed từ các đối số 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 byte

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

Một chương trình đầy đủ. Chạy với -ncờ. Sử dụng ánh xạ sau : n -> n%2+1.


1

JavaScript (ES6), 41

Thủ thuật% 9 + 1 được mượn từ câu trả lời của Suever. Cho một lần, .reducenhịp đập .map. Lưu ý, +=toán tử được sử dụng để tránh dấu ngoặc đơn.

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

1

Perl, 18 byte

Bao gồm +1 cho -p

Chạy với các dòng đầu vào trên STDIN. Đầu ra là 1 ngoại trừ 2 khi đường chéo là 1

cantor.pl

#!/usr/bin/perl -p
pos=$.;$_=/1\G/+1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.