Elemen string pada indeks yang ditentukan

13

Diberikan string sdan angka non-negatif nkurang dari panjangnya s, menampilkan karakter pada nposisi -th dari s.

Pengindeksan 0 dan pengindeksan 1 diizinkan. Untuk pengindeksan 1, nakan positif dan kurang dari atau sama dengan panjang s.

s hanya akan terdiri dari karakter yang dapat dicetak.

Input / output yang masuk akal diizinkan. Celah standar berlaku.

Testcases (pengindeksan 0):

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

Testcases (1-indexing):

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

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Biarawati Bocor
sumber
13
Saya menurunkan ini karena ini bukan tantangan pemrograman atau golf; semua yang pada dasarnya ditanyakan di sini adalah bahasa mana yang memiliki built-in terpendek untuk pekerjaan itu.
Shaggy
15
@Shaggy Sama untuk banyak tantangan sederhana lainnya seperti menambahkan dua angka, menguji apakah suatu bilangan prima atau mencetak "Halo, Dunia!". Meskipun ini membosankan dalam banyak bahasa yang dapat membuatnya keluar dari kotak, mereka bisa menjadi tantangan yang menarik untuk bahasa yang lebih primitif yang harus menggulung implementasi mereka sendiri. Plus, hal yang lebih rumit biasanya terlalu banyak untuk ditanyakan pada bahasa-bahasa tersebut, jadi senang memiliki saluran keluar untuk mereka. Jika tantangan sepele membuat Anda bosan, cobalah melakukannya dalam bahasa nontrivial.
Martin Ender

Jawaban:

9

MATL , 1 byte

)

Cobalah online!

Yah, sulit membuatnya lebih sederhana. )mengindeks input pertama, menggunakan nilai input kedua. Ini 1-diindeks.

Stewie Griffin
sumber
7

Alice , 5 byte

I&IO@

Cobalah online!

Seperti biasa itu jauh lebih pendek jika kita menghindari mode Ordinal dan menggunakan format input yang buruk. Di sini, titik kode karakter pertama digunakan sebagai input integer . Sisa dari input adalah string. Indeks ini berbasis 1.

Penjelasan

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.
Martin Ender
sumber
abysmal- Saya pikir Anda membuatnya xD
Stephen
@StephenS Maksudmu saya mengusulkan format I / O ini pada meta? Ya, memang, tetapi sebagian besar untuk bahasa yang harus mengimplementasikan parser / renderer bilangan desimal mereka sendiri setiap kali mereka bersaing dalam tantangan dengan I / O numerik, sehingga mereka mungkin akan melewatkan semuanya. Tetapi memiliki efek samping yang disayangkan bahwa dalam beberapa bahasa yang dapat membaca dan menulis desimal dengan mudah, masih lebih pendek untuk menggunakan poin kode sebagai gantinya.
Martin Ender
6

Python, 15 byte

str.__getitem__

atau

lambda s,i:s[i]

Keduanya mengambil 2 argumen: string dan indeks. Diindeks 0.

Artyer
sumber
Saya terkejut kedua metode memiliki panjang yang sama.
Leaky Nun
6

Haskell, 4 byte

(!!)

Pengindeksan berbasis 0. Contoh penggunaan: (!!) "Hello" 1-> 'e'.

nimi
sumber
5

Oktaf, 10 byte

@(s,n)s(n)

Mengambil string s, dan angka nsebagai input, dan mengembalikan nkarakter th s.

Stewie Griffin
sumber
5

Retina , 28 20 19 byte

Disimpan 8 byte berkat @MartinEnder dengan tidak menggunakan grup penyeimbang

Disimpan 1 byte berkat @ mbomb007 dengan menggunakan ^.+alih-alih^\d+

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

Cobalah online!

Program ini diindeks 0.

Kritixi Lithos
sumber
Ubah \duntuk .menyimpan byte.
mbomb007
@ mbomb007 Terima kasih atas tipnya :)
Kritixi Lithos
3

Alice , 10 byte

/@!O?]&
 I

Cobalah online!

Mengharapkan string pada baris pertama dan indeks berbasis 0 pada baris kedua.

Penjelasan

Terlepas dari kekayaan bawaannya, pengindeksan string tidak ada di Alice. Alasannya adalah karena ia membutuhkan integer dan parameter string, dan semua perintah di Alice benar-benar integer ke integer atau string ke string.

Secara umum, cara utama untuk melakukan operasi pada string yang membutuhkan atau menghasilkan bilangan bulat adalah dengan menyimpan string pada pita dalam mode Ordinal, yang kemudian dapat Anda manipulasi dengan bilangan bulat dalam mode Kardinal.

/    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.
Martin Ender
sumber
1
"Terlepas dari kekayaan bawaannya, pengindeksan string tidak ada di Alice." > _>
Leaky Nun
1
@ LeakyNun Jika Anda berpikir itu buruk, tidak ada built-in untuk mendapatkan panjang string. ;)
Martin Ender
3

Brachylog , 2 byte

∋₎

Cobalah online!

Penjelasan

menyatukan outputnya dengan elemen Input. Dengan sebagai subskrip, ia akan menyatukan outputnya dengan Ielemen th S, dengan [S,I]sebagai input.

Fatalisasi
sumber
3

Cubix , 8 byte

t@poIA//

Solusi ini diindeks 1. Input harus terdiri dari angka pertama, kemudian pemisah (yang bukan digit atau a .) dan kemudian string.

Cobalah online!

Luke
sumber
2

SILOS , 43 byte

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

Cobalah online!

Cukup sederhana.

Rohan Jhunjhunwala
sumber
SILOS kembali \ o /
Leaky Nun
1
Ya, saya mencoba untuk menjawab panggilan sebanyak mungkin, termasuk satu jendela memuat layar. Saya suka intinya dalam hal output grafis, dan perpustakaan, tapi saya masih ingin mengembangkan skema kompresi untuk mencoba dan membuatnya kompetitif. Pada dasarnya int [] yang dikompilasi dapat dihasilkan melalui pembacaan aliran byte. @LeakyNun
Rohan Jhunjhunwala
2

BF , 9 byte

,[->,<]>.

Indeks diambil melalui kode karakter char (seperti pengiriman Alice). Setelah itu, kami memiliki string.

Cobalah online!

TIO link menggunakan pembungkus Bash dan input dapat diubah dalam file header (alasan untuk pembungkus adalah agar kita dapat melihat byte).

Kritixi Lithos
sumber
Peretasan TIO yang sah: p
Leaky Nun
@ LeakyNun Saya menggunakan pembungkus untuk BF .
Kritixi Lithos
1
Saya memang mengatakan itu sah.
Leaky Nun
Apakah ada cara untuk melakukan input ke bahasa TIO lain seperti itu? Suka SMBF?
mbomb007
@ mbomb007 Anda harus dapat melakukannya untuk bahasa lain dengan menggunakan pembungkusnya. Inilah pembungkus untuk SMBF
Kritixi Lithos
2

JavaScript, 11 10 byte

s=>n=>s[n]

Menggunakan pengindeksan berbasis 0.

-1 byte terima kasih kepada @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));

Stephen
sumber
1
Anda dapat menggunakan currying s=>i=>s[i]untuk menyimpan byte
Leaky Nun
1
Setiap kali saya melihat jawaban seperti ini, itu mengganggu saya karena saya tahu versi C # selalu satu byte lebih lama untuk titik koma di ujungnya. Dan memang itulah yang terjadi di sini
TheLethalCoder
2

> <> , 13 + 1 = 14 byte

+1 untuk -vbendera untuk mengambil input

:?!\i~1-
io;\

Terima kasih kepada @steenbergh karena memberi tahu saya tentang-v bendera dan menyelamatkan saya 3 byte!

Masukkan indeks dengan argumen baris perintah -v [index] (0-diindeks) dan masukkan string melalui stdin.

Cobalah online!

Penjelasan

Tumpukan dimulai dengan indeks di atas.
:duplikat itu.
?abaikan karakter berikutnya jika indeksnya adalah 0. (Popping itu dari tumpukan)
Jika itu nol, \mencerminkan arah untuk turun. Kemudian, itu tercermin ke kanan dengan yang berikutnya \. Itu membungkus dan mengeksekusi ikarakter nput, mengucapkan odan ;menghentikan eksekusi.
Jika tidak, !lewati instruksi berikutnya, sehingga tidak turun.
i~memasukkan karakter dan kemudian segera membuangnya.
1mendorong 1.
-mengurangi 1dari indeks, sehingga satu karakter dalam input dikonsumsi dan indeks dikurangi. Program loop kembali ke :.

Artyer
sumber
1
Ada -v <x>parameter baris perintah, yang menginisialisasi tumpukan untuk menahan <x>pada awal program. Cobalah online
steenbergh
2

Wortel , 16 byte

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

Cobalah online!

Format inputnya adalah sebagai berikut:

string
index

Dan program ini 1-diindeks.

Penjelasan

Wortel memiliki beberapa variabel global, satu untuk setiap jenis: string, float, dan array (lainnya akan segera diimplementasikan). Program dimulai dalam mode string, di mana semua operator akan mempengaruhi variabel string global. Dan saya menyebut variabel-variabel ini "tumpukan".

(Contoh masukan: 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"]

Sekarang ini mengembalikan satu array elemen yang berisi string panjang satu, tetapi ditampilkan sebagai string di situs web.

Jika kita benar-benar ingin memberikan hasil sebagai string, kita dapat dengan mudah melakukannya S","pada akhirnya, tetapi tidak masalah karena outputnya masih terlihat sama pada interpreter.

Kritixi Lithos
sumber
1

Batch, 32 byte

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

Membaca sdari STDIN dan mengambil nsebagai parameter baris perintah.

Neil
sumber
1

GolfScript , 7 4 byte

~1/=

Cobalah online!

Saya payah dalam GolfScript, jadi saya menghargai bantuan Martin Ender .

Erik the Outgolfer
sumber
Tidak perlu untuk itu [.
Martin Ender
Tetapi secara umum jika Anda ingin karakter dari string, Anda hanya membagi string terlebih dahulu daripada mengubah titik kode kembali:~1/=
Martin Ender
@ MartinEnder Dan begitulah cara Anda mengalahkan Alice ...
Erik the Outgolfer
1

Turtlèd , 9 byte

!?:[*l+].

Cobalah online!

penjelasan:

Pertama, Turtlèd berbasis grid, dengan benda penyu. Ada sel-sel kotak penyu dapat bergerak ke kiri, atas, bawah, dan kanan, dan dapat menulis sesuatu pada sel-sel jaringan.

[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]
Lemon dirusak
sumber
1

Clojure, 3

nth

: P Apa yang dapat Anda lakukan ketika ada built-in untuk ini? Ini berfungsi pada daftar, vektor, string dan urutan. Ini bisa O (1) atau O (n), tergantung pada tipe data yang digunakan.

NikoNyrh
sumber
1

sed , 31 byte

:
/^1/{s:1 .: :;b}
s: (.).*:\1:

Cobalah online!

Input: indeks dan string, dipisahkan oleh satu spasi. Indeks di unary, tetapi berbasis nol.

eush77
sumber
1

Dyvil , 4 Bytes

_[_]

Membuat fungsi anonim yang mengambil a Stringdan an intdan mengembalikan achar.

Pemakaian:

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

QBasic 4.5, 24 bytes

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

Pretty straightforward.

steenbergh
sumber
1

Mathematica, 18 byte

#~StringTake~{#2}&

Solusi dasar, tetapi sayangnya nama fungsinya cukup panjang.

numbermaniac
sumber
1

C #, 11 byte

s=>n=>s[n];
TheLethalCoder
sumber