Элемент строки по указанному индексу

13

Если строка sи неотрицательное число nменьше длины s, выведите символ в n-ой позиции s.

0-индексация и 1-индексация разрешены. Для 1-индексации nбудет положительным и меньше или равно длине s.

s будет состоять только из печатных символов.

Любой разумный ввод / вывод разрешен. Применяются стандартные лазейки .

Тестовые случаи (0-индексация):

n s        output
0 "abcde"  a
1 "abcde"  b
2 "a != b" !
3 "+-*/"   /
4 "314159" 5

Тестовые случаи (1-индексация):

n s        output
1 "abcde"  a
2 "abcde"  b
3 "a != b" !
4 "+-*/"   /
5 "314159" 5

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

Дрянная Монахиня
источник
13
Я понизил это, потому что это не проблема программирования или игры в гольф; все, что по существу здесь задают, это какой язык имеет самый короткий встроенный для работы.
Лохматый
15
@Shaggy То же самое для многих других простых задач, таких как добавление двух чисел, проверка, является ли число простым, или вывод «Hello, World!». Хотя они скучны во многих языках, которые могут делать их «из коробки», они могут быть интересными проблемами для более примитивных языков, которым приходится реализовывать свою собственную реализацию. Кроме того, что-либо более сложное, как правило, слишком много, чтобы спрашивать об этих языках, поэтому хорошо иметь выход для них. Если тривиальные проблемы утомляют вас, попробуйте выполнить их на нетривиальном языке.
Мартин Эндер

Ответы:

9

MATL , 1 байт

)

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

Ну, трудно сделать это намного проще. )индексирует первый вход, используя второе входное значение. Это 1-индексированный.

Стьюи Гриффин
источник
7

Алиса , 5 байт

I&IO@

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

Как обычно, это намного короче, если мы избегаем обычного режима и используем ужасный формат ввода. Здесь первый кодовая точка символа используется в качестве целочисленного ввода . Остальная часть ввода - строка. Индекс основан на 1.

объяснение

I   Read a character and push its code point.
&I  Read that many more characters and push them.
O   Output the last one we read.
@   Terminate the program.
Мартин Эндер
источник
abysmal- Я думал, что ты сделал это xD
Стивен
@StephenS Вы имеете в виду, что я предложил этот формат ввода / вывода на мета? Да, я сделал, но в основном для языков, которые должны были бы реализовывать свой собственный синтаксический анализатор / рендеринг десятичных чисел каждый раз, когда они конкурируют в соревновании с числовым вводом / выводом, так что они, вероятно, просто пропустили бы их полностью. Но у этого есть неприятный побочный эффект: в некоторых языках, которые могут довольно легко читать и писать десятичные дроби, все же короче использовать вместо них кодовые точки.
Мартин Эндер
6

Python, 15 байт

str.__getitem__

или

lambda s,i:s[i]

Оба принимают 2 аргумента: строку и индекс. 0 индексированные.

Artyer
источник
Я удивлен, что оба метода имеют одинаковую длину.
Утренняя монахиня
6

Haskell, 4 байта

(!!)

Индексирование на основе 0. Пример использования: (!!) "Hello" 1-> 'e'.

Ними
источник
5

Октава, 10 байт

@(s,n)s(n)

Принимает строку sи число в nкачестве входных данных и возвращает nсимвол th s.

Стьюи Гриффин
источник
5

Сетчатка , 28 20 19 байт

Благодаря @MartinEnder удалось сэкономить 8 байт благодаря отсутствию балансировочных групп.

Сохранено 1 байт благодаря @ mbomb007 с использованием ^.+вместо^\d+

^.+
$*
+`1¶.
¶
!1`.

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

Программа 0 проиндексирована.

user41805
источник
Изменить, \dчтобы .сохранить байт.
mbomb007
@ mbomb007 Спасибо за совет :)
user41805
3

Алиса , 10 байт

/@!O?]&
 I

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

Ожидается строка в первой строке и индекс на основе 0 во второй строке.

объяснение

Несмотря на богатство встроенных функций, в Алисе нет индексации строк. Причина в том, что для этого требуются как целое число, так и строковый параметр, и все команды в Алисе являются строго целыми числами в целые числа или строками в строки.

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

/    Reflect to SE. Switch to Ordinal. While in Ordinal mode, the IP bounces
     diagonally up and down through the program.
I    Read one line from STDIN and push it.
!    Store the string on the tape. This writes the character codes into consecutive
     tape cells starting at the tape head. (It also writes a -1 at the end as a
     terminator, but the tape is initialised to -1s anyway).

     The next few commands are junk that luckily doesn't affect the program:

?      Load the string from the tape and push it to the stack again.
&      Fold the next command over this string. That is, for each character
       in the string, push that character, then execute the command.
?      So we're folding "load" over the string itself. So if the string is "abc"
       we'll end up with "a" "abc" "b" "abc" "c" "abc" on the stack.
!      Store the top copy of "abc" on the tape (does nothing, because it's
       already there).

     Now the relevant part of the program continues.

I    Read another line from STDIN, i.e. the string representation of the index.
/    Reflect to W. Switch to Cardinal. The IP wraps to the last column.
&    Implicitly convert the string to the integer value it represents and
     repeat the next command that many times.
]    Move the tape head right that many cells. Note that Ordinal and Cardinal
     mode have separate tape heads, but they are initialised to the same cell.
?    Load the value from that cell, which is the code point of the character
     at the given index.
O    Print the corresponding character.
!    This discards or converts some of the strings on the stack and writes some
     value back to the tape, but it's irrelevant.
@    Terminate the program.
Мартин Эндер
источник
1
«Несмотря на богатство встроенных функций, в Алисе нет индексации строк». > _>
Дрянная Монахиня
1
@LeakyNun Если вы думаете, что это плохо, то нет встроенного средства для определения длины строки. ;)
Мартин Эндер
3

Брахилог , 2 байта

∋₎

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

объяснение

объединяет свой вывод с элементом Input. С индексом as, он объединит свои выходные данные с Iэлементом th S, со [S,I]входными данными.

Fatalize
источник
3

Cubix , 8 байт

t@poIA//

Это решение 1-проиндексировано. Сначала ввод должен состоять из числа, затем разделителя (который не является цифрой или а .), а затем строки.

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

Люк
источник
2

SILOS , 43 байта

loadLine
readIO
a=256+i
a=get a
printChar a

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

Достаточно просто.

Рохан Джунджхунвала
источник
SILOS возвращается \ o /
Leaky Nun
1
Да, я пытаюсь ответить на как можно больше звонков, включая экран загрузки Windows. Мне нравится суть в том, что касается графического вывода и библиотек, но я все же хотел бы разработать схему сжатия, чтобы попытаться сделать ее конкурентоспособной. По сути, int [], в который он компилируется, может быть сгенерирован посредством чтения потока байтов. @LeakyNun
Rohan Jhunjhunwala
2

BF , 9 байт

,[->,<]>.

Индекс берется через символьный код символа (например, представление Алисы). После этого у нас есть строка.

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

Ссылка TIO использует оболочку Bash, и входные данные могут быть изменены в заголовочном файле (причина для оболочки заключается в том, чтобы мы могли видеть байты).

user41805
источник
Leaky Nun
@LeakyNun Я использовал обертку для BF .
user41805
1
Я сказал, что это законно.
Утренняя монахиня
Есть ли способ сделать ввод для других языков TIO, как это? Нравится SMBF?
mbomb007
@ mbomb007 Вы должны быть в состоянии сделать это для других языков, используя их оболочки. Вот обертка для SMBF
user41805
2

JavaScript, 11 10 байт

s=>n=>s[n]

Использует индексирование на основе 0.

-1 байт благодаря @Leaky Nun

f=
s=>n=>s[n]
console.log(f("abcde")(0));
console.log(f("abcde")(1));
console.log(f("a != b")(2));
console.log(f("+-*/")(3));
console.log(f("314159")(4));

Стивен
источник
1
Вы можете использовать карри s=>i=>s[i]для сохранения байта
Leaky Nun
1
Каждый раз, когда я вижу подобные ответы, это раздражает, потому что я знаю, что версия C # всегда на один байт длиннее точки с запятой в конце. И это действительно так
TheLethalCoder
2

> <> , 13 + 1 = 14 байтов

+1 для -vфлага, чтобы принять ввод

:?!\i~1-
io;\

Спасибо @steenbergh за уведомление о-v флаге и сэкономили мне 3 байта!

Введите индекс с аргументом командной строки -v [index] (0-indexed) и введите строку через stdin.

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

объяснение

Стек начинается с индекса сверху.
:дублирует это.
?игнорирует следующий символ, если индекс равен 0. (выталкивает его из стека)
Если он равен нулю, \отражает направление спуска. Затем это отражается справа со следующим \. Он оборачивается и выполняет input символ, output его и ;останавливает выполнение.
Если нет, !пропустите следующую инструкцию, чтобы она не пошла вниз.
i~вводит символ, а затем сразу же отбрасывает его.
1толкает 1.
-вычитает 1из индекса, поэтому один символ на входе потребляется, и индекс уменьшается. Программа возвращается к :.

Artyer
источник
1
Существует параметр -v <x>командной строки, который инициализирует стек для хранения <x>при запуске программы. Попробуйте онлайн
steenbergh
2

Морковь , 16 байтов

$^//.{#}/S1//.$/

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

Формат ввода таков:

string
index

И программа 1-х проиндексирована.

объяснение

Carrot имеет несколько глобальных переменных, по одной для каждого типа: string, float и array (другие будут реализованы в ближайшее время). Программа запускается в строковом режиме, где все операторы влияют на глобальную строковую переменную. И я называю эти переменные «стеком».

(Пример входных данных: abcdef\n3)

$                          Get the first line of the input and set the stack-string to this value
^                          Exit caret-mode
                           stack-string = "abcdef"
/                          Operator (behaves differently depending on the argument)
 /.{#}/                     And the argument to this operator is a regex, so this program gets the matches of this regex into the stack-array
  .                          Any character
   {#}                       Pops a line from the input. So now this evaluates to # of any character where # is the second line of the input (in this case, 3)
                           stack-array = ["abc"]
                           And now we just need to get the last character in this string, but first
S1                         Join the array on the number 1 and set this to the stack-string. Because the array only contains one element, the number 1 does not appear in the stack-string.
                           stack-string = "abc"
/                          Operator; because the argument is a regex, this retrieves the matches of the regex:
 /.$/                       Get the last character in the string
                           stack-array = ["c"]

Теперь это возвращает массив из одного элемента, содержащий строку длины один, но он отображается в виде строки на веб-сайте.

Если бы мы действительно хотели дать результат в виде строки, мы могли бы легко сделать это S","в конце, но это не имеет значения, потому что выходные данные на интерпретаторе все равно выглядят одинаково.

user41805
источник
1

Пакетная, 32 байта

@set/ps=
@call echo(%%s:~%1,1%%

Читает sиз STDIN и принимает nв качестве параметра командной строки.

Нил
источник
1

GolfScript , 7 4 байта

~1/=

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

Я впитываю GolfScript, поэтому ценю помощь Мартина Эндера .

Эрик Outgolfer
источник
Там нет необходимости для [.
Мартин Эндер
Но в целом, если вам нужны символы из строк, вы просто сначала разбиваете строку, а не конвертируете кодовую точку обратно:~1/=
Мартин Эндер
@MartinEnder И вот как ты избил Алису ...
Эрик Outgolfer
1

Turtlèd , 9 байт

!?:[*l+].

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

объяснение:

Прежде всего, Turtlèd основан на сетке, с вещами черепахи. Существуют ячейки сетки, которые черепаха может перемещать влево, вверх, вниз и вправо, и может что-то записывать в ячейки сетки.

[the first grid cell the turtle starts on is marked with a *]
!         input the string into the string variable

 ?        input the number into the number variable

  :       this command takes the number variable and moves right that many.
          hence this moves right by the amount inputted

   [*  ]  this is an `until` loop. the * there means that `until` the turtle ends the loop
          on a grid cell with * written on it (that is, the first cell), it will execute
          the code inside again and again

     l+   the code inside the while loop. the `l` moves the turtle left, and the +
          increments the string pointer. the string pointer is used with the string var;
          when you want to write something from the string, you use `.`, which writes
          the pointed char. the pointed char is the n-th character of the string, n being
          the value of the string pointer. this code will execute until the l moves
          the turtle back on to the origin cell. since we moved right by the number
          inputted, this will increase the string pointer (which starts at 1)
          by the amount inputted.

       .  write the pointed char, which was dealt with in the previous comment.
          if 0 is inputted, turtle stayed on the origin square, and executed none
          of the loop, and turtle writes the first char of string input.
          if 1 is inputted, turtle moved one right, moved one left and incremented
          string pointer once, which means the second char is written. and so on.


          [the char of input has been written over the origin square]
          [implicitly the grid is outputted, which has spaces and blank lines taken out]
          [this is the requested char outputted, plus an unavoidable trailing newline
          due to how I made the interpreter. sue me]
Разрушаемый Лимон
источник
1

Clojure, 3

nth

: P Что можно сделать, когда для этого есть встроенный ? Это работает со списками, векторами, строками и последовательностями. Это либо O (1), либо O (n), в зависимости от используемого типа данных.

NikoNyrh
источник
1

Dyvil , 4 байта

_[_]

Создает анонимную функцию, которая принимает Stringи intвозвращает и возвращаетchar .

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

let f: (String, int) -> char = _[_]
print f("abc", 1) // b
Clashsoft
источник
1

QBasic 4.5, 24 байта

INPUT a$,b:?MID$(a$,b,1)

Довольно просто.

steenbergh
источник
1

Mathematica, 18 байт

#~StringTake~{#2}&

Базовое решение, но, к сожалению, имя функции довольно длинное.

numbermaniac
источник