String-Element am angegebenen Index

13

Bei einer Zeichenfolge sund einer nicht negativen Zahl, die nkleiner als die Länge von ist s, wird das Zeichen an der n-ten Position von ausgegeben s.

0-Indizierung und 1-Indizierung sind zulässig. Bei 1-Indizierung ist npositiv und kleiner oder gleich der Länge von s.

s besteht nur aus druckbaren Zeichen.

Jede angemessene Eingabe / Ausgabe ist zulässig. Es gelten Standardlücken .

Testfälle (0-Indexierung):

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

Testfälle (1-Indizierung):

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

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Undichte Nonne
quelle
13
Ich habe dies abgelehnt, weil es nicht wirklich eine Programmier- oder Golfherausforderung ist. hier wird im wesentlichen nur gefragt, welche sprache am kürzesten für den job eingebaut ist.
Shaggy
15
@Shaggy Das Gleiche gilt für viele andere einfache Herausforderungen, z. B. das Hinzufügen von zwei Zahlen, das Prüfen, ob eine Zahl Primzahlen enthält oder das Drucken von "Hello, World!". Während diese in vielen Sprachen langweilig sind, können sie eine interessante Herausforderung für primitivere Sprachen sein, die ihre eigene Implementierung entwickeln müssen. Außerdem ist etwas Komplizierteres in der Regel zu viel, um von diesen Sprachen verlangt zu werden. Wenn Sie vor triviale Herausforderungen gestellt werden, versuchen Sie, diese in einer nichttrivialen Sprache zu lösen.
Martin Ender

Antworten:

9

MATL , 1 Byte

)

Probieren Sie es online!

Nun, es ist schwer, es viel einfacher zu machen. )Indiziert die erste Eingabe mit dem zweiten Eingabewert. Dies ist 1-indiziert.

Stewie Griffin
quelle
7

Alice , 5 Bytes

I&IO@

Probieren Sie es online!

Wie üblich ist es viel kürzer, wenn wir den Ordinal-Modus vermeiden und ein abgrundtiefes Eingabeformat verwenden. Hier wird der Codepunkt des ersten Zeichens als Ganzzahleingabe verwendet . Der Rest der Eingabe ist die Zeichenfolge. Der Index basiert auf 1.

Erläuterung

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
quelle
abysmal- Ich dachte, Sie haben es geschafft xD
Stephen
@StephenS Meinst du, ich habe dieses E / A-Format für Meta vorgeschlagen? Ja, aber meistens für Sprachen, die jedes Mal, wenn sie in einer Herausforderung mit numerischer E / A konkurrieren, einen eigenen Parser / Renderer für Dezimalzahlen implementieren müssten, würden sie diese wahrscheinlich einfach ganz überspringen. Aber es hat die unangenehme Nebenwirkung , dass in einigen Sprachen , die können ganz leicht lesen und schreiben dezimal es ist immer noch kürzer Verwendung Codepunkte statt.
Martin Ender
6

Python, 15 Bytes

str.__getitem__

oder

lambda s,i:s[i]

Beide benötigen zwei Argumente: den String und den Index. 0-indiziert.

Artyer
quelle
Ich bin überrascht, dass beide Methoden gleich lang sind.
Undichte Nonne
6

Haskell, 4 Bytes

(!!)

0-basierte Indizierung. Anwendungsbeispiel: (!!) "Hello" 1-> 'e'.

nimi
quelle
5

Oktave, 10 Bytes

@(s,n)s(n)

Nimmt eine Zeichenfolge sund eine Zahl nals Eingabe und gibt das nth-Zeichen von zurück s.

Stewie Griffin
quelle
5

Retina , 28 20 19 Bytes

8 Bytes dank @MartinEnder eingespart, indem keine Bilanzkreise verwendet wurden

1 Byte dank @ mbomb007 durch Verwendung von ^.+anstelle von gespeichert^\d+

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

Probieren Sie es online!

Das Programm ist 0-indiziert.

Kritixi Lithos
quelle
Wechseln Sie \dzu ., um ein Byte zu speichern.
mbomb007
@ mbomb007 Danke für den Tipp :)
Kritixi Lithos
3

Alice , 10 Bytes

/@!O?]&
 I

Probieren Sie es online!

Erwartet die Zeichenfolge in der ersten Zeile und den 0-basierten Index in der zweiten Zeile.

Erläuterung

Trotz der Fülle an integrierten Funktionen gibt es in Alice keine String-Indizierung. Der Grund dafür ist, dass sowohl ein Integer- als auch ein String-Parameter erforderlich sind und alle Befehle in Alice ausschließlich Ganzzahlen für Ganzzahlen oder Strings für Strings sind.

Im Allgemeinen besteht die Hauptmethode zum Ausführen von Operationen für Zeichenfolgen, die Ganzzahlen erfordern oder zu Ganzzahlen führen, darin, die Zeichenfolge im Ordnungsmodus auf dem Band zu speichern, den Sie dann im Kardinalmodus mit Ganzzahlen bearbeiten können.

/    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
quelle
1
"Trotz der Fülle an integrierten Funktionen gibt es in Alice keine String-Indizierung." > _>
Undichte Nonne
1
@LeakyNun Wenn du denkst, dass das schlecht ist, gibt es auch keine eingebaute Funktion, um die Länge eines Strings zu ermitteln. ;)
Martin Ender
3

Brachylog , 2 Bytes

∋₎

Probieren Sie es online!

Erläuterung

Vereinheitlicht seine Ausgabe mit einem Element der Eingabe. Mit as subscript wird die Ausgabe mit dem Ith-Element von S, with [S,I]as input vereinheitlicht .

Tödlich
quelle
3

Cubix , 8 Bytes

t@poIA//

Diese Lösung ist 1-indiziert. Die Eingabe sollte zuerst aus einer Zahl, dann aus einem Trennzeichen (das keine Ziffer oder ein .) und dann aus der Zeichenfolge bestehen.

Probieren Sie es online!

Luke
quelle
2

SILOS , 43 Bytes

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

Probieren Sie es online!

Einfach genug.

Rohan Jhunjhunwala
quelle
SILOS sind zurück \ o /
Leaky Nonne
1
Ja, ich versuche, so viele Anrufe wie möglich zu beantworten, einschließlich des Windows-Ladebildschirms. Ich mag den Punkt, an dem es um grafische Ausgabe und Bibliotheken geht, aber ich möchte immer noch ein Komprimierungsschema entwickeln, um es wettbewerbsfähig zu machen. Im Wesentlichen kann das int [], zu dem es kompiliert wird, durch Lesen eines Bytestroms generiert werden. @LeakyNun
Rohan Jhunjhunwala
2

BF , 9 Bytes

,[->,<]>.

Der Index wird über den Zeichencode eines Zeichens erstellt (wie bei der Alice-Übermittlung). Danach haben wir die Zeichenfolge.

Probieren Sie es online!

Der TIO-Link verwendet einen Bash-Wrapper und die Eingabe kann in der Header-Datei geändert werden (der Grund für den Wrapper ist, dass wir die Bytes sehen können).

Kritixi Lithos
quelle
Legit TIO Hacking: p
Undichte Nonne
@LeakyNun Ich habe den Wrapper für BF verwendet .
Kritixi Lithos
1
Ich habe gesagt, es ist legitim.
Undichte Nonne
Gibt es eine Möglichkeit, solche Eingaben in andere TIO-Sprachen zu machen? Wie SMBF?
mbomb007
@ mbomb007 Sie sollten in der Lage sein, dies für andere Sprachen zu tun, indem Sie deren Wrapper verwenden. Hier ist der Wrapper für SMBF
Kritixi Lithos
2

JavaScript, 11-10 Bytes

s=>n=>s[n]

Verwendet eine 0-basierte Indizierung.

-1 Byte dank @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
quelle
1
Sie können Currying verwenden s=>i=>s[i], um ein Byte zu speichern
Leaky Nun
1
Jedes Mal, wenn ich Antworten wie diese sehe, ärgere ich mich, weil ich weiß, dass die C # -Version für das Semikolon am Ende immer ein Byte länger ist. Und das ist in der Tat hier der Fall
TheLethalCoder
2

> <> , 13 + 1 = 14 Bytes

+1 für -vFlag zur Eingabe

:?!\i~1-
io;\

Vielen Dank an @steenbergh für die Benachrichtigung über das-v Flagge und das Speichern von 3 Bytes!

Geben Sie den Index mit dem Befehlszeilenargument ein -v [index] (0-indexiert) ein und geben Sie die Zeichenfolge über stdin ein.

Probieren Sie es online!

Erläuterung

Der Stapel beginnt mit dem Index oben.
:dupliziert es.
?wenn ignoriert das nächste Zeichen der Index 0 ist (es vom Stapel Popping)
Wenn es Null ist, \reflektiert die Richtung zu gehen. Dann wird es mit dem nächsten nach rechts gespiegelt \. Es iumgibt und führt nput ein Zeichen aus, ogibt es aus und ;hält die Ausführung an.
Wenn nicht, !überspringt die nächste Anweisung, damit sie nicht abfällt.
i~gibt ein Zeichen ein und verwirft es dann sofort.
1drückt 1.
-subtrahiert 1vom Index, so dass ein Zeichen in der Eingabe verbraucht und der Index dekrementiert wird. Das Programm führt eine Schleife zurück zum :.

Artyer
quelle
1
Es gibt den -v <x>Befehlszeilenparameter, der den Stapel initialisiert, der <x>beim Programmstart gehalten werden soll. Versuchen Sie es online
steenbergh
2

Karotte , 16 Bytes

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

Probieren Sie es online!

Das Eingabeformat ist wie folgt:

string
index

Und das Programm ist 1-indiziert.

Erläuterung

Carrot hat mehrere globale Variablen, eine für jeden Typ: String, Float und Array (andere werden in Kürze implementiert). Das Programm startet im String-Modus, in dem alle Operatoren die globale String-Variable beeinflussen. Und ich nenne diese Variablen den "Stapel".

(Beispiel Eingabe: 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"]

Nun wird ein Array mit einem Element zurückgegeben, das eine Zeichenfolge der Länge eins enthält, auf der Website jedoch als Zeichenfolge angezeigt.

Wenn wir das Ergebnis wirklich als Zeichenfolge angeben wollten, könnten wir es S","am Ende problemlos tun , aber es spielt keine Rolle, da die Ausgabe auf dem Interpreter immer noch gleich aussieht.

Kritixi Lithos
quelle
1

Batch, 32 Bytes

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

Liest saus STDIN und nimmt nals Befehlszeilenparameter.

Neil
quelle
1

GolfScript , 7 4 Bytes

~1/=

Probieren Sie es online!

Ich lese GolfScript und schätze die Hilfe von Martin Ender .

Erik der Outgolfer
quelle
Es gibt keine Notwendigkeit für die [.
Martin Ender
Wenn Sie jedoch Zeichen aus Zeichenfolgen verwenden möchten, müssen Sie die Zeichenfolge zunächst aufteilen, anstatt den Codepunkt zurück zu konvertieren:~1/=
Martin Ender,
@MartinEnder Und so hast du Alice verprügelt ...
Erik the Outgolfer
1

Turtlèd , 9 Bytes

!?:[*l+].

Probieren Sie es online!

Erläuterung:

Zunächst einmal ist Turtlèd gitterbasiert, mit einer Schildkrötensache. Es gibt Gitterzellen, auf denen sich die Schildkröte nach links, oben, unten und rechts bewegen kann, und auf die Gitterzellen können Dinge geschrieben werden.

[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]
Zerstörbare Zitrone
quelle
1

Clojure, 3

nth

: P Was können Sie tun, wenn es dafür ein eingebautes gibt ? Dies funktioniert mit Listen, Vektoren, Strings und Sequenzen. Es ist entweder O (1) oder O (n), abhängig vom verwendeten Datentyp.

NikoNyrh
quelle
1

sed , 31 bytes

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

Probieren Sie es online!

Eingabe: Index und der String, durch ein Leerzeichen getrennt. Index unär, aber nullbasiert.

eush77
quelle
1

Dyvil , 4 Bytes

_[_]

Erstellt eine anonyme Funktion, die eine String und ein und ein intzurückgibtchar .

Verwendung:

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

QBasic 4.5, 24 Bytes

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

Ziemlich einfach.

steenbergh
quelle
1

Mathematica, 18 Bytes

#~StringTake~{#2}&

Grundlösung, aber leider ist der Funktionsname recht lang.

numbermaniac
quelle
1

C #, 11 Bytes

s=>n=>s[n];
DerLethalCoder
quelle