Диагональ конечного кантора

20

Учитывая список Nцелых чисел, каждое Nиз которых содержит цифры, выведите число, которое отличается от первого числа из-за первой цифры, второго числа из-за второй цифры и т. Д.

пример

Учитывая этот список:

1234
4815
1623
4211

Число 2932«s первая цифра отличается от первой цифры первого номера, его вторая цифра отличается от второй цифры второго числа в и т.д. Поэтому было бы действительным выходом.

входные

  • Вы можете взять как список, так и в Nкачестве входных данных, или только список, если хотите.
  • Каждое целое число в списке обязательно будет иметь столько цифр, сколько длина списка ( N)
  • Числа не будут иметь начальных нулей
  • Входной список должен содержать цифры, а не строки.
  • Вы можете принимать входные данные как аргументы функции, через STDINили что-нибудь подобное.
  • Вы можете предположить, что список не будет длиннее 10 элементов (и ни один номер в списке не будет больше, чем 2147483647)

Выходы

  • Недостаточно, чтобы вывод не был в списке. Цифры должны отличаться, как описано выше.
  • Вы можете использовать любую стратегию выбора цифр, которая учитывает ограничение различных цифр.
  • Число не может иметь начальные нули
  • Вы можете вывести число через STDOUT, вернуть его из функции и т. Д.

Контрольные примеры

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

счет

Это , поэтому выигрывает самый короткий ответ в байтах.

Fatalize
источник
Таким образом, мы должны преобразовать в STDINцелое число перед анализом?
Лаки Монахиня
Ввод @KennyLau должен быть числами, если ваш язык может анализировать цифры напрямую, вам не нужно ничего преобразовывать.
Fatalize
Но STDINэто строка по умолчанию ...
Leaky Nun
Затем преобразуйте входную строку в список целых чисел.
Fatalize
Можем ли мы вывести список цифр?
Конор О'Брайен

Ответы:

4

Желе, 8 7 байт

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, кроме 0и 1становится 2.

Дрянная Монахиня
источник
8

CJam ( 15 14 байт)

qN/ee{:=i2%)}%

Онлайн демо

Спасибо Аднану за однобайтовую экономию.

рассечение

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
@ Аднан, это работает, спасибо. В качестве альтернативы 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) символ - где n - длина x, начиная со второго. С учетом 2 символов ,мы получаем первую цифру первого числа, вторую цифру второго числа и т. Д.

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

Теперь возьмем число по модулю 10 n ÷ 2, чтобы отобразить первую цифру в диапазоне [0, 4] .

Для 93579135 мы получаем 93579135% 50000000 = 43579135 .

Наконец, мы добавляем 10 n ÷ 9 к последнему результату, который увеличивает (оборачивая от 9 до 0) все цифры на 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
Suever
источник
1
@LuisMendo Ох, крутой. Похоже, что это имеет ведущую нулевую проблему, хотя, когда первая цифра 2: matl.tryitonline.net/…
Suever
ВозможноVXd9\QV!U
Suever
О, я не думал о начале нуля ...
Луис Мендо
@ LuisMendo Имеет ли значение, что они не уникальны? Пока они не совпадают со значением ввода, это не должно иметь значения.
Сувер
Ты совершенно прав. Я думал об этом неправильно
Луис Мендо
3

Pyth, 11 байт

jk.eh!ts@`b

Простой цикл, измените каждую цифру на 1, за исключением того, что 1 становится 2.

orlp
источник
Хорошее использование неявного Qи k! Вы можете сохранить один байт во время преобразования цифр, хотя:s.eh-12@`b
Jakube
3

Сетчатка, 39 38 37

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

Сохранено 1 байт, спасибо Мартин!

Требуется завершающий перевод строки на входе.

Получает диагонали и переводит 0 и 2-9 в 1 и 1 в 2.

Основная идея для получения диагоналей состоит в том, чтобы выдвинуть захват для каждой строки над текущей строкой и затем использовать захват, чтобы соответствовать символу, а затем сохранить следующий символ.

Попробуйте онлайн

FryAmTheEggman
источник
3

J, 26 22 байта

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

Подобный подход к другим, используя <= 1иincrement метод по диагонали.

использование

Требуется только список целых чисел в качестве аргумента.

   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
миль
источник
Извините, что
прервал
2

Ява, 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;}

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

Выход

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
@FryAmTheEggman Да, это близко. Я все еще ищу, но не может быть.
Конор О'Брайен
Кажется, что это приводит к
начальному
Вы можете создать таблицу цифр, если вы берете ввод 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^$

Для Ренга это было довольно просто. Попробуй это здесь!Ввод представляет собой разделенный пробелами список чисел.

1: init

k1-#kaiír1ø

kэто количество входов (число чисел), и мы уменьшаем на 1 и восстанавливаем для этапа цикла. aiíпринимает все входные данные rпереворачивает стек для обработки ввода.переходит на следующую строку.

2: петля

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

1[берет верхний элемент из стека и в новый стек. åразбивает его на цифры. {$}выдвигает блок кода, содержащий операцию «отбрасывание»; это повторяется ktimes ( k*), и блок кода удаляется ( $. k1-#kдекременты k. )9(помещает 9в STOS и -вычитает TOS из STOS. #oсохраняет это число oи a$;удаляет все элементы стека. ]закрывает родительский стек. oпомещает oобратно в вверху; это наша цифра, которую мы сохраняем. )перемещает ее в нижнюю часть, чтобы мы могли продолжить наш цикл. sобычно проверяет отсутствие ввода (т. е. равенство -1), но мы можем использовать ее, чтобы выйти из цикла, когда k == -1. Такs^идет вверх, когда k == -1. $выпадает kиз стека, и наш цикл начинается снова.

3: финал

                     ~; !nb$<

<направляет указатель влево и $сбрасывает kиз стека. bэто левое зеркало, поэтому мы входим через него, но при ударе оно приходит в норму, зеркало ;с состоянием стека. !nпечатает цифру, если и только если мы идем налево. ~завершает программу, когда мы закончим печать.

Конор О'Брайен
источник
1

Mathematica 52 байта

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

Это следует подходу Питера Тейлора и других (без использования кодов Ascii).

пример

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

2112

DavidC
источник
1

ClojureScript, 58 символов

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

Требования к типу делали это немного дольше, чем необходимо, и map-indexedтак много символов не помогло.

Часто мои представления также являются допустимыми Clojure, но это использует некоторую утечку ClojureScript с JavaScript. Вычитание числа и строки приводит строку к числу, то есть (- 9 "5")равно 4.

MattPutnam
источник
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
Toxik-Йогурт
источник
1

Рубин, 21 байт

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

Полная программа. Беги с -nфлагом. Использует следующее отображение: n -> n%2+1.

xsot
источник
1

JavaScript (ES6), 41

Трюк% 9 + 1 заимствован из ответа Сьювера. На этот раз .reduceбьет .map. Обратите внимание, что +=оператор используется, чтобы избежать скобок.

a=>+a.reduce((t,n,d)=>t+=(n+t)[d]%9+1,'')
edc65
источник
1

Perl, 18 байт

Включает +1 для -p

Запустите со строками ввода на STDIN. Выходное значение равно 1, за исключением 2 при диагонали 1

cantor.pl

#!/usr/bin/perl -p
pos=$.;$_=/1\G/+1
Тон Хоспел
источник