Skończona przekątna kantora

20

Biorąc pod uwagę listę Nliczb całkowitych, każda z Ncyframi, wypisuje liczbę, która różni się od pierwszej liczby z powodu pierwszej cyfry, drugiej liczby z powodu drugiej cyfry itp.

Przykład

Biorąc pod uwagę tę listę:

1234
4815
1623
4211

Liczba 2932jest pierwsza cyfra jest inna od pierwszej liczby pierwszej cyfrze, jego druga cyfra jest różna od drugiej cyfry druga liczba jest itp Dlatego byłoby to ważne wyjście.

Wejścia

  • Możesz wziąć zarówno listę, Njak i dane wejściowe, lub tylko listę, jeśli chcesz.
  • Każda liczba całkowita na liście musi koniecznie mieć tyle cyfr, ile długość listy ( N)
  • Liczby nie będą miały żadnych zer wiodących
  • Lista wejściowa musi zawierać liczby, a nie ciągi znaków.
  • Możesz przyjmować dane wejściowe jako argumenty funkcji, poprzez STDINlub cokolwiek podobnego.
  • Możesz założyć, że lista nie będzie dłuższa niż 10 elementów (i żadna liczba na liście nie będzie większa niż 2147483647)

Wyjścia

  • Nie wystarczy, że danych wyjściowych nie ma na liście. Cyfry muszą się różnić, jak wyjaśniono powyżej.
  • Możesz użyć dowolnej strategii wyboru cyfr, która szanuje ograniczenia różnych cyfr.
  • Liczba nie może mieć wiodących zer
  • Możesz podać liczbę poprzez STDOUT, zwrócić ją z funkcji itp.

Przypadki testowe

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Fatalizować
źródło
Musimy więc przekonwertować STDINliczbę całkowitą przed analizą?
Leaky Nun
Dane wejściowe @KennyLau muszą być liczbami, jeśli Twój język może parsować cyfry bezpośrednio, nie musisz niczego konwertować.
Fatalize
Ale STDINdomyślnie jest to string ...
Leaky Nun
Następnie przekonwertuj ciąg wejściowy na listę liczb całkowitych.
Fatalize
Czy możemy wypisać listę cyfr?
Conor O'Brien

Odpowiedzi:

4

Galaretka, 8 7 bajtów

1 bajt zapisany dzięki Dennisowi.

DŒDḢỊ‘Ḍ

Wypróbuj online!

Wyjaśnienie

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.

Konwertuje każdą cyfrę na 1, z wyjątkiem 0i 1staje się 2.

Leaky Nun
źródło
8

CJam ( 15 14 bajtów)

qN/ee{:=i2%)}%

Demo online

Dzięki Adnan za jednobajtowe oszczędności.

Sekcja

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
źródło
1
@Adnan, to działa, dzięki. Alternatywnie i2%)może to być 49&)praca bezpośrednio ze znakami, a nie kodami ASCII.
Peter Taylor
7

Python 2, 47 45 bajtów

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

Dzięki @xnor za grę w golfa z 2 bajtów!

Przetestuj na Ideone .

Jak to działa

`x`daje ciąg znaków reprezentujący listę x .

W pierwszym przypadku testowym daje to ciąg znaków

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

[1::n+3]pobiera co (N + 3) th postaci - w którym n oznacza długość x począwszy od drugiego. Rozliczając 2 znaki ,, pobieramy pierwszą cyfrę pierwszej liczby, drugą cyfrę drugiej liczby itp.

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

Bierzemy teraz liczbę modulo 10 n ÷ 2, aby zmapować pierwszą cyfrę z zakresu [0, 4] .

W przypadku 93579135 otrzymujemy 93579135% 50000000 = 43579135 .

Na koniec dodajemy 10 n ÷ 9 do ostatniego wyniku, co zwiększa - zawijając od 9 do 0 - wszystkie cyfry o 1 (brak przeniesienia) lub 2 (z przeniesieniem).

W przypadku 43579135 otrzymujemy 43579135 + 11111111 = 54690246 .

Dennis
źródło
4

MATL, 11 10 9 bajtów

VXd9\QV!U

Pobiera na wejściu tylko wektor kolumnowy liczb całkowitych. Nnie jest zapewniony.

Wypróbuj online

Wyjaśnienie

    % 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
źródło
1
@LuisMendo Oh crud. Wygląda na to, że ma wiodący problem zero, gdy pierwsza cyfra to 2: matl.tryitonline.net/…
Suever
MożeVXd9\QV!U
Suever
Och, nie myślałem o prowadzeniu zera ...
Luis Mendo
@LuisMendo Czy to ważne, że nie są wyjątkowe? Dopóki nie są one tej samej wartości co dane wejściowe, nie powinno to mieć znaczenia.
Suever
Masz całkowitą rację. Myślałem o tym w niewłaściwy sposób
Luis Mendo
3

Pyth, 11 bajtów

jk.eh!ts@`b

Prosta pętla, zmień każdą cyfrę na 1, z wyjątkiem tego, że 1 staje się 2.

orlp
źródło
Ładne użycie niejawnego Qi k! Możesz jednak zaoszczędzić jeden bajt podczas transformacji cyfr:s.eh-12@`b
Jakube
3

Siatkówka oka, 39 38 37

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

Zapisano 1 bajt dzięki Martin!

Wymaga końcowego wejścia liniowego na wejściu.

Pobiera przekątne i tłumaczy 0 i 2-9 na 1 oraz 1 na 2.

Podstawowym pomysłem na zdobycie przekątnych jest przesunięcie przechwytywania dla każdego rzędu powyżej bieżącego rzędu, a następnie wykorzystanie przechwytywania w celu dopasowania do postaci, a następnie zachowanie następnego znaku.

Wypróbuj online

FryAmTheEggman
źródło
3

J, 26 22 bajtów

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

Podobne podejście do innych przy użyciu metody <= 1i incrementdiagonalnej.

Stosowanie

Wymaga tylko listy liczb całkowitych jako argumentu.

   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
mile
źródło
Przepraszam, że przełamałem 1 passę ...
NoOneIsHere
2

Python 2, 54 bajty

d,r=1,""
for n in input():r+=`1+-~n/d%9`;d*=10
print r
orlp
źródło
Brzmi znajomo. -~n
Erik the Outgolfer,
2

Java, 94 bajty

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

Czyste operacje numeryczne dla wygranej! :)

Przykładowe wejście / wyjście:

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

Pełny program (z nie golfowym kodem):

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();
    }
}
Leaky Nun
źródło
2

Java, 93 bajty

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

Nie golfił

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

Wynik

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Output:
99991999

Input:
1234
4815
1623
4211

Output:
9999
Marv
źródło
1

J, 37 bajtów

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

Prawdopodobnie można grać w golfa, ale zapomniałem, czy istnieje polecenie „przekątnych”.

Conor O'Brien
źródło
Widziałem kiedyś przed Martin stosowane anty-przekątnych tutaj .
FryAmTheEggman
@FryAmTheEggman Tak, to blisko. Nadal szukam, ale może nie być.
Conor O'Brien
Wydaje się to dawać wiodące zero, jeśli przekątna zaczyna się od 9.
Zgarb
Możesz utworzyć tabelę cyfr, jeśli wprowadzisz dane nza pomocą <list> (#:~#&10) <n>. Pierwszą przekątną można znaleźć (< 0 1) |: <list>gdzie (< 0 1)jest pole do wyboru przez osie, używając obu, z|:
milami
1

Reng v.3.3, 60 bajtów

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

Dla Renga było to dość proste. Wypróbuj tutaj! Dane wejściowe to rozdzielona spacjami lista liczb.

1: init

k1-#kaiír1ø

kto liczba wejść (liczba liczb), a my zmniejszamy o 1 i przywracamy dla etapu pętli. aiípobiera wszystkie dane wejściowe. rodwraca stos do przetwarzania danych wejściowych. przechodzi do następnej linii.

2: pętla

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

1[zdejmuje najwyższy przedmiot ze stosu i umieszcza go w nowym stosie. ådzieli go na cyfry. {$}wypycha blok kodu zawierający operację „upuść”; jest to powtarzane krazy ( k*) i blok kodu jest upuszczany ( $. k1-#kzmniejsza k. )9(umieszcza 9w STOS i -odejmuje TOS od STOS. #oprzechowuje ten numer oi a$;upuszcza wszystkie elementy stosu. ]zamyka stos macierzysty. oodkłada z opowrotem na góra; to nasza cyfra, którą zapisujemy. )przesuwa ją na dół, abyśmy mogli kontynuować zapętlanie. szwykle sprawdza brak wejścia (tzn. równość do -1), ale możemy go użyć, aby wyjść z pętli, gdy k == -1. Więcs^idzie kiedy k == -1. $spada kze stosu, a nasza pętla zaczyna się od nowa.

3: końcowy

                     ~; !nb$<

<kieruje wskaźnik w lewo i $spada kze stosu. bjest lustrem lewostronnym, więc wchodzimy przez niego, ale odbija się ono z powrotem po trafieniu ;, lustro w stosie. !nwypisuje cyfrę, jeśli i tylko jeśli idziemy w lewo. ~kończy program po zakończeniu drukowania.

Conor O'Brien
źródło
1

Mathematica 52 bajty

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

Jest to zgodne z podejściem Petera Taylora i innych (bez użycia kodów Ascii).

Przykład

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

2112

DavidC
źródło
1

ClojureScript, 58 znaków

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

Wymagania dotyczące typu sprawiły, że było to trochę dłużej niż to konieczne, a map-indexedbycie tak wieloma znakami nie pomogło.

Często moje zgłoszenia są również poprawne Clojure, ale wykorzystuje to niektóre z nieszczelności ClojureScript w JavaScript. Odejmowanie liczby i ciągu powoduje, że ciąg jest wymuszany na liczbę - to znaczy (- 9 "5")równa się 4.

MattPutnam
źródło
1

PHP, 46/41/40 bajtów

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;

Różne selektory cyfr do porównania. Myślałem, że „9-cyfrowy” będzie najkrótszy, ale specjalny przypadek potrzebny do utrzymania zera z pierwszej cyfry go przytłacza.

Dostarczone z argumentów 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-jogurt
źródło
1

Ruby, 21 bajtów

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

Pełny program. Uruchom z -nflagą. Wykorzystuje następujące odwzorowanie: n -> n%2+1.

xsot
źródło
1

JavaScript (ES6), 41

Sztuczka% 9 + 1 została zapożyczona z odpowiedzi Suever. Tym razem .reducebije .map. Uwaga: +=operator służy do unikania nawiasów.

a=>+a.reduce((t,n,d)=>t+=(n+t)[d]%9+1,'')
edc65
źródło
1

Perl, 18 bajtów

Obejmuje +1 dla -p

Uruchom z wierszami wejściowymi na STDIN. Wyjście wynosi 1, z wyjątkiem 2, gdy przekątna wynosi 1

cantor.pl

#!/usr/bin/perl -p
pos=$.;$_=/1\G/+1
Ton Hospel
źródło