Перерахуйте позначення клітини


16

Таким чином, ми всі, маємо надію, знайомі з позначеннями комірок електронної таблиці "А1".

Це просто буквено-цифрове зображення розташування зазначеної комірки в сітці. Букви (и) представляють позицію стовпчика комірки, а число - рядок.

Частина "літер" може складатися з 1 або більше літер англійського алфавіту з 26 літер, всі вони повинні бути великими літерами. Ці карти відбиваються на числа за допомогою використання 26-адичної біективної нумерації. Частина 'число' може складатися з будь-якого додатного, ненульового цілого числа.


Завдання, написати програму, яка дала позначення А1 будь-якої комірки як єдину рядок, може вивести рядок, що містить позицію стовпця, представлену як число, а потім пробіл, а потім номер рядка.

Приклади введення / виводу нижче:

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

Це мій перший виклик, отже, відносна простота та потенційна бідність критеріїв.

EDIT : Рядок повинен бути літерами з цифрами, а критерій виграшу - найкоротша довжина коду (якщо це може бути річ)

EDIT : Пов’язано з цим, але робить зворотний процес з іншим стартовим індексом. Деякі можуть стверджувати, що цей факт робить пов'язану головоломку цікавішою.


Чи можемо ми прийняти введення як, наприклад, масив, що містить літери та цифри:["A", "1"]
Stephen

1
@StepHen Ні. Це повинен бути один рядок, що містить і букви, і цифри. Я, мабуть, повинен додати також, що рядок ОБОВ'ЯЗКОВО повинен бути в порядку літер з цифрами.
1717

1
Зазвичай ми дозволяємо гнучкіші формати введення та виведення, наприклад, вибираючи нову лінію замість місця як провідник
Луїс Мендо

3
@DeanBrunt Це залежить від вас, і, звичайно, ви можете застосувати суворий формат, щоб ускладнити виклик. Але зазвичай люди відчувають складність у власних обчисленнях більше, ніж у форматі
Луїс Мендо

4
Це тому, що форматування не додає жодної цінності самому виклику
Аднан

Відповіді:



20

Microsoft Excel, 43 байти.

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

Я не міг собі допомогти, мені просто довелося використовувати правильний інструмент для роботи. Здійснює введення на А1.

Випробування


11

Microsoft Excel, 40 байт

Бразильська версія португальської мови.

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

Перекладена (а отже і гольф) версія рішення ATaco .


Я не можу пригадати, чи дозволяє у програмі Excel подібні аркуші, але чи можете ви скористатись пропозицією @Uriel щодо іншої відповіді та втратити останні два дужки?
грудня

Ця пропозиція (опускаючи кращі дужки з правою дужкою) наводить попередження в Excel про те, що вам потрібно підтвердити, щоб продовжити, тому я не думаю, що це дозволено тут.
pajonk

А, бачу. Тоді листи простими.
грудень

7

Python 2 , 94 91 73 байт

-3 байти завдяки Джонатану Аллану
-18 байт завдяки tsh

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

Спробуйте в Інтернеті!

Це зловживає способом .stripроботи, видаляючи всі цифри, a=s(`3**39`)де `3**39`лише коротший спосіб генерувати цифри від 0до 9, це зберігатиме лише символи, aякі будуть використані для вилучення знаків із чисел наs(a)


Я не думаю, що немає необхідності, щоб stripвведення даних було унікальними персонажами, тому 3**39слід робити ту саму роботу.
Джонатан Аллан


6

Google Таблиці, 43 байти

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

Спробуйте в Інтернеті!

A1є вхідною коміркою. Сподіваємось, що вищезазначене посилання працює, я ніколи раніше не пробував кодовий гольф із Google Sheets.


1
@ATaco Причин для цього немає, оскільки дублюючі відповіді можуть співіснувати.
Conor O'Brien

1
Поява Google Таблиць та відповідей Microsoft Excel мене радує.
1717

5
можна зробити =COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A1за 41 байт. простирадла заповнюють пропущені праві парени.
Уріель

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 і перетворює його в десяткове. Заміна замінює літери цифрами. Вхід і вихід неявні у -pпрапорі.


1

Математика, 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якщо вхід є одним символом.
JungHwan Min

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") за допомогою ḅ26обчислюється як 2 × 26 2 + 26 × 26 1 + 1 × 26 0 = 2029 р., Хоч "очікуване" представництво було б [3,0,1].


2
@Dean Brunt Не зазвичай прийняти відповідь так швидко (більшість залишає її на тиждень) - це може відштовхнути інших від змагань. Я не був би здивований, побачивши цього побитого 05AB1E чи іншою мовою для гольфу ...
Джонатан Аллан

Точка взята. Я все-таки навчаюсь свого шляху
1717

Без проблем! Ласкаво просимо в PPCG, і приємний перший пост :)
Джонатан Аллан

1

Математика, 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}

Список, що містить дві послідовності aта b(з 1 або більше елементами), де bскладається лише з цифр ... (Mathematica використовує лінивий збіг шаблонів, тому перевірка не потрібна a)

:>

в ...

f=FromDigits;

Встановіть fфункцію перетворення цифр у ціле число.

LetterNumber@{a}

Перетворити aна літерні номери (a -> 1, b -> 2 тощо).

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

Перетворіть вищезгадане з базової-26 у десяткову та перетворіть bу десяткову.



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

Перетворіть літери в десяткові.

\d+
$*

Перетворіть все в одинакове.

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

Поки є щонайменше три числа, помножте перше на 26 і додайте його до другого.

1+
$.&

Перетворити все в десятковий.



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

Вищенаведений цикл буде прочитати в першому номері частини чисел (наприклад, "3" в "AB34") перед розбиттям і вже відніме 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

Рубі, 64 61 59 байт

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

Збережено 2 байти завдяки Ink Value Ink.


1
$&є останнім збігом регулярних виразів, тому використовуйте його замість того, mщоб зберегти 2 байти.
Значення чорнила

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

1 байт збережено завдяки @TaylorScott!

Обидва беруть вхід з комірки A1, виводять у вікно негайного VBE


1
Я збираюся йти далі і скажу, що відповідь провідного пробілу є коректною відповіддю, оскільки його видалення змусить використовувати Trim()майже всі числові відповіді - і на те, що не я би перейшов до Set v=Range([A1]):?v.Column""&v.Rowвашого поточного рішення
Тейлор Скотт

також, чорт, я не можу повірити, що я пропустив це питання, коли воно з'явилося!
Тейлор Скотт

@TaylorScott О, приємний трюк із використанням "" - я думаю, що Excel знає вставити те, ;коли наступний символ Columnне може бути частиною назви рутини. Цікаво, чи є один персонаж, який міг би зробити те саме, напевно, ні. Так, я б здогадався, що провідний простір буде прийнятним для більшості qus, але для цього я думаю, що це більше "Друк цього точного рядка". Я запитав (останній коментар до питання) і мені сказали не провідний пробіл чи новий рядок.
Greedo

1
також, побачивши заголовок питання, я одразу зрозумів, що мені слід піти, якщо ви чи хтось ще не зробив цього! Як говорять інші відповіді на основі Excel, правильний інструмент для роботи .
Greedo

1

Луа, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.