Діагональ кінцевого Канта


20

Дано список Nцілих чисел, кожне з Nцифр, виведіть число, яке відрізняється від першого числа через першу цифру, друге число через другу цифру тощо.

Приклад

Враховуючи цей список:

1234
4815
1623
4211

Перша цифра номера 2932відрізняється від першої цифри першого числа, її друга цифра відрізняється від другої цифри другого числа і т. Д. Тому це був би дійсний вихід.

Вхідні дані

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

Виходи

  • Недостатньо, щоб результат не був у списку. Цифри повинні відрізнятися, як пояснено вище.
  • Ви можете використовувати будь-яку стратегію вибору цифр, яка поважає обмеження різних цифр.
  • Число не може мати нульові нулі
  • Ви можете вивести номер через STDOUT, повернути його з функції тощо.

Тестові кейси

Input:
12345678
23456789
34567890
45678901
56789012
67890123
78901234
89012345

Possible output: 24680246


Input:
1

Possible output: 2

Оцінка балів

Це , тому найкоротша відповідь у байтах виграє.


Отже, ми повинні перетворити STDINціле на ціле перед розбором?
Leaky Nun

Вхід @KennyLau має бути цифрами, якщо ви можете безпосередньо розбирати цифри, вам нічого не потрібно конвертувати.
Фаталізувати

Але STDINза замовчуванням є рядок ...
Leaky Nun

Потім перетворять вхідний рядок у список цілих чисел.
Фаталізувати

Чи можемо ми вивести список цифр?
Conor O'Brien

Відповіді:


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
@Adnan, це працює, дякую. Можна 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) й символ - , де п є довжина х , починаючи з другого. Враховуючи 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

1
@LuisMendo Ой сирий. Схоже, у нього є провідна нульова проблема, хоча коли перша цифра 2: matl.tryitonline.net/…
Suever

МожливоVXd9\QV!U
Suever

О, я не думав провести нуль ...
Луїс Мендо

@LuisMendo Чи важливо, що вони не унікальні? До тих пір, поки вони не мають такого ж значення, як вхід, це не повинно мати значення.
Суєвер

Ви абсолютно праві. Я думав про це не так
Луїс Мендо

3

Pyth, 11 байт

jk.eh!ts@`b

Простий цикл, змініть кожну цифру на 1, крім 1 стає 2.


Приємне використання неявного Qта k! Ви можете зберегти один байт за допомогою перетворення цифр, хоча:s.eh-12@`b
Jakube

3

Сітківка, 39 38 37

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

Збережено 1 байт дякую Мартіне!

Потрібна провідна лінія передачі даних у вхід.

Отримує діагоналі і переводить 0 і 2-9 на 1 і 1 на 2.

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

Спробуйте в Інтернеті


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

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

Безумовно

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 Так, це вже близько. Я все ще шукаю, але може бути і не.
Conor O'Brien

Це, здається, призводить до нульового нуля, якщо діагональ починається з 9.
Згарб

Ви можете створити таблицю цифр, якщо взяти введення, 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: ініт

k1-#kaiír1ø

k- це кількість входів (кількість чисел), і ми зменшуємо на 1 і відновлюємо для циклу циклу. aiíприймає весь вхід. rреверсує стек для обробки вхідних даних. переходить до наступного рядка.

2: петля

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

1[знімає верхній елемент зі стека і переходить у новий. åрозбиває його на цифри. {$}висуває блок коду, що містить операцію "drop"; це повторюється kраз ( 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

Математика 52 байти

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

Це випливає з підходу Пітера Тейлора та інших (без використання кодів Ассії).

Приклад

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

2112 рік


1

ClojureScript, 58 символів

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

Вимоги до типу зробили це трохи довше, ніж потрібно, і map-indexedнаявність такої кількості символів не допомогло.

Часто мої матеріали також є дійсними Clojure, але для цього використовується деяка протікання ClojureScript з JavaScript. Віднімання числа і рядка примушує рядок до числа - тобто (- 9 "5")дорівнює 4.


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

1

Рубін, 21 байт

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

Повна програма. Біжи з -nпрапором. Використовує наступне відображення: n -> n%2+1.


1

JavaScript (ES6), 41

Трюк% 9 + 1 запозичений із відповіді Сьювера. Один раз .reduceб’ється .map. Зауважте, +=оператор використовується для уникнення дужок.

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

1

Perl, 18 байт

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

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

cantor.pl

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.