영숫자 선과 곡선 계산


10

입력 문자열이 주어지면, 줄과 곡선의 총 수를 출력하는 프로그램을 작성하십시오.

도전

  • 에서 입력 STDIN하거나 다른 입력 방법을 사용하십시오.
  • 출력 STDOUT또는 다른 출력에있어서, 직선과 곡선의 총 수는, 문자열에 포함되는 순서로 코드 조각의 표에 기초하여.
  • 영숫자가 아닌 문자는 무시해야합니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 가장 짧은 코드가 승리합니다.

설명

  • 선과 곡선은에 대한 Stackexchange에 사용 된 글꼴에 의해 결정됩니다 code blocks.
  • 원 ( O, o, 0)과 점 ( i, j)은 각각 1 개의 곡선으로 간주됩니다.
  • 입력은 문자열, 문자 목록, 문자 스트림, 바이트 코드 등이 될 수 있습니다.
  • 출력 정수 배열 등 정수 쉼표로 구분 된 문자열의 튜플이 될 수있다 , 두 숫자는 반드시 분리되어야 하므로 104유효하지 않지만 10,4, 10 4, 10\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가 선과 곡선 모두에 있습니까? 모든 문자에 필요한 값만 나열하면 가장 좋습니다.
Ad Hoc Garf Hunter

4
나는 이것에 대한 downvotes를 정말로 이해하지 못한다. 나에게 이것은 좋은 테스트 사례, 참조 구현 및 예상되는 값에 대한 테이블로 잘 정의 된 도전입니다 (기술적으로 옳거나 착용했는지 여부는 개인적인 견해이지만 도전과는 아무런 관련이 없습니다). 출력이 유연합니다. 누군가가 이것에 어떤 문제가 있는지 설명 할 수 있다면 가장 감사 할 것입니다.
ElPedro

3
보다 쉽게 ​​복사 할 수있는 형식으로 각 문자의 값을 제공 할 수 있습니까? 스 니펫은 전적으로 불필요합니다.
얽히고 설킨

4
o줄 0 개, 곡선 1 개
Giuseppe

2
위에서 계속 ... 피드백이없는 다운 보트는 향후 OP 문제를 개선 할 기회가 거의 없습니다.
ElPedro

답변:


8

하스켈 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 인 숫자로 저장됩니다. 함수 g는 기본 5로 다시 변환됩니다.

편집 : @cole 덕분에 -13 바이트.


1
문자 코드 목록을 가져올 수있는 경우 169 바이트 이것을 문자열 변형으로 포팅하는 방법을 알아볼 것입니다…
cole

1
문자열을 사용해야하는 경우 175 바이트 (사소한 3 바이트를 깎아서 이전 주석을 삭제했습니다).
cole

@cole : 개선 주셔서 감사합니다. 도전 과제에 "string"이라는 태그가 붙어 있기 때문에 정수 목록을 사용하는 것은 속임수처럼 느껴집니다. 반면, 규칙은 "바이트 코드"를 유효한 입력 형식으로 허용합니다. 그러나 많은 다른 답변들도 일종의 char-> 정수 변환을 사용합니다. 무엇을 해야할지 모르겠다.
nimi

6

05AB1E , 78 69 65 바이트

Kevin Cruijssen 덕분에 -4 바이트, 가서 더 나은 05AB1E 답변을 확인하십시오.

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

온라인으로 사용해보십시오!

[곡선, 선]으로 출력

나는 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
출력은 정수 배열, 튜플 정수, 쉼표로 구분 된 문자열 등의 배열 일 수 있습니다. 두 숫자는 분리되어야합니다. @bigyihsuan 그들은 분리되어야합니다 . 문제가 무엇인지 모르겠습니다.
Expired Data

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

스칼라 , 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

파이썬 2 , 159 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<'{')))

온라인으로 사용해보십시오!

파이썬 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
154 바이트 base36 사용하고 '/'<x<'{'대신이 x.isalnum().
Chas Brown

1
@ 브라운 브라운 감사합니다! 나는 또한 생각하고 '/'<x<'{'있었지만 그것을 제거하기 위해 표현에 넣으려고했습니다 if.
Daniil Tutubalin



4

레티 나 0.8.2 , 160 바이트

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

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

$
¶$`

입력 문자열을 복제하십시오.

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

첫 번째 줄에서 각 문자의 줄을 세십시오.

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

두 번째 줄에서 각 문자의 곡선을 세십시오.

.
$*
%`1

각 줄에서 숫자를 별도로 합산하십시오.


4

R , 164153 바이트

function(s,`!`=utf8ToInt,x=(!"




")[match(!s,c(48:57,65:90,97:122),0)])c(sum(x%%5),sum(x%/%5))

온라인으로 사용해보십시오!

나는 같은 생각이 있었다 nimi의 답변을 16 용도 ASCII 문자 대신 거점으로 기본 5 인코딩하지만 인코딩을 사용하여 nomatch = 0match영숫자가 아닌 문자를 제거 할 수 있습니다.

를 반환 curves lines합니다.


4

, 60 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

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

이것은 두 개의 문자열 13103202000101111131333201110112441331014323313243010202024433과 의 배열입니다 10120110212111112112002111111110001002110010010000112110100000. 그런 다음 문자열이 매핑됩니다.

Φθ№⭆ι⍘ξφλ

입력 요소는 기본 기본 변환 알파벳의 (62) 문자 내에 포함되어 있는지 여부에 따라 필터링됩니다.

⭆...§ι⍘λφ

남아있는 요소는 밑 (62)에서 변환 된 다음 매핑 된 문자열로 색인됩니다.

I...Σ...

숫자는 합산되어 암시 적 인쇄를 위해 문자열로 다시 캐스팅됩니다.


4

파이썬 (3) , 165 (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

파이썬 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
내가 일한 후에 Biergarten에서 맥주가 많이 필요한 동안 그것에 대해 생각했지만 내 손에 다시 포맷하기에는 너무 많은 일이었습니다 :)
ElPedro

1
@HermanL 자신의 답변으로 자유롭게 게시하십시오. 이 이브를 업데이트 할 시간이 없습니다.
ElPedro

2
좀 더 골프와 265 바이트 ...
Chas Brown


2

펄 5 -MList::Util=sum -p , 180 바이트

say sum y/0-9A-Za-z/13103202003101432331324301020202443301011111313332011101124413/r=~/./g;$_=sum y/0-9A-Za-z/10120110210211001001000011211010000021111121120021111111100010/r=~/./g

온라인으로 사용해보십시오!


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

파이썬 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.