素朴な挑戦


16

この課題は、オリバーサックスの次の引用に触発されています。

「11歳のとき、「私はナトリウムです」と言うことができました(要素11)。現在79歳のとき、私は金です。」-オリバーサックス

文字列で数字を見つけて、対応する要素の記号に置き換えてほしい。(1はH、2はHe、3はLiなど)。従うべきいくつかのルールがあります。

  • 通常、1桁と2桁は対応する要素に置き換えられます。数字の先頭の0は無視します。数字に0しかない場合は、無視してください。例えば、1 01 10 0 00となりH H Ne 0 00
  • 2桁を超える数字は、2つのグループに分けられます。奇数桁の場合、末尾に余分な1桁が必要です。例えば、0153 5301 153なるHI IH PLiこの規則の、あなただけの1から99までの要素を知っている必要がありますので
  • 数字は、それらを囲む文字に関係なく同じように扱われ、コンマと小数点は数字の一部ではありません。P90X 42,800 3.14159になるだろうPThX Mo,Hg0 Li.SiPF

入力/出力の例(I / O):

I: 32289216
O: GeNiUS

I: J08017 5811
O: JOHN CeNa

I: M18227 0592tt10r
O: MArTiN BUttNer

I: De072816
O: DeNNiS

I: D088r1907085
O: DOOrKNOB

I: 13ex A.
O: Alex A.

入力は、言語の文字列に最も近い形式になります。

参考のための周期表:

これはであるため、プログラムはバイト単位で記録されます。


17
ジョンシナはPPCGのモデレーターですか?;-)
レベルリバーセント

5
私たちの新しい司会者ジョン・シナのに暖かい歓迎を与えてください鳴り響く開始音楽やairhorns
spaghetto

instantcena.com
DanTheMan

回答:


7

Mathematica、96 94 89バイト

StringReplace[#,n:DigitCharacter~Repeated~2/;(d=FromDigits@n)>0:>d~ElementData~"Symbol"]&

Mmaには複数のデータセットがあります...


もちろん、組み込みのデータセットは139バイトの圧縮文字列に勝ります。;)
ETHproductions

@ETHproductionsこれが9時間の最短回答だったことに驚いた。通常、この場所はCJamとPythのために予約されています:D
LegionMammal978

さて、見てみましょう:89バイトを超えるには、必要な184文字のアルファベットを超圧縮し、それをデコードするプログラムを作成する必要があります(89バイト未満)(非常に可能性は低い)、または-適切な要素のデータセット(CJamまたはPythのいずれでもない)。したがって、これが勝者になる可能性があります。
ETHproductions

3

JavaScript(ES6)、202バイト

x=>x.replace(/\d\d?/g,y=>+y?btoa`(139 bytes; see hexdump below)`.match(/[A-Z][a-z]?/g)[+y]:y)

省略された文字列には印刷できない文字が含まれているため、ここに(できれば元に戻せる)hexdumpがあります。

00000000: 0071 de2e 205e 0423 4e14 d78d 68c8 0095 288f  .qÞ. ^.#N.×.hÈ..(.
00000012: 4829 40ac a09a 49c4 e254 2acc 9c57 82a0 d882  H)@¬ .IÄâT*Ì.W. Ø.
00000024: b999 c668 6780 b127 81ac aad1 6d2a d866 b35b  ¹.Æhg.±'.¬ªÑm*Øf³[
00000036: 3284 dc46 e461 3dd0 2009 d227 4a74 9b4d e217  2.ÜFäa=Ð .Ò'Jt.Mâ.
00000048: 782b 0168 b682 78fa cd74 f992 984b 8675 36c3  x+.h¶.xúÍtù..K.u6Ã
0000005a: c87a 04ad 3998 6cbb 877d 3696 45e3 ac22 b3ed  Èz..­9.l».}6.Eã¬"³í
0000006c: 02e1 e04e 53db 0623 e802 d467 16b4 5a01 c4e1  .áàNSÛ.#è.Ôg.´Z.Äá
0000007e: 3da5 0da4 fb80 9829 8190 27c4 b0              =¥.¤û..)..'Ä°

ここでのテクニックは、すべての要素の省略形を1つの文字列に入れ、何も区切らないこと/[A-Z][a-z]?/gでした。これが2番目の正規表現の目的です。各大文字と一致し、オプションで小文字が続きます。最初の正規表現/\d\d?/gは、入力の2桁(または1桁)の各セットに一致するため、これは、数字Nの各セットを、圧縮解除され一致した文字列のインデックスNの要素に置き換えます。

他の誰かがそれを使用したい場合、元の文字列は次のとおりです:(A末尾の 'はフィラーです)

AHHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaUNpPuAmCmBkCfEsA

質問や提案を歓迎します!


1
何についてUusUuo
コナーオブライエン

3
@CᴏɴᴏʀO'Bʀɪᴇɴ-質問は要素99までしか必要とせず、これはEinsteinium(Es)であるため、未確認の要素(したがって、最終的な名前がなく、3文字で記述されている)はまったく考慮されません。
グレンO

いいね +y?...:...桁グループを置き換えるため、チェックは必要ないと思います
-edc65

@ edc65ありがとう。ルールの1つは、入力内の00を変更する必要がないため、チェックが必要なことです。
ETHproductions

わかりました。それでも、1バイトの[y]代わりに使用[+y]して保存できます
-edc65

1

Python 3、 278 285バイト

import re;f=lambda a:re.sub('(?!00)\d\d?',lambda m:'0HHLBBCNOFNNMASPSCAKCSTVCMFCNCZGGASBKRSYZNMTRRPACISSTIXCBLCPNPSEGTDHETYLHTWROIPAHTPBPARFRATPUNPACBCE  eie     eagli  lr aci rneoiunaeserrbr rbocuhdgdnnbe esaaerdmmudbyormbufa esrtuglbiotnracha pummkfs'[int(m.group())::100].strip(),a)

テストケース:

>>> f('32289216')
'GeNiUS'
>>> f('J08017 5811')
'JOHN CeNa'
>>> f('M18227 0592tt10r')
'MArTiN BUttNer'
>>> f('De072816')
'DeNNiS'
>>> f('D088r1907085')
'DOOrKNOB'
>>> f('13ex A.')
'Alex A.'
>>> f('P90X 42,800 3.14159')
'PThX Mo,Hg0 Li.SiPF'
>>> f('1 01 10 0 00')
'H H Ne 0 00'

f('P90X 42,800 3.14159')戻り'PThXのMo、HGS Li.SiPF'の代わりに'PThXのMo、HG0 Li.SiPF'f('1 01 10 0 00')戻り'HH数NeのS'の代わりに'HH数Ne 0 00'。ちなみに、Python 2ソリューションでは、拡張スライシングアプローチを使用しました。ありがとう!
cr3

@ cr3:0と00を修正しました
。-ケニー

素敵な、あなたは私を19バイトで打ちました!
cr3

0

Python 2、312 304バイト

import re
f=lambda a:''.join([j or'0HHLBBCNOFNNMASPSCAKCSTVCMFCNCZGGASBKRSYZNMTRRPACISSTIXCBLCPNPSEGTDHETYLHTWROIPAHTPBPARFRATPUNPACBCE0 eie     eagli  lr aci rneoiunaeserrbr rbocuhdgdnnbe esaaerdmmudbyormbufa esrtuglbiotnracha pummkfs'[int(i)::100].strip() for i,j in re.findall('(\d\d|[1-9])|(.)',a)])

これは、引数として数字の文字列を取り、要素記号が置換された対応する文字列を返す関数fを作成します。

この関数は、1から2桁の文字列('1''01''10''00'である'0'ではない)または1文字('a''0'である'1'ではない)の文字列を反復します。数字の場合、文字列は整数に変換され、要素記号の連結文字列で検索され、各記号は2文字に埋め込まれます。文字の場合、文字列はルックアップなしで単純に使用されます。

質問の各例のテストはすべて合格です:

assert f('P90X 42,800 3.14159') == 'PThX Mo,Hg0 Li.SiPF'
assert f('1 01 10 0 00') == 'H H Ne 0 00'
assert f('0153 5301 153') == 'HI IH PLi'
assert f('32289216') == 'GeNiUS'
assert f('J08017 5811') == 'JOHN CeNa'
assert f('M18227 0592tt10r') == 'MArTiN BUttNer'
assert f('De072816') == 'DeNNiS'
assert f('D088r1907085') == 'DOOrKNOB'
assert f('13ex A.') == 'Alex A.'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.