Еще один блестящий вопрос от Stack Overflow превратился в вызов кода-гольфа !
Напишите программу, которая:
- Принимает строку в качестве пользовательского ввода (не передается по каналу или аргумент командной строки). Тип данных ввода должен быть строкой, если язык автоматически выявляется при вводе, он должен быть приведен к строке.
- Находит индекс (на основе 0 или 1) первой младшей четной цифры .
- Печатает 2 целых числа , индекс и младшую четную цифру .
- Если четной цифры нет , верните -1 в качестве индекса, второе число может быть любым.
- Для целей этого ноль не является четным .
Тестовые примеры, учитывая строку слева, выводят значения справа:
25376 --> 0,2
523726 --> 1,2
583746 --> 4,4
53771 --> -1,0
_4___2 --> 5,2
Победитель: это программа с наименьшим количеством символов. Нет бонусов, нет штрафов.
edit: (о stdin) Я облажался с пользовательской вводной частью, в основном нет данных о трубопроводе и аргументов командной строки. Вы должны предоставить пользователю какую-либо подсказку в самой программе.
Ответы:
Golfscript, 26 (28) символов
Пример:
живой тест: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D
Объяснение:
'#{gets}'
является побегом к ruby для удовлетворения требований ввода / вывода; STDIN предполагается пустым.
клонирует вход'246'&8+
находит, какие четные цифры присутствуют во входных данных, за исключением того,8
что всегда сохраняется$1<
сортирует список, затем берет первую цифру, но сохраняет ее как строку.@\?
упорядочивает стек {цифра, ввод, цифра}, затем находит цифру на входе; спасибо @peterTaylor за то, что заметил меня подпись [array, array]?
.На этот раз я был очень смел с интерпретацией спецификаций; а именно:
:x?x
для исправления (мне не нравятся временные переменные.n@
(который также выполняет обмен),n\
(который не выполняет) или]`
(который форматирует вывод как["8" -1]
).источник
.0=@?
с.@\?
или:x?x
сохранить один символ и избежать сомнений по поводу заказа. Хорошее использование8
как запасной вариант.APL (37)
(По умолчанию 1, но подчиняется
⎕IO
)Объяснение:
⍞
: читать ввод пользователяm←⍵/⍨⍵∊'2468'
: удалить все символы, которые нет2468
, сохранить вm
.×⍴m
: посмотреть, есть ли:
: Если так:z←⌊/⍎¨m
: оцените каждый символ вm
, найдите наименьшее число и сохраните вz
.z,⍨⍵⍳⍕z
: вернуть индексz
в⍵
, а затемz
.⋄
: Если не:¯1,0
: возвращение(-1, 0)
источник
Python 3, 69
объединяя идеи отсюда .
источник
Рубин, 60 знаков
$_
содержит последний вход прочитанgets
.p
вызываетinspect
аргументы и печатает результаты.источник
Perl - -
94- 53 символов (или 48)Вместо
index()
подхода, основанного на нуле, мы используемpos
и начинаем с одного; нет CPAN. Запустите его,perl -nE
и он будет ждать ввода (который он также может получитьSTDIN
).Первая
//
операция match ( ) работает со значением по умолчанию ($_
) из входных данных, сравнивая с заданными четными числами,sort
помещая совпадения в массив, а затем сохраняя их в «скалярном списке»($m)
. В скалярном контексте значение списка отсортированного массива составляет один элемент в длину и, следовательно, состоит из самой младшей четной цифры в числе.Выделив младшую четную совпадающую цифру, мы затем используем
$m
вторую операцию сопоставления, которая найдет первое вхождение значения$m
в исходной строке. Мы все еще используем здесь значение по умолчанию$_
и сохраняем совпадение с содержимым$m
in$1
(причина()
обхода$m
во втором выражении). После этогоpos
иsay
сделайте все остальное (и в меньшем количестве символов, чемindex
иprint
).Если порядок вывода или запятые не имеют значения, можно сократить эти 5 символов:
В моей предыдущей попытке я бросился и сделал ошибку - я просто хотел победить python и ruby (но не смог) ... вздох.
Поздравляю победителя и других участников за их крутые решения - особенно
perl6
:-) Возможная адаптация этого подхода в Perl6 может быть использована ".comb
(предложено на freenode Масаком и др. ).источник
$SHELL
истории для «победы». Эта рабочая версия до смешного длинна и смущает. Служит мне правильно: буду сокращать позже, чтобы избежать позора :-(if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"
(47 + 1 байт, AFAIK-n
стоит дополнительный байт).pos
возвращает смещение. Таким образом, в вашем примере он возвращает индекс на основе 1.perl
«s-M
бы выиграть каждый раз ;-)Perl 6,
375560 символовРЕДАКТИРОВАТЬ: я неправильно понял вопрос в первый раз. Это обновление должно быть правильным. Он находит наименьшее число 2,4,6 или 8, которое содержит входные данные, и затем сопоставляет регулярные выражения с входными данными с этим наименьшим числом.
$/.from
получает позицию совпадения и',', $/.Int
является запятой плюс само совпадение, или 0, если текст не совпадает.Пока вы здесь, отправляйтесь в голосование против Г. Сито , который помог мне исправить мою запись в комментариях и на irc :)
источник
$/.from
когда ничего не найдено (это может быть ошибка в моей старой версии Rakudo). Вот вариант вашего решения, которое работает ( для меня!)my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0";
Приходит на 75 символов, но я уверен, что может быть найдено более короткое решениеmy $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
. Я узнал около.comb
20 минут назад, и мне это уже нравится :-)J, 44 знака
выводит последний символ ввода, если четная цифра не найдена
Пример:
Объяснение:
echo ... i=.1!:1]1
это вход / выход. Намного дольше, чем я хочу. Вклад также спрятанi
.'2468'i.~
находит первое вхождение каждой четной цифры на входе, возвращая длину ввода, если цифра не может быть найдена(#~(#i)&>)
гласит «выберите по длине ввода больше, чем это»; другими словами, выберите те индексы, которые указывают на вход. Намного дольше, чем я хочу._1,~
добавляет -1 к спине. Подчеркивание - это способ представления отрицательных значений J.{.
выбирает первый элемент(;{&i)
объединяет его с символом ввода в этой позиции в двух полях; так как мы объединяем число с символом, небоксирующая конкатенация (,
) не подходит. Если требуется отображение без коробки, индекс необходимо":
сначала отформатировать ( ) по цене двух символов.источник
Python 2.7 - 76
Ссылочный ответ, который я полностью ожидаю, будет побежден. Но, чтобы начать людей:
источник
index
наfind
; Вы также можете изменить[2,4,6,8]
на2,4,6,8
(с пробелом впереди).print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
print[(s.index(c),c)for c in'2468'if c in s][0]or(-1,0)
R, 104
Примеры (в R индекс начинается с 1):
источник
Powershell,
767371$s=read-host
сохраняет пользовательский ввод в$s
2,4,6,8|%{...}
запускает то, что внутри,{}
для цифр 2,4,6 и 8$i=$s.indexof("$_")+1
устанавливает$i
на 1 основанный индекс цифры в$s
или0
если цифра не найденаif( $i=... ){...}
условие будет истинным, когда$i
нет0
"$i,$_";break
выводит индекс и цифру и останавливает выполнение"-1,0"
иначе выводит-1,0
источник
$s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
2,4,6,8
не нужны.if(1+($i=$s.indexof("$_")))
C ++ 11, 173 (включая два символа новой строки)
Вот сжатая версия:
Вот читаемая версия:
Вот старая версия:
C ++ 11, 175 (включая два символа новой строки)
Вот сжатая версия:
Вот читаемая версия:
источник
#define o std::cout<<
. Я думаю, что это урезает ваш код на 1 символ.k==c?std::cout<<(...),throw 0:0;
- условный оператор может заменитьif
, когда все, что вам нужно, это выражения.throw
это выражение, а также один символ корочеreturn
.C, 80 символов
источник
C # - 124
Я немного опоздал на вечеринку
источник
Хаскель, 79 персонажей
Это работает немного быстро и свободно с форматированием вывода:
источник
PowerShell:
145103Код:
Прохождение:
"
..."
Все в кавычках будет включено в вывод.$(
...)
Все, что находится в скобках, будет рассматриваться как команды, и вывод этого кода будет включен вместо самих команд.[array]::IndexOf(
...)
Это используется для получения индекса элемента с массивом. Его первый параметр - это объект массива для поиска. Второй параметр - это объект, который нужно найти. Это только выводит индекс первого соответствующего элемента. Я попытался просто использоватьIndexOf
метод непосредственно против$s
(например,:$s.IndexOf($x)
, но по какой-то причине мне это не удалось выяснить - он утверждает, что метод не существует для этого объекта.(
...)
Выражение в скобках будет первым параметром дляIndexOf
.$s=
$ s будет переменной для хранения ввода пользователя.(read-host)-split''
Получает пользовательский ввод и разбивает его на массив символов.|?{$_}
Отфильтровывает лишние пустые элементы массива, сгенерированные-split''
.,(
...)
Выражение в скобках будет вторым параметром дляIndexOf
.$x=
$ s будет переменной для хранения младшей четной цифры из пользовательского ввода.$s|?{$_%2-eq0}
Вытаскивает четные числа из $ s.|?{$_-gt0}
Обнуляет ноль.|sort
Сортирует оставшиеся объекты, порядок по умолчанию возрастает.|select -f 1
Выбирает первый объект, который теперь будет самой низкой четной цифрой.,$x
Приведенный выше код выведет индекс нашей младшей четной цифры. Это добавляет запятую, а затем выводит саму цифру.Примечания:
Это, возможно, немного растягивает правило № 4. Если четной цифры нет, на выходе не будет второго числа.
Кроме того, это приведет к возникновению некоторых не прекращающихся ошибок, если входные данные содержат нечисловые элементы. Сценарий все еще будет запускаться и давать правильный вывод, но вы можете установить
$ErrorActionPreference
его'SilentlyContinue'
перед запуском.источник
$s.IndexOf
здесь? Это давало мне ошибку, говоря, что метод не существует для этого объекта, хотя и$s|gm
сказал, что он существует. Он работает в той системе, в которой я сейчас работаю, но не той, в которой я пытался сделать это ранее сегодня. Это проблема совместимости версий? Ранее система была PSv2, текущая - PSv4.$s
естьstring[]
, и$s.indexof
не работает, потому что...[System.String[]] doesn't contain a method named 'indexOf'
, что кажется разумным (я использую PS 2.0).$s|gm
возвращает членовSystem.String
, а неSystem.String[]
. Я не уверен, почему это так.vb.net (108c)
Немного пахнет, потому что он использует динамические настройки VB. Опция Явное отключение и импорт System.Console .
источник
VB.net (193c) с использованием LINQ
Этот в первую очередь использует запрос LINQ.
источник
Golf-Basic 84, 91 символов
0
на входе (это не четное, кто сказал, что это должно быть нечетным?)источник
Bourne shell (sh), 88 символов
Я думал, что сделаю что-нибудь для обработки строк ради развлечения. Технически он читает из stdin, но если вы запустите его в интерактивном режиме, он запросит ввод данных, поскольку клавиатура является потоком stdin по умолчанию. Использует базовые команды оболочки, чтобы разделить ввод по строкам, пронумеровать их (используя малоизвестную
nl
утилиту), отфильтровать строки, соответствующие критериям, отсортировать их и вывести младшую цифру. Печатает,88 -1
если четная цифра не найдена.источник
С ++ - 223
221Персонажи:Читаемая версия:
Это долго, но не так плохо, как Java.
источник
Javascript 93 символа
Получить все номера событий, отсортировать массив и распечатать первую цифру.
источник
Mathematica, 157 знаков
источник
Юлия, 84
Джулии действительно нужен более короткий способ получить информацию для игры в гольф. Я посчитал определение
f
и один звонокf
. Индексирование, основанное на одном, объясняет, почему ответы отличаются от примеров.источник
JavaScript - 53 символа
Считывает ввод из приглашения и выводит (в консоль) младший четный символ, а затем (без разделителя) первый индекс этого символа; если нет ненулевых четных символов, то выводится
8-1
.источник
C, 110 символов
ungolfed:
источник
Javascript, 69
Считывает значение, перебирает каждый символ, если числовое представление mod 2 равно 0, а число меньше того, что уже сохранено
b
, замените значения вb
источник
Реболь, 69
источник
Ruby 55
источник
JavaScript / JQuery 149
Golfed
Полный источник
источник