Diagonal Cantor yang Terbatas

20

Diberikan daftar Nbilangan bulat, masing-masing dengan Ndigit, mengeluarkan angka yang berbeda dari angka pertama karena digit pertama, angka kedua karena digit kedua, dll.

Contoh

Diberikan daftar ini:

1234
4815
1623
4211

Jumlah 2932's digit pertama adalah berbeda dari jumlah pertama digit pertama, angka kedua adalah berbeda dari digit kedua nomor kedua ini, dll Oleh karena itu akan menjadi output yang valid.

Input

  • Anda dapat mengambil daftar dan Nsebagai input, atau hanya daftar jika Anda mau.
  • Setiap bilangan bulat dalam daftar harus memiliki digit sebanyak panjang daftar ( N)
  • Angka tidak akan memiliki nol terkemuka
  • Daftar input harus berisi angka dan bukan string.
  • Anda dapat mengambil input sebagai argumen fungsi, melalui STDIN, atau yang serupa.
  • Anda dapat mengasumsikan bahwa daftar tidak akan lebih dari 10 elemen (dan tidak ada nomor dalam daftar akan lebih besar dari 2147483647)

Keluaran

  • Tidak cukup bahwa output tidak ada dalam daftar. Digit harus berbeda seperti yang dijelaskan di atas.
  • Anda dapat menggunakan strategi pemilihan digit apa pun yang menghargai batasan berbagai digit.
  • Jumlahnya tidak boleh memiliki angka nol di depan
  • Anda dapat menampilkan nomor melalui STDOUT, mengembalikannya dari fungsi, dll.

Uji kasus

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Fatalisasi
sumber
Jadi kita harus mengonversikan STDINke integer sebelum parsing?
Leaky Nun
Input @KennyLau harus berupa angka, jika bahasa Anda dapat menguraikan digit secara langsung, Anda tidak perlu mengonversi apa pun.
Fatalkan
Tetapi STDINsecara default adalah string ...
Leaky Nun
Kemudian konversi string input ke daftar bilangan bulat.
Melegalkan
Bisakah kita menampilkan daftar digit?
Conor O'Brien

Jawaban:

4

Jelly, 8 7 byte

1 byte disimpan berkat Dennis.

DŒDḢỊ‘Ḍ

Cobalah online!

Penjelasan

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.

Mengubah setiap digit menjadi 1, kecuali 0dan 1menjadi 2.

Biarawati Bocor
sumber
8

CJam ( 15 14 bytes)

qN/ee{:=i2%)}%

Demo online

Terima kasih kepada Adnan untuk penghematan satu byte.

Pembedahan

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
}%
Peter Taylor
sumber
1
@ Adnan, itu berhasil, terima kasih. Atau i2%)bisa juga 49&), bekerja secara langsung dengan karakter daripada kode ASCII.
Peter Taylor
7

Python 2, 47 45 byte

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

Terima kasih kepada @xnor karena bermain golf 2 byte!

Uji di Ideone .

Bagaimana itu bekerja

`x`menghasilkan representasi string dari daftar x .

Untuk test case pertama, ini memberikan string

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

[1::n+3]mengambil setiap (n + 3) karakter th - di mana n adalah panjang x dimulai dengan yang kedua. Akuntansi 2 karakter untuk ,, kami mengambil digit pertama dari angka pertama, digit kedua dari angka kedua, dll.

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

Kami sekarang mengambil nomor modulo 10 n ÷ 2 untuk memetakan digit pertama dalam kisaran [0, 4] .

Untuk 93579135 , kami mendapatkan 93579135% 50000000 = 43579135 .

Akhirnya, kami menambahkan 10 n ÷ 9 ke hasil terakhir, yang menambah - membungkus dari 9 menjadi 0 - semua digit dengan 1 (tanpa carry) atau 2 (dengan carry).

Untuk 43579135 , kita mendapatkan 43579135 + 11111111 = 54690246 .

Dennis
sumber
4

MATL, 11 10 9 byte

VXd9\QV!U

Hanya mengambil vektor kolom bilangan bulat sebagai input. Ntidak disediakan.

Cobalah secara Online

Penjelasan

    % 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
Suever
sumber
1
@LuisMendo Oh crud. Sepertinya ia memiliki nol masalah utama meskipun ketika digit pertama adalah 2: matl.tryitonline.net/...
Suever
MungkinVXd9\QV!U
Suever
Oh, saya tidak pernah berpikir untuk memimpin nol ...
Luis Mendo
@LuisMendo Apakah penting mereka tidak unik? Selama mereka bukan nilai yang sama dengan input itu seharusnya tidak masalah.
Suever
Anda sepenuhnya benar. Saya memikirkannya dengan cara yang salah
Luis Mendo
3

Pyth, 11 byte

jk.eh!ts@`b

Simpul sederhana, ubah setiap digit menjadi 1, kecuali 1 menjadi 2.

orlp
sumber
Nice penggunaan implisit Qdan k! Anda dapat menyimpan satu byte dengan selama transformasi digit:s.eh-12@`b
Jakube
3

Retina, 39 38 37

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

Disimpan 1 byte, terima kasih Martin!

Membutuhkan linefeed tambahan di input.

Mendapat diagonal dan menerjemahkan 0 dan 2-9 ke 1 dan 1 ke 2.

Ide dasar untuk mendapatkan diagonal adalah untuk mendorong tangkapan untuk setiap baris di atas baris saat ini dan kemudian mengkonsumsi tangkapan untuk mencocokkan karakter, kemudian mempertahankan karakter berikutnya.

Cobalah online

FryAmTheEggman
sumber
3

J, 26 22 byte

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

Pendekatan serupa dengan yang lain menggunakan metode <= 1dan incrementdiagonal.

Pemakaian

Hanya membutuhkan daftar bilangan bulat sebagai argumen.

   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
mil
sumber
Maaf untuk melanggar 1 streak ...
NoOneIsHere
2

Python 2, 54 byte

d,r=1,""
for n in input():r+=`1+-~n/d%9`;d*=10
print r
orlp
sumber
Kedengarannya familiar. -~n
Erik the Outgolfer
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;}

Operasi numerik murni untuk kemenangan! :)

Input / output sampel:

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

Program lengkap (dengan kode ungolfed):

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();
    }
}
Biarawati Bocor
sumber
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;}

Tidak disatukan

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

Keluaran

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Output:
99991999

Input:
1234
4815
1623
4211

Output:
9999
Marv
sumber
1

J, 37 byte

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

Mungkin bisa bermain golf, tetapi saya lupa jika ada perintah untuk "diagonal".

Conor O'Brien
sumber
Saya pernah melihatnya digunakan sebelumnya, Martin menggunakan anti-diagonal di sini .
FryAmTheEggman
@FryAmTheEggman Ya, sudah dekat. Saya masih mencari, tetapi mungkin tidak ada.
Conor O'Brien
Ini tampaknya menghasilkan nol di depan jika diagonal dimulai dengan 9.
Zgarb
Anda dapat membuat tabel angka jika Anda nmenggunakan input <list> (#:~#&10) <n>. Diagonal pertama dapat ditemukan di (< 0 1) |: <list>mana (< 0 1)ada kotak untuk sumbu untuk memilih, menggunakan keduanya, dengan|:
mil
1

Reng v.3.3, 60 byte

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

Bagi Reng, itu agak sederhana. Coba di sini! Input adalah daftar angka yang dipisahkan ruang.

1: init

k1-#kaiír1ø

kadalah jumlah input (jumlah angka), dan kami mengurangi 1 dan mengembalikan untuk tahap loop. aiímengambil semua input. rmembalikkan tumpukan untuk pemrosesan input. pergi ke baris berikutnya.

2: lingkaran

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

1[mengambil item teratas dari tumpukan dan ke tumpukan baru. åmembaginya menjadi digit. {$}mendorong blok kode yang berisi operasi "drop"; ini diulangi kkali ( k*) dan blok kode dijatuhkan ( $. k1-#kdecrements k. )9(Menempatkan 9di STOS, dan -mengurangi TOS dari STOS. #omenyimpan nomor ini di o, dan a$;menjatuhkan semua anggota tumpukan. ]Menutup tumpukan induk. oMenempatkan okembali di tumpukan bagian atas; ini adalah digit yang kami simpan. )memindahkannya ke bawah sehingga kami dapat melanjutkan perulangan kami. sbiasanya memeriksa non-input (yaitu, persamaan untuk-1 ), tetapi kita dapat menggunakannya untuk keluar dari loop ketika k == -1Jadis^naik saat k == -1. $turun kdari tumpukan, dan loop kami mulai lagi.

3: final

                     ~; !nb$<

<mengarahkan pointer ke kiri, dan $turun kdari tumpukan. badalah cermin kiri, jadi kita masuk melaluinya, tetapi memantul kembali ketika memukul ;, cermin kondisi-tumpukan. !nmencetak angka jika dan hanya jika kita ke kiri. ~mengakhiri program saat kita selesai mencetak.

Conor O'Brien
sumber
1

Mathematica 52 byte

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

Ini mengikuti pendekatan Peter Taylor dan lainnya (tanpa menggunakan kode Ascii).

Contoh

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

2112

DavidC
sumber
1

ClojureScript, 58 karakter

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

Persyaratan jenis membuat ini sedikit lebih lama dari yang diperlukan, dan map-indexedmenjadi begitu banyak karakter tidak membantu.

Seringkali kiriman saya juga Clojure yang valid, tetapi ini menggunakan beberapa kebocoran ClojureScript dengan JavaScript. Pengurangan angka dan string memaksa string ke angka - yaitu, (- 9 "5")sama dengan 4.

MattPutnam
sumber
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;

Berbagai pemilih digit untuk perbandingan. Saya pikir "9-digit" akan menjadi yang terpendek, tetapi case khusus yang diperlukan untuk menjaga nol dari digit pertama akan membuatnya kewalahan.

Diberi argumen dari CLI:

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

Ruby, 21 byte

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

Program lengkap. Jalankan dengan -nbendera. Menggunakan pemetaan berikut: n -> n%2+1.

xsot
sumber
1

JavaScript (ES6), 41

Trik% 9 + 1 dipinjam dari jawaban Suever. Untuk sekali, .reduceketukan .map. Catatan, +=operator digunakan untuk menghindari tanda kurung.

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

Perl, 18 byte

Termasuk +1 untuk -p

Jalankan dengan jalur input pada STDIN. Output adalah 1 kecuali 2 ketika diagonal adalah 1

cantor.pl

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