セル表記を列挙する


16

したがって、スプレッドシートの「A1」セル表記に慣れ親しんでいることを願っています。

これは、グリッド内のセルの位置の英数字表現です。文字はセルの列の位置を表し、数字は行を表します。

「文字」部分は、26文字の英字アルファベットの1文字以上で構成できます。これらはすべて大文字でなければなりません。これらは、26進全単射記数法を使用して数値にマッピングされます。「数値」部分は、ゼロ以外の正の整数で構成できます。


チャレンジは、任意のセルのA1表記を単一の文字列として指定するプログラムを作成し、数値として表される列位置、その後にスペース、次に行番号を含む文字列を出力できます。

以下のサンプル入出力:

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

これが私の最初の課題です。したがって、基準の相対的な単純さと潜在的な欠陥です。

編集:文字列は数字に続く数字でなければならず、勝ちの基準は最短のコード長です(それが問題になる可能性がある場合)

編集これに関連しますが、異なる開始インデックスで逆のプロセスを行います。この事実がリンクされたパズルをより面白くすると主張する人もいるかもしれません。


私たちは、例えば、などの入力を取ることができ、文字と数字を含む配列:["A", "1"]
スティーブン・

1
@StepHenいいえ。文字と数字の両方を含む単一の文字列である必要があります。また、おそらく、文字列は文字の後に数字が続く順序でなければならないことを追加する必要があります。
dbr

1
通常、出力セパレーターとしてスペースの代わりに改行を選択するなど、より柔軟な入力および出力形式を許可します
ルイスメンドー

3
@DeanBruntそれはあなた次第ですが、もちろん挑戦をより難しくするために厳密なフォーマットを強制することができます。しかし、人々は通常、形式よりも実際の計算の難しさを楽しんでいます
ルイスメンドー

4
フォーマットが実際のチャレンジ自体に値を追加しないためです
アドナン

回答:



20

Microsoft Excel、43バイト。

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

私は自分自身を助けることができなかった、私はちょうど仕事に適切なツールを使用する必要がありました。A1で入力を受け取ります。

テストケース


11

Microsoft Excel、40バイト

ブラジルのポルトガル語版。

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

ATacoのソリューションの翻訳版(したがってゴルフ版)。


Excelでこれがシートのように許可されているかどうかは思い出せませんが、別の回答で@Urielの提案を使用して、最後の2つの括弧を失うことはできますか?
-dbr

その提案(右端の括弧を省略する)は、続行するために確認する必要があるという警告をExcelでスローするため、ここでは許可されていないと思います。
パジョンク

ああ、分かった。その場合、シートとは異なります。
DBR

7

パイソン294の 91 73バイト

Jonathan Allanのおかげで-3バイト
tshのおかげで-18バイト

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

オンラインでお試しください!

この侵害する方法.stripのすべての数字を削除する作品は、wtih a=s(`3**39`)どこ`3**39`から数字を生成するだけの短い方法です09、これは上の唯一の文字格納するaことが上の数字から文字を除去するために使用されますs(a)


stripの入力を一意の文字にする必要はないと思うので3**39、同じ仕事をする必要があります。
ジョナサンアラン


6

Googleスプレッドシート、43バイト

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

オンラインでお試しください!

A1入力セルです。上記のリンクがうまくいけば、Googleスプレッドシートでコードゴルフを試したことはありません。


1
@ATaco重複した回答が共存する可能性があるため、理由はありません。
コナーオブライエン

1
GoogleスプレッドシートとMicrosoft Excelの回答の外観は私を喜ばせます。
-dbr

5
=COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A141バイトでできます。シートは行方不明の右括弧を埋めます。
ウリエル

5

JavaScript、72バイト

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




1

Perl 5、35 + 1(-p)= 36バイト

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

オンラインでお試しください!

このmapステートメントは、列をbase26数値のように扱い、それを10進数に変換します。置換により、文字が数字に置き換えられます。入力と出力は-pフラグに暗黙的に含まれます。


1

Mathematica、108バイト

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

演算子形式は、文字列のStringReplaceアルファベット部分を受け取り、c文字コードのリストに変換し、64各コードポイントから減算し、結果を基本26整数として解釈し、その整数をaに変換しString、次にStringJoinスペースに数値部が続きますr

正規表現を使用(108バイトも):

StringReplace[RegularExpression["([A-Z]+)(.+)"]:>ToString@FromDigits[ToCharacterCode@"$1"-64,26]<>" "<>"$2"]

1
ToCharacterCode@c-64時々に減らすことができLetterNumber@cます。ただし、入力が単一文字の場合LetterNumber、出力をラップしませんList
ジョンファンミン

1

ゼリー 16  15 バイト

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

文字列を引数として受け入れ、結果を出力する完全なプログラム

オンラインでお試しください!

どうやって?

Ø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

注:ベース変換アトムを使用した数値のリストからの変換では、場所が予想範囲外になる可能性があるため、たとえば[2,26,1]"BZA")からの変換 ḅ262×26 2 + 26×26 1 + 1×26 0 =「予想される」表現がそうであったとしても、2029年[3,0,1]


2
@Dean Brunt回答をすぐに受け入れることは通常ありません(ほとんどの場合は1週間のままにします)。05AB1Eや他のゴルフ言語にlanguageられているのを見て驚かないだろう…
ジョナサンアラン

要点。まだ私の道を学んでいる
-dbr

問題ない!PPCGへようこそ、最初の投稿:)
ジョナサンアラン

1

Mathematica、77 72 69 68バイト

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

文字のリストを受け取ります。

Wolfram Sandboxで試してみてください

使用法

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

{194, 93}

または

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

{194, 93}

説明

#/.

入力置換で...

{a__,b__?DigitQ}

2つのシーケンスab(1つ以上の要素を含む)を含むリスト。ここでbは数字のみで構成されています...(Mathematicaは遅延パターンマッチングを使用するため、チェックは不要ですa

:>

に...

f=FromDigits;

セットする f数字から整数への変換関数にします。

LetterNumber@{a}

変換する a文字番号にします( > 1、b-> 2など)。

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

上記をbase-26から10進数に変換bし、10進数に変換します。



1

網膜、85バイト

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

オンラインでお試しください!説明:

[A-Z]
$& 

文字を互いに分離し、最後の数字にします。

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

文字を10進数に変換します。

\d+
$*

すべてを単項に変換します。

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

少なくとも3つの数値がありますが、最初の数値に26を掛けて、2番目の数値に加算します。

1+
$.&

すべてを10進数に変換します。



1

> <>、42バイト

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

オンラインで試す

説明:

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

上記のループは、ブレークする前に数字部分の最初の数字(たとえば「AB34」の「3」)を読み込み、すでに64を減算しているので、コードの次のビットはそれを処理する必要があります

$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

このループは、最初のループで読み込まれた最初の文字、またはこのループの前回の繰り返しで読み込まれた文字のいずれかになる文字を出力することから始まります。

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

1

Ruby、64 61 59バイト

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

Value Inkのおかげで2バイト節約されました。


1
$&最後の正規表現の一致であるため、m2バイトを節約する代わりに使用します。
バリューインク

1

Excel-VBAイミディエイトウィンドウ、44 45バイト(36 35)

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

末尾の改行を抑制するために1バイトが追加されました


または、先頭に空白を含む35

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

@TaylorScottのおかげで1バイト節約できました!

どちらもセルA1から入力を受け取り、VBEイミディエイトウィンドウに出力します


1
私は先に行くと、先頭の空白の答えは、それはの使用を強制する削除することとして有効な応答であることを言うつもりTrim()はほぼすべての数値回答には-そしてその上で私は行くだろうではないSet v=Range([A1]):?v.Column""&v.Rowあなたの現在のソリューションの上に
テイラー・スコット・

また、この質問が出たときに見逃したとは信じられません!
テイラースコット

@TaylorScott ""を使用したすてきなトリック- ;次の文字Columnがルーチン名の一部にならない場合、Excelが挿入することを知っていると思います。おそらくそうではないかもしれませんが、同じことをすることができるキャラクターが1人いるのだろうか。はい、先頭のスペースはほとんどのqusで許容されると推測していましたが、これについては、「この正確な文字列を印刷する」と思います。私は尋ねました(質問に対する最後のコメント)。先頭のスペース改行はありません。
グリード

1
また、質問のタイトルを見たとき、あなたや他の誰かがまだ行っていないならすぐに行くべきだと思いました!他のExcelベースの回答が言うように、仕事に最適なツールです
グリード

1

Lua、127バイト

そこに行くいくつかの素敵な文字列操作、私はルアでゴルフをしている間、通常は決して使用されない機能を使用しています:D。ゴルフをするための最良の方法は、各文字の位置を保持しながら、入力の列部分を反復処理する別の方法を見つけることです。しませんでした^^ '。

オンラインでお試しください!

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",""))

説明

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.