英数字のラインとカーブのカウント


10

入力文字列が与えられたら、それが持っている線と曲線の総数を出力するプログラムを書きます。

チャレンジ

  • STDIN、またはその他の入力メソッドから入力を受け取ります。
  • 出力STDOUT、または任意の他の出力方法、直線と曲線の総数は、文字列に含まれるこの順序でコードスニペットに、以下の表に基づいて、。
  • 英数字以外の文字は無視してください。
  • 標準の抜け穴は禁止されています。
  • これはなので、最短のコードが優先されます。

明確化

  • 線と曲線は、Stackexchange forで使用されるフォントによって決まりcode blocksます。
  • 円(のようなO, o, 0)と点(i, j)は、それぞれ1つの曲線と見なされます。
  • 文字列、文字のリスト、文字のストリーム、バイトコードなどを入力できます。
  • 出力は、整数の配列などの整数、カンマ区切りの文字列のタプルことができ、二つの数が別々でなければならないので、104有効ではありません、しかし10,410 410\n4[10,4](10, 4)、などです。
  • 見出しと末尾の空白は完全に許容されます。

入力と出力の例

# Format: str -> line, curve
hi -> 4, 2
HELLO WORLD -> 20, 4
l33+ 5pEak -> 13, 8
+=-_!...?~`g@#$%^ -> 1, 2
9001 -> 5, 3
O o O o O o -> 0, 6

キャラクターテーブル

Char | Lines | Curves
0    | 1     | 1
1    | 3     | 0
2    | 1     | 1
3    | 0     | 2
4    | 3     | 0
5    | 2     | 1
6    | 0     | 1
7    | 2     | 0
8    | 0     | 2
9    | 0     | 1
A    | 3     | 0
B    | 1     | 2
C    | 0     | 1
D    | 1     | 1
E    | 4     | 0
F    | 3     | 0
G    | 2     | 1
H    | 3     | 0
I    | 3     | 0
J    | 1     | 1
K    | 3     | 0
L    | 2     | 0
M    | 4     | 0
N    | 3     | 0
O    | 0     | 1
P    | 1     | 1
Q    | 0     | 2
R    | 2     | 1
S    | 0     | 1
T    | 2     | 0
U    | 0     | 1
V    | 2     | 0
W    | 4     | 0
X    | 4     | 0
Y    | 3     | 0
Z    | 3     | 0
a    | 0     | 2
b    | 1     | 1
c    | 0     | 1
d    | 1     | 1
e    | 1     | 1
f    | 1     | 1
g    | 1     | 2
h    | 1     | 1
i    | 3     | 1
j    | 1     | 2
k    | 3     | 0
l    | 3     | 0
m    | 3     | 2
n    | 2     | 1
o    | 0     | 1
p    | 1     | 1
q    | 1     | 1
r    | 1     | 1
s    | 0     | 1
t    | 1     | 1
u    | 1     | 1
v    | 2     | 0
w    | 4     | 0
x    | 4     | 0
y    | 1     | 1
z    | 3     | 0

2
何が線と曲線として数えられますか?あるs2つのカーブや1?茎はj直線と曲線の両方にありますか?すべての文字に必要な値をリストするだけでよいです。
アドホックガーフハンター

4
私はこれに対する反対票を本当に理解していません。私にとって、これは明確な課題であり、適切なテストケース、参照実装、および期待される値の表です(それらが技術的に正しいか、磨耗しているかは個人的な意見の問題ですが、課題とは関係ありません)。出力は柔軟です。誰かがこれで何が悪いのかを説明できれば、私は最も感謝します。
ElPedro

3
各文字の値を、より簡単にコピーできる形式で提供していただけますか。スニペットは完全に不要です。
シャギー

4
o0ライン、1カーブである必要があります
ジュゼッペ

2
上からの続き...フィードバックがないダウン投票は、OPに将来の課題を改善する機会をほとんど与えません。
ElPedro

回答:


8

Haskell、214 199 188 175バイト

 g 0=[]
 g n=mod n 5:g(div n 5)
 d#s=sum[n|c<-d,(i,n)<-zip['0'..]$g s,c==i]
 f s=(s#0x300BBD37F30B5C234DE4A308D077AC8EF7FB328355A6,s#0x2D5E73A8E3D345386593A829D63104FED5552D080CA)

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

直線と曲線の数は、基数5の数字であり、基数16の数値として格納されます。関数はgbase-5に変換されます。

編集:@coleのおかげで-13バイト。


1
文字コードのリストを取得できる場合は169バイト。これを文字列バリアントに移植する方法を探っていきます…
cole

1
文字列を使用する必要がある場合は175バイト(ささいな3バイトをオフにしてから以前のコメントを削除しました)。
cole

@cole:改善に感謝します。チャレンジは「文字列」としてタグ付けされているため、整数のリストを使用するのは不正行為のようです。一方、ルールでは「バイトコード」を有効な入力形式として許可しています。ただし、他の多くの回答でも、ある種のchar-> integer変換を使用しています。何をすべきかわからない。
nimi

6

05AB1E78 69 65バイト

-4バイト、Kevin Cruijssenのおかげで、Goと05AB1Eのさらに優れた回答を確認しください。

žKÃÇ48-©•7ć_qýÊΣŸßαŽ_ì¡vFÛ–ÄÔ™”súyån!₁ζB?òrβÂ@µk₆¼×¬°•5в2ä`®èrè‚O

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

[Curve、Line]として出力

たった今見つけた05AB1Eは本当に下手です。èリストのリスト全体で05AB1Eを実行できれば、間違いなくより多くのバイトを節約できます


説明

žKÃ                                    #Filter out non alpha-nums
    Ç48-                               #Convert to ascii and subtract 48 so "0" is 0 etc.
        ©                              #Store that for later
          •...•5в                      #De-compress compressed list 
                 2ä                    #Split into 2 chunks (lines + curves)
                   `                   #Separate them onto the stack 
                    ®                  #Get the value that we stored 
                     èrè               #Apply indexing to both lists
                        ‚              #Put our indexed values back into a list
                         O             #Sum our lists

1
出力が逆になります。それはそうline curveであるべきではありませんcurve line
bigyihsuan

1
出力が2つの数字が別々でなければならないなど整数の配列、整数のタプル、カンマ区切りの文字列、することができ、彼らは別のものです@bigyihsuan、私は問題が何であるかが表示されない
期限切れデータ

1
ルールは言うOutput to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order。注意in that orderので、line curve
bigyihsuan

2
これについては@ExpiredDataに同意します。おそらくチャレンジで、回答に順序を明記する必要があることを明記してください。それで十分です。
ElPedro

1
53バイト[Line, Curve]出力順序として。ただし、これは偶然で意図的なものではありません)。
Kevin Cruijssen

5

ゼリー、45 バイト

ØBċþSḋ“yƘ.ṪñF[)µṡṭɗḌyė$Ṫk“¢⁶KɱzV$QḂḥỵṙu’b5,3¤

(2つの)整数のリストを生成する文字のリストを受け入れるモナディックリンク。

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

ØBċþSḋ“...“...’b5,3¤ - Link: list of characters, T
ØB                   - base-chars = "01...9A...Za...z'
   þ                 - outer product with T using:
  ċ                  -   count occurrences
    S                - sum -> [n(0), n(1), ..., n(9), n(A), ..., n(Z), n(a), ..., n(z)]'
                   ¤ - nilad followed by link(s) as a nilad:
      “...“...’      -   list of two large integers (encoded in base 250)
                5,3  -   five paired with three = [5,3]
               b     -   to base  -> [[Lines(0), Lines(1), ...], Curves(0), Curves(1), ...]
     ḋ               - dot-product

5

Scala、235バイト

val a=('0'to'9')++('A'to'Z')++('a'to'z')
def f(s:String)=s.filter(a.contains(_)).map(c=>"gdgkdhfckfdlfgedhddgdcedfgkhfcfceeddkgfggglgilddnhfgggfggceegd"(a.indexOf(c))-'a').map(x=>(x%5,x/5)).foldLeft((0,0))((x,y)=>(x._1+y._1,x._2+y._2))

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

それほど小さくはありませんが、おそらくさらにゴルフを楽しめます。
注:52文字の文字列リテラルは、次の表に従って線と曲線の数を示す別の文字に文字をマップする辞書のようなものです。

Curves|Lines
      |0 1 2 3 4
----------------
     0|a b c d e
     1|f g h i j
     2|k l m n o

5

Pythonの2159の 154バイト

任意の文字のlines*4 + curves場合、0から16の値を与えます。Base-36は、これらの値をエンコードするために使用されます(1文字= 1値)。

@Chas Brownのおかげで-5バイト

lambda s:map(sum,zip(*(divmod(int("5c52c918210000000c615gc9cc5c8gc15291818ggcc00000025155565d6cce915551558gg5c"[ord(x)-48],36),4)for x in s if'/'<x<'{')))

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

Python 2、141バイト

これは私のPython3ソリューションの移植版です。このバージョンは長い整数のリストを出力するため、[4L, 2L]ではなくのようになり[4, 2]ます。

lambda s:map(sum,zip(*(divmod(int("8BK5NLC8RS10XWUX12BG408C2UELUAFEOVARZKCHEEDDMXG09L48ZG",36)/13**(ord(x)-48)%13,3)for x in s if'/'<x<'{')))

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


2
'/'<x<'{'代わりにbase36を使用した154バイトx.isalnum()
Chas Brown

1
@Chas Brownありがとう!私もについて考えていましたが'/'<x<'{'、それを表現するために、それを取り除くことも試みましたif
Daniil Tutubalin



4

Retina 0.8.2、160バイト

$
¶$`
T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*
T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$
.
$*
%`1

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

$
¶$`

入力文字列を複製します。

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

最初の行で各文字の行を数えます。

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

2行目の各キャラクターの曲​​線を数えます。

.
$*
%`1

各行の桁を個別に合計します。



4

チャコール、60バイト

IE⟦”)⊞∧cⅉ→ÞYγμ◧⊞¶u№¶⊘¶∕«⁸””)∨⧴|υ;↷dLτIüO¦:”⟧Σ⭆Φθ№⭆ι⍘ξφλ§ι⍘λφ

オンラインでお試しください!リンクはコードの詳細バージョンです。説明:

E⟦”)⊞∧cⅉ→ÞYγμ◧⊞¶u№¶⊘¶∕«⁸””)∨⧴|υ;↷dLτIüO¦:”⟧

これは、2つの文字列13103202000101111131333201110112441331014323313243010202024433との配列です10120110212111112112002111111110001002110010010000112110100000。次に、文字列がマッピングされます。

Φθ№⭆ι⍘ξφλ

入力の要素は、デフォルトの基本変換アルファベットの(62)文字内に含まれているかどうかでフィルタリングされます。

⭆...§ι⍘λφ

次に、残っている要素がベース(62)から変換され、マップされた文字列にインデックスが付けられます。

I...Σ...

数字は合計され、暗黙の印刷のために文字列にキャストバックされます。


4

Pythonの3165の 159 148 146バイト

任意の文字(非英数字を含む)のlines*3 + curves場合、0〜12の値が得られるため、長い13進数を使用してデータをエンコードできます。短くするため、base-36に変換されます。

素晴らしいアドバイスをしてくれた@Chas Brownに感謝します。

ラムダをプログラムに変換することにより-2バイト。

print(*map(sum,zip(*(divmod(int("8BK5NLC8RS10XWUX12BG408C2UELUAFEOVARZKCHEEDDMXG09L48ZG",36)//13**(ord(x)-48)%13,3)for x in input()if'/'<x<'{'))))

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



3

Python 2、525バイト

l=c=0;e=[(1,1),(3,0),(1,2),(0,2),(3,0),(2,1),(0,1),(2,0),(0,2),(0,1),(3,0),(1,2),(0,1),(1,1),(4,0),(3,0),(2,1),(3,0),(3,0),(1,1),(3,0),(2,0),(4,0),(3,0),(0,1),(1,1),(0,2),(2,1),(0,1),(2,0),(0,1),(2,0),(4,0),(4,0),(3,0),(3,0),(0,2),(1,1),(0,1),(1,1),(1,1),(1,1),(1,2),(1,1),(3,1),(1,2),(3,0),(3,0),(3,2),(2,1),(0,1),(1,1),(1,1),(1,1),(0,1),(1,1),(1,1),(2,0),(4,0),(4,0),(1,1),(3,0)]
d='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
for i in input():
 if i in d:
  p=d.find(i);l+=e[p][0];c+=e[p][1];
print l,c

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

リファレンス実装への同様のアプローチですが、多少短いです。



2
仕事の後に
ビアガーテンで

1
@HermanL自分の回答として自由に投稿してください。このイブを更新する時間はありません。
ElPedro

2
265バイト、ゴルフをもう少し...
Chas Brown



2

05AB1E、53 バイト

•xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вR2ôžKISk®KèøO

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ
                 '# Compressed integer 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160
 5в               # Converted to base-5 as list: [1,0,2,0,0,2,1,0,1,2,0,3,2,0,1,1,0,3,1,1,0,3,0,3,0,4,0,4,0,2,1,0,0,2,1,0,1,2,2,0,1,1,1,0,0,3,0,4,0,2,0,3,1,1,0,3,0,3,1,2,0,3,0,4,1,1,1,0,2,1,0,3,0,3,1,1,0,4,0,4,0,2,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,2,2,3,0,3,0,3,2,1,1,3,1,1,2,1,1,1,1,1,1,1,1,0,1,1,2,0]
   R              # Reverse this list (due to the leading 0)
    2ô            # Split it into pairs: [[0,2],[1,1],[0,1],[1,1],[1,1],[1,1],[1,2],[1,1],[3,1],[1,2],[3,0],[3,0],[3,2],[2,1],[0,1],[1,1],[1,1],[1,1],[0,1],[1,1],[1,1],[2,0],[4,0],[4,0],[1,1],[3,0],[3,0],[1,2],[0,1],[1,1],[4,0],[3,0],[2,1],[3,0],[3,0],[1,1],[3,0],[2,0],[4,0],[3,0],[0,1],[1,1],[0,2],[2,1],[0,1],[2,0],[0,1],[2,0],[4,0],[4,0],[3,0],[3,0],[1,1],[3,0],[1,1],[0,2],[3,0],[2,1],[0,1],[2,0],[0,2],[0,1]]
      žK          # Push builtin string "abc...xyzABC...XYZ012...789"
        IS        # Push the input, split into characters
          k       # Get the index of each of these characters in the builtin-string
           ®K     # Remove all -1 for non-alphanumeric characters that were present
             è    # Use these indices to index into the earlier created pair-list
              ø   # Zip/transpose; swapping rows/columns
               O  # Sum both inner lists
                  # (after which the result is output implicitly)

この05AB1Eのヒント(「大きな整数を圧縮する方法」および「整数リストを圧縮する方法」のセクション)を参照して、•xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ101629259357674935528492544214548347273909568347978482331029666966024823518105773925160•xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вある理由を理解してください[1,0,2,0,0,2,1,0,1,2,0,3,2,0,1,1,0,3,1,1,0,3,0,3,0,4,0,4,0,2,1,0,0,2,1,0,1,2,2,0,1,1,1,0,0,3,0,4,0,2,0,3,1,1,0,3,0,3,1,2,0,3,0,4,1,1,1,0,2,1,0,3,0,3,1,1,0,4,0,4,0,2,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,2,2,3,0,3,0,3,2,1,1,3,1,1,2,1,1,1,1,1,1,1,1,0,1,1,2,0]


1

Python 3、697バイト

def f(s):
    l=0;c=0;d={'0':(1,1),'1':(3,0),'2':(1,2),'3':(0,2),'4':(3,0),'5':(2,1),'6':(0,1),'7':(2,0),'8':(0,2),'9':(0,1),'A':(3,0),'B':(1,2),'C':(0,1),'D':(1,1),'E':(4,0),'F':(3,0),'G':(2,1),'H':(3,0),'J':(1,1),'K':(3,0),'L':(2,0),'M':(4,0),'N':(3,0),'O':(0,1),'P':(1,1),'Q':(0,2),'R':(2,1),'S':(0,1),'T':(2,0),'U':(0,1),'V':(2,0),'W':(4,0),'X':(4,0),'Y':(3,0),'Z':(3,0),'a':(0,2),'b':(1,1),'c':(0,1),'d':(1,1),'e':(1,1),'f':(1,1),'g':(1,2),'h':(1,1),'i':(3,1),'j':(1,2),'k':(3,0),'l':(3,0),'m':(3,2),'n':(2,1),'o':(0,1),'p':(1,1),'q':(1,1),'r':(1,1),'s':(0,1),'t':(1,1),'u':(1,1),'v':(2,0),'w':(4,0),'x':(4,0),'y':(1,1),'z':(3,0)};
    for i in s:
        if i in d:
            l+=d[i][0];c+=d[i][1];
    return l,c

簡単な最初の試み。テーブルを辞書に入れ、文字列をループし、いくつかのカウンターをインクリメントし、タプルを返しました。入力は文字列です。

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


1
なぜ競争しないのですか?私には元気に見えます。
ElPedro

1
なぜコメントなしで反対票を投じるのですか?
ElPedro

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