Приведен стандартный кодовый замок, как на картинке. Чтобы разблокировать его, выровняйте 4 цифры в коде на комбинированной линии. После многих лет верного служения вы были уволены с фабрики замков и решили отомстить, не запутав замки перед тем, как отправлять их, оставив таким образом каждый замок с комбинацией, чтобы разблокировать его на линии комбинации.
Вы также знаете, что, глядя на порядок чисел в других строках, можно определить, какие числа должны быть на комбинированной линии (и, следовательно, комбинация, чтобы разблокировать ее).
Если каждой строке в замке присваивается номер, начинающийся со строки 0 для строки комбинации (строка, которая разблокирует блокировку) до строки 9. Например, если числа в строке 4 равны 5336
, то комбинация для разблокировки будет такой 1992
.
К сожалению, замки уже были упакованы, и ваш вид каждого замка скрыт, поэтому вы можете видеть только цифры на разных строках замка.
Соревнование
Учитывая 4 пары цифр, где первая цифра целого числа представляет номер строки, а вторая цифра представляет число, которое появляется в этой строке, определите комбинацию для блокировки. Например, если вы введете:
57 23 99 45
Тогда он должен вывести:
2101
Или
25 78 63 15
а также
3174
Предположим, что входными данными всегда будут 4 натуральных числа в форме `25 64 72 18.
Это код-гольф , поэтому выигрывает самая короткая программа по количеству байтов.
Также это мой первый вопрос, поэтому любые отзывы приветствуются.
57 23 99 45
. Это не четыре пары целых чисел: это четыре целых числа. И некоторые ответы предполагают, что они получают это как строку, в то время как другие предполагают, что она получена готовой как 4 дюйма.0
буквами).Ответы:
CJam,
98 байтовЧитает пары цифр как аргументы командной строки. Чтобы попробовать код в Интернете , изменения
ea
вlS/
читать с моделируемой STDIN.Пример запуска
Как это работает
Код символа цифры d составляет 48 + d . Таким образом, учитывая двузначную строку xy, базовое число 9 дает 9 * (48 + x) + (48 + y) = 10 * (48 + x) + y - x ≡ y - x (mod 10) .
источник
"99"
фактически интерпретируется как массив с[57 57]
помощьюb
;"xy"9b
реализован как9 * ord(x) + ord(y)
. Я должен добавить это к моему ответу.CJam,
131211 символовБлагодаря user23013, его теперь до 11 символов :)
Пояснения:
Попробуйте онлайн
Я знаю, что это может быть в гольф больше. Но это моя первая настоящая попытка в CJam, и я ограничен опытом :)
В качестве альтернативы, другие методы могут сделать то же самое в 1 дополнительном символе:
или
или
источник
l~]
. Я чувствую, что парсинг ввода должен быть возможен менее чем с тремя, но я никогда раньше не использовал CJam: /4{ri_A/-A%}*
на один байт короче.4{Ar:--A%}*
.Golfscript (14
13)Попробуйте онлайн здесь
Это почти то же самое, что и решение Оптимизатора , но на другом языке. Трудно подойти к нему по-другому, потому что проблема довольно проста
, поэтому связь, безусловно, идет к Оптимизатору, чья запись была раньше.Для того же количества байтов вы можете сделать
источник
- 10
.GNU dc , 14 байтов
Заимствование умной базы 9 Денниса трюк :
Входные целые числа читаются из STDIN, по одному в строке.
Объяснение:
Выход:
Предыдущий ответ, 18 байт:
Потому что я думал, что смогу приблизиться к языкам "игры в гольф" с этим (но не сделал):
источник
9i[?A%nd]dxxxx
C
646356 или 61Если вход может быть передан из файла
Если ввод должен быть введен в стандартный ввод
Считывает четыре числа в цикле, а затем обрабатывает каждое, вычитая первую цифру из значения и печатая результат по модулю 10.
Экономия благодаря различным комментариям ниже, а также использованию putchar вместо printf
источник
scanf
снаружи,for()
как этоa,i;main(){for(;i++-4;printf("%d",(a-a/10)%10))scanf("%d",&a);}
a*.9
вместоa-a/10
while
цикл и объявивa
в качестве аргументаmain
:main(a){while(scanf("%d",&a)>0)printf("%d",(a-a/10)%10);}
Python 3, 64
Непосредственная.
Это может быть короче, если мне разрешат напечатать, скажем,
[2, 1, 0, 1]
вместо этого ( 46 ):источник
str((i-i//10)%10)
непосредственно вместо того, чтобы использовать секундуmap()
. Я тоже начал с генераторов, но обнаружил, что реальныйfor
цикл оказался короче.print(''.join((i-i//10)%10for i in map(int,input().split())))
. Кроме того, если пробела allowd на выходе вы можете избежатьjoin
и использования кортежа распаковки:print(*((i-i//10)%10for i in map(int,input().split())))
.С 92
Ввод из командной строки. Вычитает первый ASCII-код каждого аргумента из второго, добавляет 10 и принимает модуль 10.
Я думаю, что это первый раз, когда я написал
printf
с 4%
с и без запятой (запятая в#define.
)источник
#define f scanf("%c%c ",&a,&b);putchar(48+(9*a+b)%10)
затемa,b;main(){f;f;f;f;}
будет на 18 байт короче.scanf
необходимо, учитывая, чтоscanf
предполагается анализировать пробелы только в качестве разделителя. У Алхимика есть еще лучшая идея в Си. Но похоже, что вы уже выиграли его с ответом Cjam.a(n)
может быть пропущен, затем я заметил, что размещениеprintf("%d%,...)
вашего макроса сэкономит несколько байтов, и, наконец, я немного увлекся ... - Пространство необходимо, так как%c
читает символ, любой характер, поэтому на втором прогоне он будет хранить 32 вa
. - Победить CJam с C должно быть сложно.printf()
уже так долго, как мой ответ ...Java - 203 байта
Просто потому , что имеет быть запись Java, я увидел хорошую возможность дать этот код , играя в гольф шанс (первое представление когда - либо).
Если есть место для некоторых улучшений, я буду рад узнать о них ;-)
источник
Lua - 46 символов
Читает по три символа за раз (даю мне небольшую милость ввода пробела в конце), и даже если a и b являются string-y ... ba MAGICALUALY позволяет им представить целое число здорового ребенка. Проверяет ли обтекание во время печати.
источник
JavaScript ES6 -
5343 байтаДовольно простая функция, использует регулярные выражения для получения чисел. Попробуйте это на http://jsfiddle.net/efc93986/1/ . Если функции не разрешены, автономная программа на 52 байта:
Поскольку ES6 в настоящее время работает только в Firefox, следующий код работает в любом современном браузере, размером 70 байт:
источник
1+
....?
вместо/\d+ ?
. Пробел после возврата можно опустить. Кроме того, поскольку не был указан конкретный ввод-вывод, вы должны иметь возможность использовать функцию.a-a[0]
вместо того,1+a[1]-a[0]
чтобы работать, а также.Python 2 - 33 байта
Принимает разделенный запятыми пользовательский ввод. Например, вход:
Выход:
Если выходные данные необходимы, чтобы точно соответствовать примеру, то это намного дольше. 47 байт:
источник
input()
не работает в моем интерпретаторе Python 2.APL, 14
Объяснение
⎕
берет ввод с экрана. Разделенные пробелом значения анализируются как массив.{...}¨
для каждого числа, введите его в функцию.⍎¨⍕⍵
принимает аргумент, создайте массив из его цифр.--/
рассчитывает единицы минус десятки.10|
мод 10.источник
J -
2015Форма без глагола (как утверждение вместо определения функции) на 5 символов короче:
Форма глагола, который является хорошим поездом :
Этот глагол используется в примерах ввода:
источник
Haskell
6058Односимвольные цифры, настоящая враг в игре в Haskell.
источник
Perl:
3840Выход:
источник
abs
не обязательно;x - x/10
не может быть отрицательным. 3. Если вы используете флаги-040pe
(обычно насчитывающие 5 байтов) для перебора входных данных, разделенных пробелами, вы можете сократить свой код до$_=($_-int$_/10)%10
. 4. Если вы предпочитаете избегать флагов командной строки, вы все равно можете сохранить несколько байтов, установив$/=$;
и удалив вызовsplit
.Рубин, 35 байт
объяснение
Ввод принимается в качестве аргументов командной строки.
String#bytes
возвращает массив целых чисел (коды символов ASCII). Важна только разница между последним и первым символьным кодом, а не сами целые числа.источник
C # & LinqPad: 104
источник
C ++ 118
источник
#include<iostream>
иstd::
до,cin
иcout
. 2. Вам не нужно условное, если вы опуститеa=a%10
. 3. Вам не нужны переменныеb
иc
, перевод строки и (с небольшой модификацией) скобки вокруг цикла for.#include<iostream>
иusing namespace std;
PHP - 90 символов
Я подумал, что я бы попробовал Code Golf, поэтому вот моя первая попытка - возможно, больше играть в гольф.
58 персонажей (любезно предоставлено Исмаилом Мигелем)
Доступ к файлу с помощью
источник
<? for($i=0;$i<4;)echo abs($_GET[n][$i]%10);
длиной 44 символа. Доступ из браузера с помощьюfile.php?n[]=xx&n[]=yy&n[]=xy&n[]=yx
. (непроверенный код)$_GET
но она показывает 57% 10, и мне нужно (5-7)% 10<? for($i=0,$a=$_GET[n];$i<4;++$i)echo abs($a[$i][0]-$a[$i++][1]%10);
. К сожалению, это 65 байт. (забыл$i
инкремент на последнем) Или вы можете попробовать<? for($i=0;$i<8;)echo abs($_GET[n][$i++]-$_GET[n][$i++]%10);
получить доступ к браузеру, используяfile.php?n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y&n[]=x&n[]=y
длину 61 байт.$_GET['n']
. Отредактировал мой ответ.<? for($i=0,$a=$_GET[n];$i<8;)echo abs($a[$i++]-$a[$i++]);
. Это%10
бесполезно, и этот просто выглядит лучше. Кроме того, вы можете получить к нему доступ, используяfile.php?n[]=xyxyxyxy
. Это решение имеет длину 58 байт.Python 3, 60
Ввод и вывод точно так, как указано, хотя он не печатает завершающий перевод строки. Здесь есть два интересных трюка: 1) замена двух вызовов на
int()
один вызовeval()
, и 2) использованиеjoin()
для полученияa-b
, а затем отрицание его приb-a
необходимости. К счастью, оператор Python по модулю дает положительные значения, даже если первый аргумент отрицательный!источник
eval('-'.join(x))
трюк блестящий.)