Apakah char yang ke-n sama dengan yang ke-n dari char yang terakhir?


22

Terinspirasi oleh Apakah awal sama dengan akhir

Diberikan string sdan integer n, menampilkan kebenaran / falsey, apakah karakter nth ssama dengan nth dari karakter akhir s.

Memasukkan

String yang tidak kosong dan integer. Anda dapat menggunakan pengindeksan berbasis 0 atau pengindeksan berbasis 1. Bilangan bulat dijamin valid berdasarkan string. Misalnya, jika string adalah "supercalifragalistic123", integer dapat dari 1 hingga 23 untuk pengindeksan berbasis 1, dan 0 hingga 22 untuk pengindeksan berbasis 0. Harap dicatat bahwa nbisa lebih besar dari setengah panjangnya s.

Masukan terbatas pada ASCII yang dapat dicetak.

Keluaran

Nilai kebenaran / kepalsuan didasarkan pada apakah nilai nth ssama dengan nth dari nilai terakhir di s.

Harap perhatikan bahwa karakter terakhir berada di posisi 0 untuk pengindeksan berbasis 0 dan posisi 1 untuk pengindeksan berbasis 1. Anggap saja membandingkan string dengan terbalik.

Uji Kasus

Diindeks 0

"1", 0         Truthy 1 == 1
"abc", 1       Truthy b == b
"aaaaaaa", 3   Truthy a == a
"[][]", 1      Falsey ] != [
"[][]", 0      Falsey [ != ]
"ppqqpq", 2    Truthy q == q
"ababab", 5    Falsey a != b
"12345", 0     Falsey 1 != 5
"letter", 1    Truthy e == e
"zxywv", 3     Falsey w != x

1-diindeks

"1", 1         Truthy 1 == 1
"abc", 2       Truthy b == b
"aaaaaaa", 4   Truthy a == a
"[][]", 2      Falsey ] != [
"[][]", 1      Falsey [ != ]
"ppqqpq", 3    Truthy q == q
"ababab", 6    Falsey a != b
"12345", 1     Falsey 1 != 5
"letter", 2    Truthy e == e
"zxywv", 4     Falsey w != x


Apakah bisa diterima nsebagai titik kode? (untuk bahasa esoteris seperti brain-flak)
DJMcMayhem

@DJMcMayhem yakin.
Stephen

Jawaban:


11

Jelly , 5 4 byte

=UƓị

Cobalah online!

Seharusnya tidak ada jawaban yang lebih pendek di Jelly. Suatu program akan membutuhkan perbandingan, pembalikan / negasi, panggilan indeks, dan byte untuk aliran kontrol ( Ɠdalam hal ini), yang menambahkan hingga empat byte.

Bagaimana itu bekerja

 =UƓị 
       - (implicit) input string
 =     - equals (vectorizing by characters because a string is a charlist)
  U    - the reversed string
    ị  - get the element at the index of:
   Ɠ   - the input index

-1 byte terima kasih kepada @ ais523, menggunakan Ɠ


Solusi 4 byte gagal dari versi asli postingan:ịµU=
CalculatorFeline

Anda dapat meningkatkannya menjadi empat byte dengan membuatnya monadik dan bukan diadik (dan mengambil n dari input standar daripada argumen): Cobalah secara online! Teknik ini sering berguna ketika Anda membuang satu byte pada aliran kontrol dan satu byte tambahan ³, karena Ɠbiayanya satu byte tetapi menjadikannya ³implisit dan sering memberi Anda lebih banyak fleksibilitas aliran kontrol.

@ ais512 Ide bagus, saya sebenarnya belum pernah menggunakan input sebelumnya dalam jawaban karena argumen implisit cenderung lebih efisien.
fireflame241

14

JavaScript (ES6), 26 byte

s=>n=>s[n]==s.substr(~n,1)

Kalau tidak:

s=>n=>s[n]==s.slice(~n)[0]

Yang ini hampir berhasil, tetapi gagal ketika n == 0(karena s.slice(-1,0) == ""):

s=>n=>s[n]==s.slice(~n,-n)

Solusi 26-byte lain yang ditunjukkan oleh @RickHitchcock :

s=>n=>s[n]==s[s.length+~n]

3
Penggunaan yang bagus ~, tidak akan pernah memiliki itu untuk ini.
Stephen

10

MATL , 5 byte

tP=w)

Cobalah online!

Penjelasan:

t   % Duplicate the input

Stack:
    ['ppqqpq' 'ppqqpq']

P   % Reverse the top element of the stack

Stack:
    ['ppqqpq' 'qpqqpp']

=   % Equals. Push an array of the indices that are equal

Stack:
    [[0 1 1 1 1 0]]

w   % Swap the top two elements

Stack:
    [[0 1 1 1 1 0], 3]

)   % Grab the a'th element of b 

1
Pendekatan yang sangat pintar!
Luis Mendo

3
@LuisMendo Terima kasih! Itu tenang pelengkap yang datang dari Anda :)
DJMcMayhem

Sekarang kita lihat apakah Jelly dapat mengalahkan xD ini
Stephen

5

Oktaf , 22 byte

@(s,n)s(n)==s(end-n+1)

Cobalah online!

Atau bytecount yang sama:

@(s,n)s(n)==flip(s)(n)

Cobalah online!

Penjelasan:

Cukup lurus ke depan. Yang pertama mengambil string sdan integer nsebagai input dan memeriksa elemen s(n)ke-n terhadap elemen "last-n + 1" untuk kesetaraan.

Yang kedua memeriksa elemen s(n)ke-n terhadap elemen ke-n sterbalik.


5

05AB1E , 7 5 byte

-2 byte terima kasih kepada Adnan

ÂøsèË

Cobalah online! atau Coba semua tes

     # Add a reversed copy on top of the original string
 ø    # Zip
  sè  # Extract the nth element
    Ë # Check if they are equal

Cobalah online!


ÂøsèËmenghemat dua byte
Adnan

@ Adnan Terima kasih! Saya tahu ada cara 1 byte untuk menambahkan salinan terbalik, saya hanya tidak ingat bagaimana labelnya.
Riley

@ComradeSparklePony Saya lupa memperbaruinya untuk memasukkan saran Adnan.
Riley


5

Alice , 24 byte

/t.~e?/-mom
\I!RtI&1n;@/

Cobalah online!

Input terdiri dari string pada satu baris, dan nomor pada baris kedua. Output adalah Jabberwockyjika karakternya sama, dan tidak ada yang sebaliknya.

Penjelasan

Program ini sebagian besar dalam mode ordinal, dengan satu perintah dalam mode kardinal. Secara linier, programnya adalah sebagai berikut:

I.ReI&1m;mt!~t?&-no

I  % Input first line
   % STACK: ["ppqqpq"]
.  % Duplicate top of stack
   % STACK: ["ppqqpq", "ppqqpq"]
R  % Reverse top of stack
   % STACK: ["ppqqpq", "qpqqpp"]
e  % Push empty string
   % STACK: ["ppqqpq", "qpqqpp", ""]
I  % Input next line
   % STACK: ["ppqqpq", "qpqqpp", "", "3"]
&  % (cardinal mode) Pop stack and repeat next command that many times
   % STACK: ["ppqqpq", "qpqqpp", ""], ITERATOR: [3]
1  % Append "1" to top of stack
   % STACK: ["ppqqpq", "qpqqpp", "111"]
m  % Truncate so the top two strings on the stack have the same length
   % STACK: ["ppqqpq", "qpq", "111"]
;  % Discard top of stack
   % STACK: ["ppqqpq", "qpq"]
m  % Truncate again
   % STACK: ["ppq", "qpq"]
t  % Extract last character
   % STACK: ["ppq", "qp", "q"]
!  % Move top of stack to tape
   % STACK: ["ppq", "qp"]
~  % Swap
   % STACK: ["qp", "ppq"]
t  % Extract last character
   % STACK: ["qp", "pp", "q"]
?  % Copy data from tape onto top of stack
   % STACK: ["qp', "pp", "q", "q"]
&  % Iterator: effectively a no-op in ordinal mode when the top of the stack is a 1-character string
   % STACK: ["qp", "pp", "q"], ITERATOR: ["q"]
-  % Remove occurrences: here, result is "" iff the characters are equal
   % STACK: ["qp", "pp", ""]
n  % Logical Not (for a consistent truthy value)
   % STACK: ["qp", "pp", "Jabberwocky"]
o  % Output top of stack

@MartinEnder Jabberwocky?
Stephen


@StephenS Btw, saya tidak mendapatkan pemberitahuan jika Anda hanya menyebutkan saya pada posting acak. Ping hanya berfungsi jika posting itu milik saya atau saya sudah berkomentar sendiri (dan saya pikir jika saya mengedit posting). Anda biasanya lebih baik me-ping saya di chat.
Martin Ender

@ MartinEnder Aku agak tahu itu, tapi itu tidak cukup penting untuk mem-ping kamu. Terima kasih atas konfirmasi dan tautannya :)
Stephen


4

Cubix , 22 byte

..@.IAp):tBvpptc?1.\O0

1-diindeks, mengambil input sebagai index, string, dipisahkan oleh spasi.

Cobalah online

Kubus

    . .
    @ .
I A p ) : t B v
p p t c ? 1 . \
    O 0
    . .

Penjelasan

Ini sebagian besar linier. Logika utamanya adalah

IAp):tBpptc

IA           Get the first input as an int and the rest as a string.
  p):        Move the index to the top of the stack, increment it, and copy it.
     t       Look up the appropriate character in the string.
      Bpp    Reverse the stack and put the index and character back on top.
         t   Look up the appropriate character in the reversed string.
          c  XOR the two characters.

Kami kemudian cabang dengan ?ke Output 1jika hasilnya adalah 0 dan 0sebaliknya.



3

C #, 28 27 byte

s=>n=>s[n]==s[s.Length+~n];

Menyimpan satu byte berkat @KevinCruijssen.

Kompilasi ke a Func<string, Func<int, bool>>.


Anda dapat menyimpan byte dengan mengubah s.Length-n-1ke s.Length+~n.
Kevin Cruijssen

@KevinCruijssen Terima kasih, trik yang bagus tidak akan pernah memikirkan itu.
TheLethalCoder

1
Saya akan sepenuhnya jujur, saya mendapatkannya dari komentar JS jawab sendiri. :) Byte-operations sebenarnya bukan keahlian saya.
Kevin Cruijssen


3

R 51 byte

function(s,n){s=el(strsplit(s,''));s[n]==rev(s)[n]}

Fungsi anonim, menggunakan pengindeksan berbasis 1


1
43 byte:function(s,n)(s=utf8ToInt(s))[n]==rev(s)[n]
Giuseppe


3

Clojure, 27 byte

#(nth(map =(reverse %)%)%2)

Wow, ini lebih pendek dari yang saya harapkan.


3

APL (Dyalog) , 10 5 byte

⊃=⊃∘⌽

Ini adalah fungsi diam-diam, yang perlu diberi nama seperti f←⊃=⊃∘⌽, dan kemudian disebut sebagai int f string.

Terima kasih kepada @ Adám untuk 5 byte kekalahan.

Bagaimana itu bekerja:

⊃=⊃∘⌽  ⍝ Main function; tacit. 
       ⍝ Inputs are ⍺ = 1 (left) and ⍵ = 'abca' (right).
⊃      ⍝ ⍺⊃⍵, meaning 'pick the ⍺-th element of ⍵'
 =     ⍝ Compare to
    ⌽  ⍝ ⌽⍵, meaning 'invert ⍵'
  ⊃    ⍝ Again, ⍺⊃⍵, but:
   ∘   ⍝ Compose. This turns ⌽ into the right argument for ⊃,
       ⍝ which becomes 'pick the ⍺-th element from ⌽(the inverse of)⍵'

Cobalah online!

Jawaban 22 byte telah diedit. Jika Anda ingin melihatnya, periksa riwayat revisi.


"dibutuhkan input dengan cara yang tidak konvensional" - mengambil 2 elemen input sebagai argumen kiri dan kanan dalam APL sepenuhnya standar dan selalu dapat diterima kecuali OP secara khusus melarangnya untuk beberapa alasan aneh.
Jonah

@ Jonah ya, orang-orang dalam obrolan memberi tahu saya tentang itu. Saya membiarkannya karena OP tidak menentukan dengan jelas apakah itu boleh atau tidak. Saya akan mengeditnya ketika saya kembali ke PC saya sehingga jawaban yang lebih pendek muncul terlebih dahulu.
J. Sallé

Mengenai "asumsi implisit": Sebenarnya, fungsi ini akan berfungsi bahkan ketika dipanggil secara monadik, dan kemudian akan muncul untuk digunakan 1sebagai argumen kiri default. Cobalah online! Fungsi tidak menganggap apa pun; mereka diterapkan secara dua arah karena mereka diberikan argumen kiri dan kanan.
Adám

@ Adám saya pikir itu terjadi karena, ketika dipanggil secara monadik, mengambil elemen pertama dari argumen? Bagaimanapun, saya akan mengedit untuk mengklarifikasi.
J. Sallé

3

V , 26, 16 , 13 byte

ä$Àñã2xñVpøˆ±

Cobalah online!

Hexdump:

00000000: e424 c0f1 e332 78f1 5670 f888 b1         .$...2x.Vp...

1 diindeks.

Penjelasan:

ä$                  " Duplicate this line horizontally
  Àñ   ñ            " Arg1 times...
    ã               "   Move to the center of this line
     2x             "   And delete two characters
        V           " Select this whole line
         p          " And replace it with the last pair of characters we deleted
          ø         " Count the number of matches of the following regex...
           <0x88>   "   Any character
                 ±  "   Followed by itself

Untuk referensi, jawaban asli saya adalah:

Àñx$x|ñxv$hhpÓ¨.©±/1
ñllS0

Cobalah online!(0 diindeks)

Hexdump:

00000000: c0f1 7824 787c f178 7624 6868 70d3 a82e  ..x$x|.xv$hhp...
00000010: a9b1 2f31 0af1 6c6c 5330                 ../1..llS0

Cobalah online! Ini sedikit lebih pendek. Man the Àñx$x|ñterasa seperti terlalu banyak karakter. Saya mencoba regex saja, tetapi akhirnya menjadi seperti 24 lama!
nmjcman101

1
@ nmjcman101 Ternyata ini bisa jauh lebih pendek dari itu menggunakan fitur-fitur yang lebih baru.
DJMcMayhem

Oh wow saya keluar dari latihan, saya bahkan hampir tidak bisa membaca V lagi
nmjcman101

@ nmjcman101 Saya telah memposting penjelasan (dan bermain
golf

2

Mathematica, 34 Bytes

s=StringTake;s[#,{#2}]==s[#,{-#2}]&

StringTake[#, #2]mengambil karakter pertama #2 dari #. StringPartakan bekerja dengan baik dalam hal ini. #~(s=StringPart)~-#2==s@##&
JungHwan Min

salah saya tetap!
J42161217

#~s~{#2}==#~s~{#2}&akan selalu menghasilkan True...
JungHwan Min

final diperbaiki! ....
J42161217

1
Sebenarnya, Anda dapat mengambil Listdari Strings sebagai masukan, sehingga #[[#2]]==#[[-#2]]&akan cukup
JungHwan Min

2

Perl 6 , 27 byte

{[eq] $^a.comb[$^b,*-1-$b]}

Menguji

{ # bare block lambda with two placeholder parameters 「$a」 and 「$b」

  [eq]        # reduce using string equality operator

    $^a       # declare first positional parameter

    .comb\    # split that into individual characters

    [         # index into that sequence

      $^b,    # declare and use second parameter

      *-1-$b  # closure that subtracts one and the 
              # second parameter of the outer block
              # (「*」 is the parameter of this closure)

    ]
}


2

Pyth , 8 7 byte

q@zQ@_z

Dengan input terbalik: pertama indeks, lalu string. Diindeks 0.

Penjelasan:

q@zQ@_z
 @zQ        Get the nth (Qth) character
     _z     Reverse the string
    @       Get the nth character of the reversed string. Implicit input of the index
q           Test equality

Cobalah online!



2

J, 6 byte

-4 byte terima kasih kepada FrownyFrog

{(=|.)

Lihat penjelasan jawaban asli - idenya cukup mirip, tetapi ini dilakukan dengan kait diad yang kata kerja kanannya sendiri merupakan kait monadik.

Cobalah online!

jawaban asli (10 byte)

{=/@(,:|.)

,:|. arg kanan di atas arg kanan terbalik

=/ Apakah mereka secara elementer sama?

{ ambil dari daftar boolean indeks yang ditunjukkan oleh arg kiri

Cobalah online!




1

QBIC , 18 byte

?_s;,:,1|=_sA,-a,1

Penjelasan

?        =     PRINT -1 if equal, 0 otherwise, between
 _s     |      A substring of
   ;,:,1          A$ string (read from cmd line), from the n'th pos, length 1
 _sA,-a,1      And a substring of A$, n'th pos from the right, also 1 length
               The second Substring is auto-terminated because EOF.


1

> <> (dengan juru bahasa ini ), 25 byte

i:0(?v
]&=n;>~{:}[:}]&r[}

Ini tidak berfungsi di TIO: juru bahasa TIO tidak membalik tumpukan baru ketika melakukan [instruksi, tetapi taman bermain ikan tidak - bandingkan "abcde"5[ooooo;berjalan di sini dan di sini , misalnya.

Input string diambil dari STDIN, dan kami menganggap n sudah ada di stack. Menggunakan pengindeksan 1.

Ikan mendapat n th karakter dengan [:}]&yang sifon off pertama n hal-hal di stack menjadi baru, tumpukan terbalik, memanipulasi yang sedikit, kemudian menempatkan sesuatu kembali dan menyimpan n karakter th dalam register. Kemudian membalik seluruh tumpukan dan melakukan hal yang sama lagi, dan mengembalikan 1 jika kedua karakter sama, dan 0 sebaliknya.

Ini tampaknya bekerja di TIO , selama 26 byte:

i:0(?v
]&=n;>~{:}[{:}]&r[{

1

C, 73 byte

Kompilasi apa adanya dengan GCC 6.3.1 (tanpa bendera). Beberapa kebingungan yang tidak perlu termasuk.

main(c,v)char**v;{c=atoi(v[2]);putchar((*++v)[c]-(*v)[strlen(*v+1)-c]);}

Pemakaian

$./a.out abcdcba 6

Kebenaran = tidak ada, falsey = sampah.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.