Елемент рядка за вказаним індексом


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 Те ж саме для багатьох інших простих проблем, як додавання двох чисел, перевірка того, чи є число простим чи друк "Привіт, світ!". Хоча вони нудні на багатьох мовах, які можуть зробити їх поза рамками, вони можуть бути цікавими проблемами для більш примітивних мов, яким доводиться виконувати власну реалізацію. Плюс до всього, що складніше, як правило, занадто багато, щоб просити цих мов, тому приємно мати розетку для них. Якщо тривіальні виклики вас набридали, спробуйте робити їх нетривіальною мовою.
Мартін Ендер

Відповіді:



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

Пітон, 15 байт

str.__getitem__

або

lambda s,i:s[i]

Обидва беруть 2 аргументи: рядок та індекс. 0-індексований.


Я здивований, що обидва методи мають однакову довжину.
Лина монашка

6

Haskell, 4 байти

(!!)

Індексація на основі 0. Приклад використання: (!!) "Hello" 1-> 'e'.



5

Сітківка , 28 20 19 байт

Збережено 8 байт завдяки @MartinEnder, не використовуючи балансуючі групи

Збережено 1 байт завдяки @ mbomb007, використовуючи ^.+замість^\d+

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

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

Програма 0-індексована.


Змініть, \dщоб .зберегти байт.
mbomb007

@ mbomb007 Дякую за пораду :)
user41805


3

Аліса , 10 байт

/@!O?]&
 I

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

Очікує рядок у першому рядку та індекс на основі 0 у другому рядку.

Пояснення

Незважаючи на своє багатство вбудованих модулів, в Алісі не існує строкової індексації. Причина полягає в тому, що він вимагає як цілого, так і рядкового параметра, а всі команди в Alice є строго цілими числами до цілих чисел або рядків до рядків.

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

/    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 Якщо ви думаєте, що це погано, також немає вбудованого, щоб отримати довжину рядка. ;)
Мартін Ендер







2

SILOS , 43 байти

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

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

Досить просто.


SILOS повернувся \ о /
Leaky Nun

1
Так, я намагаюся відповісти на якомога більше дзвінків, включаючи екран завантаження Windows. Мені подобається, що це стосується графічного виводу та бібліотек, але я все ж хотів би розробити схему стиснення, щоб спробувати зробити її конкурентоспроможною. По суті, int [], який він компілює, може бути створений за допомогою читання потоку байтів. @LeakyNun
Rohan Jhunjhunwala

2

BF , 9 байт

,[->,<]>.

Індекс приймається за допомогою символьного коду символу (наприклад, подання Аліси). Після цього у нас є рядок.

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

Посилання TIO використовує обгортку Bash, і вхід може бути змінений у файлі заголовка (причина обгортки полягає в тому, щоб ми могли бачити байти).


Legit TIO хакерство: p
Leaky Nun

@LeakyNun Я використовував обгортку для BF .
користувач41805

1
Я сказав, що це законно.
Лина монашка

Чи є спосіб зробити внесок в інші подібні мови TIO? Як SMBF?
mbomb007

@ mbomb007 Ви повинні зробити це для інших мов, використовуючи їх обгортки. Ось обгортка для SMBF
user41805

2

JavaScript, 11 10 байт

s=>n=>s[n]

Використовує індексацію на основі 0.

-1 байт завдяки монахині @Leaky

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]щоб зберегти байт
Лина монашка

1
Кожен раз, коли я бачу відповіді, як це, це мене дратує, тому що я знаю, що версія C # завжди на один байт довше для напівколонки на кінці. І це дійсно так
TheLethalCoder

2

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

+1 для -vпозначення прапора

:?!\i~1-
io;\

Дякуємо @steenbergh, що повідомив мене про -vпрапор та врятував мені 3 байти!

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

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

Пояснення

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


1
Існує параметр -v <x>командного рядка, який ініціалізує стек для утримання <x>при запуску програми. Спробуйте онлайн
steenbergh

2

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

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

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

Формат введення є таким:

string
index

А програма 1-індексована.

Пояснення

Морква має кілька глобальних змінних, по одній для кожного типу: string, float та масив (інші мають бути реалізовані незабаром). Програма запускається в строковому режимі, де всі оператори впливатимуть на глобальну змінну рядків. І я називаю ці змінні "стеком".

(Приклад вхідних даних: 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","це наприкінці, але це не має значення, оскільки висновок все ще виглядає на інтерпретаторі.


1

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

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

Читає sз STDIN і приймає nяк параметр командного рядка.


1

GolfScript , 7 4 байти

~1/=

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

Я засмоктую GolfScript, тому ціную допомогу Мартіна Ендера .


У цьому немає потреби [.
Мартін Ендер

Але загалом, якщо ви хочете символів з рядків, ви просто розділите рядок, а не перетворіть кодову точку назад:~1/=
Мартін Ендер

@MartinEnder І ось так ти побив Алісу ...
Ерік Попечитель

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), залежно від використовуваного типу даних.



1

Дивіль , 4 байти

_[_]

Створює анонімну функцію, яка приймає a Stringі an intі повертає a char.

Використання:

let f: (String, int) -> char = _[_]
print f("abc", 1) // b





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