Belirtilen dizindeki dizenin öğesi


13

Uzunluğundan daha az bir dize sve negatif olmayan bir sayı nverildiğinde s, karakterin n-d konumunda çıktı alın s.

0-indeksleme ve 1-indekslemeye izin verilir. 1 endeksleme niçin pozitif ve uzunluğuna eşit veya daha az olacaktır s.

s yalnızca yazdırılabilir karakterlerden oluşur.

Herhangi bir makul giriş / çıkışa izin verilir. Standart boşluklar geçerlidir.

Testcases (0 dizinleme):

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

Testcases (1 dizinleme):

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

Bu , bayt en kısa cevap kazanır.


13
Bunu gerçekten düşürdüm, çünkü bu gerçekten bir programlama veya golf zorluğu değil; burada esasen sorulan tek şey hangi dilin iş için en kısa zamanda yerleşik olduğudur.
Shaggy

15
@Shaggy İki sayı eklemek, bir sayının asal olup olmadığını test etmek veya "Merhaba, Dünya!" Bunlar, onları kutudan çıkarabilecek birçok dilde sıkıcı olsa da, kendi uygulamalarını yuvarlamak zorunda olan daha ilkel diller için ilginç zorluklar olabilir. Ayrıca, daha karmaşık bir şey genellikle bu dilleri sormak için çok fazla, bu yüzden onlar için bir çıkışa sahip olmak güzel. Eğer önemsiz zorluklar sizi rahatsız ediyorsa, önemsiz bir dilde yapmayı deneyin.
Martin Ender

Yanıtlar:



7

Alice , 5 bayt

I&IO@

Çevrimiçi deneyin!

Normal moddan kaçınırsak ve dipsiz bir giriş biçimi kullanırsak, her zamanki gibi çok daha kısa olur. Burada, ilk karakterin kod noktası tamsayı girişi olarak kullanılır . Girdinin geri kalanı dizedir. Dizin 1 tabanlıdır.

açıklama

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- Bunu xD yaptığınızı sanıyordum
Stephen

@StephenS Bu G / Ç biçimini meta olarak önerdiğimi mi söylüyorsunuz? Evet, yaptım, ancak çoğunlukla sayısal G / Ç ile bir mücadelede her rekabet ettiklerinde kendi ondalık tam sayı ayrıştırıcısını / oluşturucusunu uygulamak zorunda kalacak diller için, muhtemelen bunları tamamen atlayacaklardı. Ama bazı dillerde talihsiz bir yan etkisi vardır olabilir oldukça kolay yazma ondalık okuyun ve yerine kullanılması kod noktalarına hala kısa.
Martin Ender

6

Python, 15 bayt

str.__getitem__

veya

lambda s,i:s[i]

Her ikisi de 2 argüman alır: dize ve dizin. 0 endeksli.


Her iki yöntemin de aynı uzunlukta olmasına şaşırıyorum.
Sızan Rahibe

6

Haskell, 4 bayt

(!!)

0 tabanlı indeksleme. Kullanım örneği: (!!) "Hello" 1-> 'e'.


5

Oktav, 10 bayt

@(s,n)s(n)

Bir dize sve bir sayı ngirdi olarak alır ve öğesinin nth karakterini döndürür s.


5

Retina , 28 20 19 bayt

@MartinEnder sayesinde dengeleme grupları kullanmadan 8 bayt kaydedildi

@ Mbomb007 ^.+yerine kullanarak 1 bayt kaydedildi^\d+

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

Çevrimiçi deneyin!

Program 0 dizinlidir.


Bir bayt kaydetmek \diçin .olarak değiştirin .
mbomb007

@ mbomb007 Tavsiye için teşekkürler :)
user41805


3

Alice , 10 bayt

/@!O?]&
 I

Çevrimiçi deneyin!

İlk satırdaki dizeyi ve ikinci satırdaki 0 ​​tabanlı dizini bekler.

açıklama

Yerleşik varlık zenginliğine rağmen, Alice'de dize dizine ekleme mevcut değildir. Bunun nedeni, hem bir tamsayı hem de bir dize parametresi gerektirmesidir ve Alice'teki tüm komutlar, tamsayılara veya dizelere dizelere tamsayıdır.

Genel olarak, tamsayı gerektiren veya sonuç veren dizelerde herhangi bir işlemi gerçekleştirmenin ana yolu, dizeyi kasette Normal modda depolayabilmeniz için Normal modda bantta saklamaktır.

/    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
"Yerleşik zenginliklerine rağmen Alice'de dize dizine ekleme mevcut değil." > _>
Sızdıran Rahibe

1
@LeakyNun Bunun kötü olduğunu düşünüyorsanız, bir dizenin uzunluğunu elde etmek için yerleşik bir şey de yoktur. ;)
Martin Ender



3

Brachylog , 2 bayt

∋₎

Çevrimiçi deneyin!

açıklama

çıktısını Giriş öğesiyle birleştirir. İle olduğu gibi indis, bu ile çıkış birleştirecektir Iinci elemanı Sile, [S,I]girdi olarak kullanılmaktadır.


3

Cubix , 8 bayt

t@poIA//

Bu çözüm 1 endekslidir. Giriş önce bir sayı, daha sonra bir ayırıcı (bir rakam veya a olmayan .) ve daha sonra dizeden oluşmalıdır .

Çevrimiçi deneyin!




2

SILOS , 43 bayt

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

Çevrimiçi deneyin!

Yeterince basit.


SILOS geri döndü \ o /
Leaky Nun

1
Evet, pencere yükleme ekranı da dahil olmak üzere mümkün olduğunca çok çağrıya cevap vermeye çalışıyorum. Grafiksel çıktı ve kütüphaneler açısından üzerinde durduğum noktayı seviyorum, ancak yine de rekabetçi bir hale getirmek için bir sıkıştırma şeması geliştirmek istiyorum. Esasen derlediği int [], bir bayt akışı okunarak oluşturulabilir. @LeakyNun
Rohan Jhunjhunwala

2

BF , 9 bayt

,[->,<]>.

Dizin, bir karakterin karakter kodu aracılığıyla alınır (Alice gönderimi gibi). Bundan sonra, dize var.

Çevrimiçi deneyin!

TIO bağlantısı bir Bash sarmalayıcısı kullanır ve giriş başlık dosyasında değiştirilebilir (sarmalayıcının nedeni baytları görebilmemizdir).


Yasal TIO hackleme: p
Leaky Nun

@LeakyNun Sarıcıyı BF için kullandım .
user41805

1
Bunun yasal olduğunu söyledim.
Sızdıran Rahibe

Bunun gibi diğer TIO dillerine giriş yapmanın bir yolu var mı? SMBF gibi mi?
mbomb007

@ mbomb007 Diğer diller için paketlerini kullanarak bunu yapabilmelisiniz. İşte SMBF için sarıcı
user41805

2

JavaScript, 11 10 bayt

s=>n=>s[n]

0 tabanlı indeksleme kullanır.

@Leaky Nun sayesinde -1 bayt

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]bir bayt kurtarmak için currying kullanabilirsiniz
Leaky Nun

1
Bunun gibi cevapları her gördüğümde canımı sıkıyor çünkü C # sürümünün sonunda yarı kolon için her zaman bir bayt daha uzun olduğunu biliyorum. Ve gerçekten de durum böyledir
TheLethalCoder

2

> <> , 13 + 1 = 14 bayt

-vBayrağın girdi alması için +1

:?!\i~1-
io;\

@Steenbergh'e-v bayrağını bana bildirdiği ve 3 bayt kurtardığı için teşekkürler !

Dizini komut satırı bağımsız değişkeniyle -v [index](0 dizinli) girin ve dizeyi stdin aracılığıyla girin.

Çevrimiçi deneyin!

açıklama

Yığın, dizin üstte olacak şekilde başlar.
:çoğaltır.
?dizin 0 ise bir sonraki karakteri yok sayar. (Yığının dışına
çıkarsa ) Sıfırsa , \aşağı inme yönünü yansıtır. Ardından, bir sonraki ile sağa yansıtılır \. Etrafına sarılır ve ibir karakter ogirer , girer ve ;yürütmeyi durdurur.
Değilse !, bir sonraki talimatı atlar, bu yüzden aşağı gitmez.
i~bir karakter girer ve hemen atar.
11'i iter.
-Dizinden çıkar 1, böylece girişteki bir karakter tüketilir ve dizin azaltılır. Program geri dönüyor :.


1
Orada -v <x>beklemeye yığını başlatırken komut satırı parametresi, <x>programın başlangıç. Çevrimiçi deneyin
steenbergh

2

Havuç , 16 bayt

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

Çevrimiçi deneyin!

Giriş biçimi şöyledir:

string
index

Ve program 1 endekslidir.

açıklama

Havuç, her tür için bir tane olmak üzere çeşitli küresel değişkenlere sahiptir: dize, kayan nokta ve dizi (diğerleri yakında uygulanacaktır). Program, tüm işleçlerin genel dize değişkenini etkileyeceği dize modunda başlar. Bu değişkenlere "yığın" diyorum.

(Örnek giriş: 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"]

Şimdi bu, bir uzunluklu bir dize içeren bir öğe dizisi döndürür, ancak web sitesinde bir dize olarak gösterilir.

Sonucu gerçekten bir dize olarak vermek istiyorsak S",", sonunda kolayca yapabiliriz , ancak önemli değil çünkü çıktı hala yorumlayıcıda aynı görünüyor.


1

Toplu, 32 bayt

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

sSTDIN'den okur ve nbir komut satırı parametresi olarak alır .



1

Turtlèd , 9 bayt

!?:[*l+].

Çevrimiçi deneyin!

açıklama:

İlk olarak, Turtlèd ızgara tabanlı, bir kaplumbağa şeyle. Kaplumbağa sola, yukarı, aşağı ve sağa hareket edebilen ızgara hücreleri vardır ve ızgara hücrelerine bir şeyler yazabilir.

[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 Bunun için bir yerleşik olduğunda ne yapabilirsiniz ? Bu listeler, vektörler, dizeler ve diziler üzerinde çalışır. Kullanılan veri tipine bağlı olarak O (1) veya O (n) 'dir.



1

Dyvil , 4 Bayt

_[_]

A Stringve an alan intve a döndüren anonim bir işlev oluşturur char.

Kullanımı:

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




1

Mathematica, 18 bayt

#~StringTake~{#2}&

Temel çözüm, ancak maalesef işlev adı oldukça uzun.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.