Sonlu Cantor Köşesi


20

NHer biri Nbasamaklı bir tamsayı listesi verildiğinde , ilk basamaktan, ikinci basamaktan dolayı ikinci sayıdan vb. İlk sayıdan farklı bir sayı çıktılayın.

Misal

Bu liste verildiğinde:

1234
4815
1623
4211

Sayının 2932ilk basamağı ilk sayının ilk basamağından farklıdır, ikinci basamağı ikinci sayının ikinci basamağından farklıdır. Bu nedenle geçerli bir çıktı olur.

Girdiler

  • Hem listeyi hem Nde girdi olarak ya da isterseniz yalnızca listeyi alabilirsiniz.
  • Listedeki her tamsayı mutlaka listenin uzunluğu kadar sayıda basamağa sahip olur ( N)
  • Sayıların önünde sıfır yoktur
  • Giriş listesi, dizeleri değil sayıları içermelidir.
  • Girdileri işlev bağımsız değişkenleri aracılığıyla STDINya da benzeri bir şey olarak alabilirsiniz .
  • Listenin 10 öğeden uzun olmayacağını (ve listedeki hiçbir numaranın büyük olmayacağını 2147483647) varsayabilirsiniz.

çıktılar

  • Çıktının listede olmaması yeterli değildir. Rakamlar yukarıda açıklandığı gibi farklılık göstermelidir.
  • Farklı basamakların kısıtlamasına saygı duyan herhangi bir basamak seçim stratejisini kullanabilirsiniz.
  • Sayının başında sıfır olamaz
  • Numarayı çıktı olarak alabilir, STDOUTbir işlevden döndürebilirsiniz, vb.

Test senaryoları

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

puanlama

Bu , bu yüzden bayttaki en kısa cevap kazanır.


Yani STDINayrıştırmadan önce tamsayıyı dönüştürmeliyiz ?
Leaky Nun

@KennyLau girişi sayı olmak zorundadır, eğer dil doğrudan rakamları ayrıştırabilirse hiçbir şeyi dönüştürmeniz gerekmez.
Fatalize

Ama STDINvarsayılan olarak dize ...
Leaky Nun

Sonra girdi dizesini bir tamsayı listesine dönüştürün.
Fatalize

Rakamların bir listesini çıkarabilir miyiz?
Conor O'Brien

Yanıtlar:


4

Jöle, 8 7 bayt

Dennis sayesinde 1 bayt kurtardı.

DŒDḢỊ‘Ḍ

Çevrimiçi deneyin!

açıklama

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.

Çevirir her hane için 1, hariç 0ve 1olur 2.


8

CJam ( 15 14 bayt)

qN/ee{:=i2%)}%

Çevrimiçi demo

Adnan'a bir bayt tasarruf için teşekkürler .

teşrih

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, bu işe yarıyor, teşekkürler. Alternatif i2%)olarak 49&), ASCII kodları yerine doğrudan karakterlerle çalışmak da olabilir .
Peter Taylor

7

Python 2, 47 45 bayt

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

2 bayt golf için @xnor sayesinde!

Ideone üzerinde test edin .

Nasıl çalışır

`x`x listesinin dize olarak temsilini verir .

İlk test için bu verir dize

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

[1::n+3]Her alır (n + 3) inci karakter - burada n, uzunluğu x ikinci bir başlayarak. Muhasebe 2 karakterleri ,, biz vb birinci numaranın ilk rakamı, ikinci sayıdaki ikinci rakamın, almak

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

Şimdi [0, 4] aralığındaki ilk haneyi eşleştirmek için modulo 10 n ÷ 2 sayısını alıyoruz .

İçin 93579135 , aldığımız 93579135% = 43579135 50000000 .

Son olarak, ilave 10 N ÷ 9 son sonuç, hangi artışlarla - sarma yerinden 9 için 0 - bütün basamak 1 (bir taşıma) ya da 2 (taşıma ile).

İçin 43579135 , aldığımız + 11111111 = 54690246 43579135 .


4

MATL, 11 10 9 bayt

VXd9\QV!U

Girdi olarak yalnızca tamsayıların bir sütun vektörünü alır. Nsağlanmamaktadır.

Çevrimiçi Deneyin

açıklama

    % 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 Oh kabalık. İlk hane olduğunda sıfır önde gelen bir sorun var gibi görünüyor 2: matl.tryitonline.net/…
Suever

BelkiVXd9\QV!U
Suever

Oh, sıfır önde
olmayı

@LuisMendo Benzersiz olmadıkları önemli mi? Girişle aynı değer olmadıkları sürece önemli olmamalı.
Suever,

Tamamen haklısın. Yanlış bir şekilde düşünüyordum
Luis Mendo

3

Pyth, 11 bayt

jk.eh!ts@`b

Basit döngü, her basamağı 1 olarak değiştirin, ancak 1 2 olur.


Örtük Qve güzel kullanımı k! Rakam dönüşümü sırasında bir bayt tasarruf edebilirsiniz:s.eh-12@`b
Jakube

3

Retina, 39 38 37

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

1 bayt teşekkürler Martin kurtarıldı!

Girişte bir ardışık satır besleme gerektirir.

Çaprazları alır ve 0 ve 2-9 ila 1 ve 1 ila 2'yi çevirir.

Çaprazları almanın temel fikri, her satır için bir yakalamayı geçerli satırın üzerine itmek ve daha sonra bir karakterle eşleşmek için bir yakalama tüketmek ve ardından bir sonraki karakteri tutmaktır.

Çevrimiçi deneyin


3

J, 26 22 bayt

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

Diyagonal <= 1ve incrementyöntemini kullananlara benzer yaklaşım .

kullanım

Yalnızca bağımsız değişken olarak tamsayıların listesini gerektirir.

   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

1 çizgi kırmak için üzgünüm ...
NoOneIsHere


2

Java, 94 bayt

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

Kazanmak için saf sayısal işlemler! :)

Örnek giriş / çıkış:

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

Tam program (kodlanmamış kod ile):

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 bayt

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

Ungolfed

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

Çıktı

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Output:
99991999

Input:
1234
4815
1623
4211

Output:
9999

1

J, 37 bayt

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

Muhtemelen golf olabilir, ama "çapraz" için bir komut olup olmadığını unuttum.


Daha önce kullanıldığını gördüm, Martin burada anti-köşegenleri kullandı .
FryAmTheEggman

@FryAmTheEggman Evet, bu yakın. Hala bakıyorum ama olmayabilir de.
Conor O'Brien

Eğer köşegen 9 ile başlıyorsa, bu sıfır önde geliyor gibi görünüyor.
Zgarb

Girdiyi nkullanarak alırsanız basamaklar tablosunu oluşturabilirsiniz <list> (#:~#&10) <n>. İlk diyagonal ile bulunabilir (< 0 1) |: <list>nerede (< 0 1)ile, ikisini de kullanarak, eksenler seçmek için bir kutudur|:
mil

1

Reng v.3.3, 60 bayt

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

Reng için bu oldukça basitti. Burada deneyin! Girdi, boşlukla ayrılmış bir sayı listesidir.

1: init

k1-#kaiír1ø

kgiriş sayısıdır (sayı sayısı) ve 1'e kadar azalır ve döngü aşaması için geri yükleriz. aiítüm girdiyi alır. rgirdinin işlenmesi için yığını tersine çevirir. sonraki satıra gider.

2: döngü

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

1[üst öğeyi yığından çıkarır ve yeni bir yığına alır. årakamlara böler. {$}"drop" işlemini içeren bir kod bloğunu iter; Bu tekrarlanır k(kez k*) ve kod bloğu damlatılır ( $. k1-#kazaltmakta k. )9(koyar 9stos de ve -çıkarır stos gelen TOS. #odepolar, bu sayı o, ve a$;istifin tüm üyeleri düşer. ]ana yığını kapatır. okoyar ode geri en üstte; bu bizim kaydettiğimiz )rakamımız. döngüye devam edebilmemiz için onu aşağıya taşır.Genellikle sgirdi olmayan (örneğin eşitlik -1) olup olmadığını kontrol eder , ancak bunu döngüden çıkmak için kullanabiliriz. k == -1. Yanis^ne zaman yükselir k == -1. yığından $düşer kve döngümüz tekrar başlar.

3: final

                     ~; !nb$<

<Sol işaretçi yönlendirir ve $damla kistiften. bbir sol aynadır, bu yüzden ona gireriz, ancak vurulduğunda ;bir yığın durumu aynası geri döner . !nyalnızca sola gidersek rakam basar. ~yazdırmayı bitirdiğimizde programı sonlandırır.


1

Mathematica 52 bayt

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

Bu Peter Taylor ve diğerlerinin (Ascii kodlarını kullanmadan) yaklaşımını izler.

Misal

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

2112


1

ClojureScript, 58 karakter

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

Tür gereksinimleri bunu gereğinden biraz daha map-indexeduzattı ve çok fazla karakter olması işe yaramadı.

Genellikle gönderilerim de geçerli Clojure'dur, ancak bu ClojureScript'in JavaScript ile sızdırmazlığını kullanıyor. Bir sayının ve dizenin çıkarılması, dizeyi bir sayıya zorlar - yani, (- 9 "5")eşittir 4.


1

PHP, 46/41/40 bayt

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;

Karşılaştırma için çeşitli basamak seçiciler. "9 basamaklı" nın en kısa olacağını düşündüm, ancak ilk basamaktan sıfıra tutmak için gereken özel durum bunalmış durumda.

CLI argümanlarından beslendi:

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 bayt

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

Tam bir program. -nBayrağı ile çalıştırın . Aşağıdaki eşleme kullanır: n -> n%2+1.


1

JavaScript (ES6), 41

% 9 + 1 numarası Suever'in cevabından ödünç alındı. Bir kere, .reducevurur .map. Unutmayın, +=operatör parantezlerden kaçınmak için kullanılır.

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

1

Perl, 18 bayt

İçin +1 içerir -p

STDIN üzerindeki giriş satırlarıyla çalıştırın. Diyagonal 1 olduğunda çıkış 1 hariç 2'dir

cantor.pl

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.