Руководящие указания
задача
Напишите метод, который принимает массив последовательных (увеличивающихся) букв в качестве входных данных и возвращает отсутствующую букву в массиве (списки на некоторых языках).
правила
- Это код гольф, поэтому выигрывает самый короткий ответ в байтах!
- Вы всегда получите правильный массив
- Всегда будет отсутствовать ровно одна буква
- Длина массива всегда будет не менее 2.
- Массив всегда будет содержать буквы только в одном регистре (в верхнем или нижнем регистре)
- Вы должны вывести в том же регистре (в верхнем или нижнем регистре), что ввод
- Массив всегда будет идти только одна буква за раз (пропуская пропущенную букву)
- Длина массива будет между 2 и 25
- Первый или последний элемент массива никогда не будет отсутствовать
Примеры
['a','b','c','d','f'] -> 'e'
['O','Q','R','S'] -> 'P'
['x','z'] -> 'y'
['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','w','x','y','z'] -> 'v'
code-golf
array-manipulation
alphabet
Amorris
источник
источник
['a','b','c','d','f','g']
, вывода['e']
, если это делает код короче?Ответы:
Pyth , 5 байт
Попробуйте онлайн!
источник
C # (.NET Core) ,
48 4746 байтов, ввод в виде массива символовПопробуйте онлайн!
Объяснение: увеличивается первый элемент в массиве, а также указатель, повторяющий следующие элементы. Когда и первый элемент, и текущий элемент различаются, он возвращает первый элемент.
C # (.NET Core) ,
58 5650 байт, ввод в виде строкиПопробуйте онлайн!
Предыдущее 58-байтовое решение (упомянутое в первом комментарии):
Алгоритмы с использованием System.Linq
Следующие алгоритмы должны добавить
using System.Linq;
(18 байт) к числу байтов и, следовательно, длиннее.Мне очень понравился этот (52 + 18 байт):
И у вас также есть однострочное (45 + 18) -байтное решение:
И очень умное (37 + 18) -байтовое решение, любезно предоставленное Ed'ka:
источник
s[i]-s[0]
, довольно умно!for
цикл не имеет условия остановки, поэтому он будет повторяться до тех пор, покаif
условие не будет выполненоtrue
.a=>{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}
(когда вы принимаете ввод какchar[]
). Не благодаря мне, кстати, благодаря комментарию @Nevay к моему ответу на Java 8 .s=>s.Select(e=>++e).Except(s).First()
Алиса , 10 байт
Попробуйте онлайн!
объяснение
Это просто структура для линейных программ, которые работают полностью в обычном режиме (обработка строк):
Фактический линейный код тогда:
Который делает:
источник
Haskell ,
3330 байтПопробуйте онлайн!
источник
until
сохраняет байт:f(a:b)=until(`notElem`a:b)succ a
Рубин, 21 персонаж
Возвращает массив из одного элемента в соответствии с комментарием владельца вопроса .
Образец прогона:
Попробуйте онлайн!
источник
Java 8,
7057564846 байт-14 (70 → 56) и -2 (48 → 46) байтов благодаря @CarlosAlejo .
-8 (56 → 48) байтов благодаря @Nevay .
Объяснение:
Попробуй это здесь.
источник
a->{int i=0;for(;a[++i]-a[0]<=i;);return--a[i];}
.C (gcc) , 33
35364860байтовВсе оптимизации должны быть отключены и только на 32-битном GCC.
Принять ввод как строку.
Попробуйте онлайн!
источник
foo(char*a){return*a+1==a[1]?foo(a+1):++*a;}
, очень хорошо; Только на 1 символ короче, чем более естественныйfoo(char*a){while(*a+1==a[1])a++;return++*a;}
Python 3 ,
7462584440 байт-12 байтов благодаря Эрику Аутгольферу. -18 байт благодаря Лики Нун. -4 байта благодаря musicman523.
Принимает ввод как строку байта.
Попробуйте онлайн!
Еще одно крутое решение:
источник
.difference({*s})
->-{*s}
Mathematica, 46 байт
источник
Min@Complement[CharacterRange@@#[[{1,-1}]],#]&
это спасло бы байт.JavaScript (ES6), 70 байт
Ввод в виде массива символов
Меньше гольфа
Тест
источник
PHP> = 7.1, 46 байт
Принять ввод как строку
PHP Sandbox Online
источник
Сетчатка ,
3325 байтПопробуйте онлайн! Работает с любым диапазоном символов ASCII. Изменить: Сохранено 8 байт благодаря @MartinEnder. Объяснение: Первый этап дублирует ввод. Вторая уменьшает все символы в копии на 1 кодовую точку. На третьем этапе удаляются все символы в копии, которые все еще появляются в оригинале. Это просто оставляет исходный ввод, символ, который предшествует первому символу исходного ввода и пропущенный символ. Последняя стадия просто соответствует отсутствующему символу.
источник
SWI Пролог, 124 байта
Примеры:
Маленькое объяснение:
Это
m
основная процедура, котораяn
производит следующий ожидаемый символ в списке.c
Делает сравнение - если ожидания соответствуют следующему пункту, продолжайте, иначе распечатать ожидаемый характер и выпрыгнуть из окна.источник
fail
:0=1
.C ++ 14, стандартная библиотека, универсальный тип контейнера (
8786 байт)::std
Предполагается тип контейнера из пространства имен (напримерstd::string
,std::list
илиstd::vector
. В противном случаеusing namespace std;
или аналогичным образом предполагается).Видеть это Live On Coliru
C ++ 14 без стандартной библиотеки (все еще универсальный,
6463 байта)Опять же, нужно помочь поиску имени, только если тип контейнера не из пространства имен
::std
(или связан с ним)Live On Coliruдля ,
std::string
например ,Live On Coliruдля ,
char const[]
например ,источник
Древесный уголь , 18 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Принимает ввод в виде строки. Работает с любой почти непрерывной последовательностью символов ASCII.
источник
C #, 104 байта
Полная / Отформатированная версия:
источник
s=>s.Select(e=>++e).Except(s).First()
MATL,
87 байт1 байт сохранен благодаря @Luis
Попробуйте это на MATL Online
объяснение
источник
Excel, 110 + 2 = 112 байт
Должен быть введен как формула массива ( Ctrl+ Shift+ Enter), которая добавляет фигурные скобки
{ }
на каждом конце, добавляя два байта. Ввод в виде строкиA1
, которая в порядке для каждого OP .Это далеко не самый короткий ответ (Excel редко бывает), но мне нравится смотреть, можно ли это сделать.
источник
Rexx (Regina) , 56 байт
Попробуйте онлайн!
Наконец, тот, который позволяет REXX использовать свои сильные манипуляции со строками.
источник
CJam , 6 байт (полная программа) / 7 байт (блок кода)
Попробуйте онлайн!
Это полная программа CJam, которая считывает входную строку из стандартного ввода и печатает пропущенную букву в стандартный вывод. CJam на самом деле не имеет «методов», что и требует задача, но, вероятно, самым близким будет блок исполняемого кода, например так:
Попробуйте онлайн!
Этот блок кода, при оценке, принимает входные данные в виде строки (то есть массива символов) в стеке и возвращает недостающий символ также в стеке.
Объяснение: В полной программе
q
читает входную строку и помещает ее в стек.)
затем выскакивает последний символ входной строки, и оператор диапазона,
превращает его в массив, содержащий все символы с кодовыми точками под ним (включая все буквы перед ним в алфавите). Таким образом, например, если ввод былcdfgh
, то после),
стека будут содержаться строкиcdfg
(т.е. ввод с последней удаленной буквой) и...abcdefg
, где...
обозначает набор символов с кодами ASCII нижеa
(т.е. все символы ниже последнего удаленного ввода письмо).Затем оператор симметричной разности множеств
^
объединяет эти строки в одну строку, которая содержит именно те символы, которые появляются в одной из строк, но не в обеих. Он сохраняет порядок, в котором символы появляются в строках, так что для примера вводаcdfg
результат после),^
будет...abe
, где...
снова обозначает группу символов с кодами ASCII нижеa
. Наконец,W=
просто извлекаем последний символ этой строки, который является именно отсутствующим символом,e
который мы хотели найти (и отбрасывает остальные). Когда программа заканчивается, интерпретатор CJam неявно распечатывает содержимое стека.Бонус: GolfScript , 6 байт (полная программа)
Попробуйте онлайн!
Оказывается, почти тот же код работает и в GolfScript. Мы сохраняем один байт в полной версии программы из-за неявного ввода GolfScript, но теряем один байт, потому что, в отличие от CJam
W
, в GolfScript нет удобной однобуквенной переменной, инициализированной -1.Кроме того, CJam имеет отдельные целочисленные и символьные типы (а строки - это просто массивы, содержащие символы), тогда как GolfScript имеет только один целочисленный тип (и имеет специальный строковый тип, который ведет себя несколько иначе, чем обычные массивы). Результатом всего этого является то, что, если мы хотим, чтобы интерпретатор GolfScript распечатывал фактическую пропущенную букву вместо ее кодового номера ASCII, нам нужно возвращать односимвольную строку вместо только самого символа. К счастью, внесение этого изменения просто требует замены оператора индексации на оператор
=
усечения массива / строки слева>
.Конечно, благодаря неявному вводу-выводу GolfScript, приведенный выше код также можно использовать как фрагмент, который читает строку из стека и возвращает односимвольную строку, содержащую пропущенную букву. Или, скорее, любой фрагмент, который принимает одну строку в стеке в качестве аргумента и возвращает свой вывод в виде строки для печати в стеке, также является полной программой на языке GolfScript.
источник
q
(программа) или{...}
(блок). +1 для подхода, хотяШелуха , 6 байт
Попробуйте онлайн!
Эта функция принимает строку (список символов) в качестве входных данных и возвращает символ в качестве выходных данных.
объяснение
источник
Python 2 - 76 байт
Проигрывает с существующим решением Python 2, но это немного другой подход, так что я все равно решил опубликовать его:
источник
8-е , 99 байтов
обоснование
Если расстояние между буквами больше двух, значит, пропущена буква. Буквенное расстояние получается путем вычисления разницы между кодом ASCII каждой буквы.
Код
Неуправляемая версия
Использование и примеры
источник
JavaScript (ES6), 64 байта
Принимает ввод в виде строки.
Как?
Инициализация: мы начинаем с n = 0 и p = 0 и вызываем рекурсивную функцию g () .
Шаг # 1: Мы увеличиваем n до тех пор, пока не
c = String.fromCharCode(n)
будет равен первому символу входной строки s [0] .Шаг № 2: Теперь, когда мы синхронизированы, мы одновременно увеличиваем n и p до тех пор, пока
c = String.fromCharCode(n)
больше не будем равны s [p] .Шаг № 3: Мы возвращаем c : ожидаемый символ, который не был найден.
Контрольные примеры
Показать фрагмент кода
источник
J, 20 байт
a.e.
логическая маска для ввода букв в кодировке ascii1 0 1&E.
новая логическая маска, указывающая, является ли последовательность101
начинается с этого индекса, т. е. найти любое место, где начинается последовательность «пропуска»I.
индекс этого совпадения, то есть символ перед пропущенным>:
увеличение на 1, т. е. индекс пропущенного символа в ascii charset{&a.
выберите этот индекс из набора символов ascii, т.е. верните пропущенный символПопробуйте онлайн!
источник
ES6, 125 байт:
http://jsbin.com/vasoqidawe/edit?console
Возвращаемая функция должна вызываться с массивом
можно сохранить еще 9 байтов, удалив .join ("") и передав строку:
ES6, 108 байт:
http://jsbin.com/tudiribiye/edit?console
источник
a.join("")
может бытьa.join``
Common Lisp, 88 байт
Попробуйте онлайн!
источник
Python 2 , 69 байт
Попробуйте онлайн!
Некоторые объяснения Поскольку мы знаем первый и последний элементы списка, мы можем легко вычислить сумму кодов всех символов в
list + the missed char
(используя суммарные формулы арифметической прогрессии ). Разница между этой суммой и суммой кодов всех символов в выраженияхlist
дает код пропущенной буквы.источник
05AB1E ,
97 байтПопробуйте онлайн!
источник
2
что мы используем тот же алгоритм, хотя я едва знаю 05AB1E :)APL (Dyalog) , 17 байт
Попробуйте онлайн!
⎕AV∘∊
Boolean: каждый символ в элементе A tomic V ector (набор символов) аргумента?(
…)
Применить следующую молчаливую функцию:⊃
первый элемент⎕AV
Tomic V Эктор (набор символов)/⍨
который∨\
следует за начальным (член аргумента)∧
но~
нет (участник аргумента)источник