Hitung Notasi Sel

16

Jadi semoga kita semua akrab dengan notasi sel Spreadsheet 'A1'.

Ini hanyalah representasi alfanumerik dari posisi sel tersebut di dalam kisi. Huruf mewakili posisi kolom sel, dan nomor mewakili baris.

Bagian 'huruf' dapat terdiri dari 1 atau lebih huruf dari 26 huruf alfabet Inggris, yang semuanya harus huruf kapital. Peta ini ke nomor melalui penggunaan numerik bijective 26-adic. Bagian 'angka' dapat terdiri dari bilangan bulat positif, bukan nol.


Tantangannya, menulis sebuah program yang diberi notasi A1 sel apa pun sebagai string tunggal, dapat menampilkan string yang berisi posisi kolom yang direpresentasikan sebagai angka, diikuti oleh spasi dan kemudian nomor baris.

Contoh Input / Output di bawah ini:

A1
>>1 1
B10
>>2 10
AC4 
>>29 4
AAC753
>>705 753
F123
>>6 123
GL93
>>194 93

Ini adalah tantangan pertama saya, karenanya kesederhanaan relatif dan potensi kemiskinan dari kriteria.

EDIT : String harus berupa huruf diikuti oleh angka dan kriteria yang menang adalah panjang kode terpendek (jika itu bisa berupa hal)

EDIT : Terkait dengan ini tetapi melakukan proses sebaliknya dengan indeks awal yang berbeda. Beberapa orang mungkin berpendapat bahwa fakta ini membuat teka-teki terkait lebih menarik.

dbr
sumber
Bisakah kita mengambil input sebagai, misalnya, array yang berisi huruf dan angka:["A", "1"]
Stephen
1
@StepHen No. Ini harus berupa string tunggal yang berisi huruf dan angka. Saya mungkin harus menambahkan, juga, bahwa string HARUS dalam urutan huruf diikuti oleh angka.
dbr
1
Kami biasanya memungkinkan format input dan output yang lebih fleksibel, seperti memilih baris baru alih-alih ruang sebagai pemisah keluaran
Luis Mendo
3
@DeanBrunt Tergantung pada Anda, dan tentu saja Anda dapat menerapkan format yang ketat untuk membuat tantangan lebih sulit. Tetapi orang-orang biasanya menikmati kesulitan dalam perhitungan yang sebenarnya lebih dari dalam format
Luis Mendo
4
Itu karena pemformatan tidak menambah nilai pada tantangan itu sendiri
Adnan

Jawaban:

20

Microsoft Excel, 43 Bytes.

=COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A1))

Saya tidak bisa menahan diri, saya hanya harus menggunakan alat yang tepat untuk pekerjaan itu. Mengambil input pada A1.

Uji Kasus

ATaco
sumber
11

Microsoft Excel, 40 byte

Versi bahasa Portugis Brasil.

=COL(INDIRETO(A1))&" "&LIN(INDIRETO(A1))

Versi solusi ATaco yang diterjemahkan (dan karena golf) .

pajonk
sumber
Saya tidak ingat apakah Excel mengizinkan lembar seperti ini, tetapi bisakah Anda menggunakan saran oleh @Uriel pada jawaban lain dan kehilangan 2 tanda kurung terakhir?
dbr
Saran itu (menghilangkan tanda kurung paling kanan) memberikan peringatan di Excel yang harus Anda konfirmasi untuk melanjutkan, jadi saya rasa itu tidak diizinkan di sini.
pajonk
Ah saya mengerti. Berbeda dengan lembaran lalu.
dbr
7

Python 2 , 94 91 73 byte

-3 byte terima kasih kepada Jonathan Allan
-18 byte terima kasih kepada tsh

s=input().strip
a=s(`3**39`);t=0
for n in a:t=t*26+ord(n)-64
print t,s(a)

Cobalah online!

Pelanggaran ini cara yang .stripbekerja, menghapus semua digit wtih a=s(`3**39`)mana `3**39`adalah cara yang lebih pendek untuk menghasilkan angka dari 0ke 9, ini akan menyimpan hanya chars pada ayang akan digunakan untuk mengupas karakter dari angka-angka padas(a)

tongkat
sumber
Saya rasa tidak perlu stripmasukan untuk menjadi karakter yang unik, jadi3**39 harus melakukan pekerjaan yang sama.
Jonathan Allan
1
73 bytes
tsh
6

Google Sheets, 43 byte

=COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A1))

Cobalah online!

A1adalah sel input. Semoga tautan di atas berfungsi, saya belum pernah mencoba kode golf dengan Google Sheets sebelumnya.

notjagan
sumber
1
@ ASAC Tidak ada alasan untuk, karena jawaban duplikat dapat hidup berdampingan.
Conor O'Brien
1
Penampilan jawaban Google Sheets dan Microsoft Excel menyenangkan saya.
dbr
5
Anda dapat melakukannya =COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A1selama 41 byte. lembar mengisi parens kanan yang hilang.
Uriel
5

JavaScript, 72 byte

x=>x.replace(/\D+/,s=>[...s].reduce((n,v)=>n*26+parseInt(v,36)-9,0)+' ')
tsh
sumber
2

Proton , 113 byte

k=>{b=(s=k.strip)('0123456789');str(sum(map((a=>26**a[1][0]*(ord(a[1][1])-64)),enumerate(b[to by-1]))))+' '+s(b)}

Cobalah online!

-19 byte meminjam algoritma Rod ( catatan untuk diri sendiri: tambahkan listcomps )

HyperNeutrino
sumber
2

Dyalog APL, 44 byte

(26⊥¯65+⎕AV⍳(a~⎕D)),⎕A~⍨a←⍞

Cobalah online!

bgiv
sumber
1
Hapus tanda kurung di sekitar (a~⎕D). Cari ⎕Aalih-alih ⎕AV. Buat diam-diam. Pertukaran argumen ,. Turun menjadi hanya 16 byte:~∘⎕A,⍨26⊥⎕A⍳~∘⎕D
Adám
1

Perl 5 , 35 + 1 (-p) = 36 byte

map$r=$r*26-64+ord,/\D/g;s/\D*/$r /

Cobalah online!

The mappernyataan memperlakukan kolom seperti nomor base26 dan bertobat itu ke desimal. Substitusi menggantikan huruf dengan angka. Input dan output tersirat dalam -pflag.

Xcali
sumber
1

Mathematica, 108 byte

StringReplace[c:LetterCharacter..~~r:DigitCharacter..:>ToString@FromDigits[ToCharacterCode@c-64,26]<>" "<>r]

Bentuk operator StringReplaceyang mengambil bagian alfabet cdari string, mengubahnya menjadi daftar kode karakter, mengurangi 64dari setiap titik kode, menginterpretasikan hasilnya sebagai 26bilangan bulat, mengonversi bilangan bulat itu menjadi String, kemudianStringJoin ruang yang diikuti oleh bagian numerikr .

Menggunakan regex (juga 108byte):

StringReplace[RegularExpression["([A-Z]+)(.+)"]:>ToString@FromDigits[ToCharacterCode@"$1"-64,26]<>" "<>"$2"]
ngenisis
sumber
1
ToCharacterCode@c-64terkadang dapat dikurangi menjadi LetterNumber@c. LetterNumbertidak membungkus output Listketika input adalah karakter tunggal.
JungHwan Min
1

Jelly ,  16  15 byte

ØAɓi@€ḟ0ḅ26,⁸Kḟ

Program lengkap yang menerima string sebagai argumen dan mencetak hasilnya

Cobalah online!

Bagaimana?

ØAɓi@€ḟ0ḅ26,⁸Kḟ - Main link: list of characters, ref  e.g. "AAC753"
ØA              - uppercase alphabet yield               = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  ɓ             - dyadic chain separation, call that B and place it on the right
   i@€          - first index for €ach (swap arguments)    [1,1,3,0,0,0]
      ḟ0        - filter discard zeros                     [1,1,3]
        ḅ26     - convert from base 26 to integer           705
            ⁸   - chain's left argument (ref)              "AAC753"
           ,    - pair                                     [705,['A','A','C','7','5','3']]
             K  - join with spaces                         [705,' ','A','A','C','7','5','3']
              ḟ - filter discard those in right (B)        [705,' ','7','5','3']
                - implicit print                        >>>705 753

Catatan: konversi dari daftar angka menggunakan atom konversi dasar memungkinkan tempat berada di luar rentang yang diharapkan, jadi konversi dari, katakanlah, [2,26,1]( "BZA") menggunakan ḅ26dihitung sebagai 2 × 26 2 + 26 × 26 1 + 1 × 26 0 = 2029 meskipun representasi "yang diharapkan" seharusnya [3,0,1].

Jonathan Allan
sumber
2
@Dean Brunt Tidak biasanya menerima jawaban begitu cepat (sebagian besar meninggalkannya seminggu) - itu bisa membuat orang lain tidak berkompetisi. Saya tidak akan terkejut melihat ini dikalahkan oleh 05AB1E atau bahasa golf lainnya ...
Jonathan Allan
Poin yang diambil. Masih belajar dengan cara saya
dbr
Tidak masalah! Selamat datang di PPCG, & posting pertama yang bagus :)
Jonathan Allan
1

Mathematica, 77 72 69 68 byte

#/.{a__,b__?DigitQ}:>{f=FromDigits;f[LetterNumber@{a},26],f[b<>""]}&

Mengambil daftar karakter.

Cobalah di Wolfram Sandbox

Pemakaian

#/.{a__,b__?DigitQ}:>{f=FromDigits;f[LetterNumber@{a},26],f[b<>""]}&[{"G", "L", "9", "3"}]

{194, 93}

atau

#/.{a__,b__?DigitQ}:>{f=FromDigits;f[LetterNumber@{a},26],f[b<>""]}&[Characters["GL93"]]

{194, 93}

Penjelasan

#/.

Di input ganti ...

{a__,b__?DigitQ}

Daftar yang berisi dua urutan adan b(dengan 1 atau lebih elemen), di mana hanya bterdiri dari karakter digit saja ... (Mathematica menggunakan pencocokan pola yang malas, jadi tidak diperlukan pemeriksaan untuk a)

:>

ke...

f=FromDigits;

Setel fke fungsi konversi digit-ke-integer.

LetterNumber@{a}

Konversikan ake angka huruf (a -> 1, b -> 2, dll).

{f[ ... ,26],f[b<>""]}

Konversi di atas dari basis-26 ke desimal, dan konversi bke desimal.

JungHwan Min
sumber
1

Haskell, 67 byte

(\(l,n)->show(foldl(\a->(a*26-64+).fromEnum)0l)++" "++n).span(>'9')

Cobalah online.

Cristian Lupascu
sumber
1

Retina , 85 byte

[A-Z]
$& 
[T-Z]
2$&
[J-S]
1$&
T`_L`ddd
\d+
$*
{`\G1(?=.* .* )
26$*
}` (.* )
$1
1+
$.&

Cobalah online! Penjelasan:

[A-Z]
$& 

Pisahkan surat dari satu sama lain dan nomor terakhir.

[T-Z]
2$&
[J-S]
1$&
T`_L`ddd

Ubah huruf menjadi desimal.

\d+
$*

Konversikan semuanya menjadi unary.

{`\G1(?=.* .* )
26$*
}` (.* )
$1

Meskipun setidaknya ada tiga angka, kalikan yang pertama dengan 26 dan tambahkan ke yang kedua.

1+
$.&

Konversikan semuanya menjadi desimal.

Neil
sumber
1

Ruby , 50 48 + 1 = 51 49 byte

Menggunakan -pbendera. -2 byte dari m-chrzan.

sub(/\D+/){i=0;$&.bytes{|b|i=26*i+b-64};"#{i} "}

Cobalah online!

Nilai Tinta
sumber
i=i*26+b-64menghemat 2 byte.
m-chrzan
1

> <>, 42 Bytes

0i88*-:0(?\$2d**+!
$n88*+48*o\
oi:0(?;   >

Cobalah secara Online

Penjelasan:

0i88*-:0(?\$2d**+! Read in the Letters part of the input
0                  Push an initial 0 to the stack
 i                 Read a character of input
  88*-             Subtract 64 to get from the ascii code to its value ('A'=1,'B'=2 etc.)
      :0(?\        If the value is less than 0, break out of this loop
           $2d**   Multiply our accumulator by 26
                +  Add our new number to the accumulator
                 ! don't add a new zero to the stack

Loop di atas akan membaca angka pertama dari bagian bilangan (mis. '3' dalam "AB34") sebelum putus, dan akan sudah dikurangi 64 dari itu, jadi bit kode berikutnya harus berurusan dengan itu

$n88*+48*o\        Output a space, and prepare to output the first number we read in during the previous loop
          \        Loop round to the left end of this line
$n                 Output the value of the letters part as a number
  88*+             Add the 64 we subtracted from the first number
      48*o         Output a space
          \        Enter the next loop

Loop ini dimulai dengan mengeluarkan karakter yang akan menjadi karakter pertama yang dibaca oleh loop pertama, atau karakter yang dibaca oleh iterasi sebelumnya dari loop ini.

oi:0(?;   >        Output the numbers part, by just echoing it
          >        Loop round to the start of the line
o                  Output the character
 i                 Read in the next character
  :0(?;            If the value read in was less than 0, terminate
Sasha
sumber
1

Rubi, 64 61 59 byte

->s{s.sub(/\D+/){"#{$&.bytes.reduce(0){|t,b|t*26+b-64}} "}}

Disimpan 2 byte berkat Value Ink.

m-chrzan
sumber
1
$&adalah pertandingan regex terakhir, jadi gunakan itu bukan muntuk menyimpan 2 byte.
Nilai Tinta
1

Jendela langsung Excel-VBA, 44 45 Bytes ( 36 35)

Set v=Range([A1]):?trim(v.Column &" "&v.Row);

1 byte ditambahkan untuk menekan baris baru


Atau untuk 35 dengan spasi putih terkemuka

Set v=Range([A1]):?v.Column""&v.Row

1 byte disimpan berkat @TaylorScott!

Keduanya mengambil input dari sel A1, output ke jendela VBE Immediate

Greedo
sumber
1
Saya akan melanjutkan dan mengatakan bahwa jawaban spasi putih terkemuka adalah respons yang valid karena harus menghapusnya akan memaksa penggunaan Trim()pada hampir semua jawaban numerik - dan pada itu saya tidak akan menggunakan Set v=Range([A1]):?v.Column""&v.Rowsolusi Anda saat ini
Taylor Scott
juga, sial, aku tidak percaya aku melewatkan pertanyaan ini ketika keluar!
Taylor Scott
@TaylorScott Oh trik bagus menggunakan "" - Saya kira Excel tahu untuk menyisipkan ;ketika karakter berikut Columntidak dapat menjadi bagian dari nama rutin. Saya ingin tahu apakah ada satu karakter yang dapat melakukan hal yang sama, mungkin tidak. Ya, saya akan menduga bahwa ruang terdepan akan dapat diterima untuk sebagian besar qus, tetapi untuk yang satu ini saya pikir ini lebih merupakan "Cetak string yang tepat ini ". Saya memang bertanya (komentar terakhir pada pertanyaan) dan diberitahu tidak ada spasi atau baris baru.
Greedo
1
juga, ketika saya melihat judul pertanyaan, saya segera tahu saya harus pergi jika Anda atau orang lain belum melakukannya! Seperti jawaban berbasis Excel lainnya mengatakan, alat yang tepat untuk pekerjaan itu .
Greedo
1

Lua, 127 Bytes

Beberapa manipulasi string bagus terjadi di sana, saya menggunakan beberapa fungsi yang biasanya tidak pernah digunakan saat bermain golf di lua: D. Cara terbaik untuk bermain golf ini adalah dengan menemukan cara lain untuk beralih pada bagian kolom dari input sambil tetap mempertahankan posisi setiap huruf. Saya tidak ^^ '.

Cobalah online!

I=...l=I:gsub("%d",""):reverse()r=0
for i=1,#l
do
r=r+(l:sub(i,i):byte()-64)*math.pow(26,i-1)end
print(r.." "..I:gsub("%a",""))

Penjelasan

I=...                       -- shorthand for the input
l=I:gsub("%d","")           -- shorthand for the column part
   :reverse()               -- letters are put in reverse order to calculate their weight
r=0                         -- column number
for i=1,#l                  -- iterate over the letters of the input
do
  r=r+                      -- add to the column number
      (l:sub(i,i):byte()-64)-- the byte value of the current letter minus 64 (A=1 this way)
      *math.pow(26,i-1)     -- then apply its weight in base 26
end
print(r                     -- output the column number
        .." "               -- a space
        ..I:gsub("%a",""))  -- and the row number
Katenkyo
sumber