Liczenie linii i krzywych alfanumerycznych

10

Biorąc pod uwagę ciąg wejściowy, napisz program, który wypisuje całkowitą liczbę linii i krzywych.

Wyzwanie

  • Pobierz dane wejściowe z STDINdowolnej innej metody.
  • Dane wyjściowe STDOUTlub dowolna inna metoda danych wyjściowych, łączna liczba linii i krzywych zawartych w ciągu, w tej kolejności , na podstawie poniższej tabeli we fragmencie kodu.
  • Wszelkie znaki niealfanumeryczne należy zignorować.
  • Standardowe luki są zabronione.
  • To jest , więc najkrótszy kod wygrywa.

Wyjaśnienia

  • Linie i krzywe są określane przez czcionkę używaną w Stackexchange dla code blocks.
  • Koła (jak O, o, 0) i kropki ( i, j) są uważane za 1 krzywą.
  • Dane wejściowe mogą być ciągiem znaków, listą znaków, strumieniem znaków, kodami bajtowymi itp.
  • Wyjście może być tablicą liczb całkowitych, krotką liczb całkowitych, oddzielonych przecinkami ciąg itp Oba numery muszą być oddzielone, więc 104nie jest ważna, ale 10,4, 10 4, 10\n4, [10,4], (10, 4), i tak dalej jest.
  • Nagłówek i końcowe białe znaki są całkowicie dopuszczalne.

Przykładowe wejście i wyjście

# 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

Tablica znaków

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
bigyihsuan
źródło
2
Co liczy się jako linia i krzywa? Czy s2 krzywe czy 1? Czy trzon ma jzarówno linię, jak i krzywą? Byłoby najlepiej, gdybyś mógł po prostu podać wymagane wartości dla wszystkich liter.
Ad Hoc Garf Hunter
4
Naprawdę nie rozumiem negatywnych opinii na ten temat. Dla mnie jest to dobrze określone wyzwanie z dobrymi przypadkami testowymi, referencyjną implementacją i tabelą oczekiwanych wartości (czy są technicznie słuszne, czy pracujące, jest kwestią osobistej opinii, ale nie ma nic wspólnego z wyzwaniem). wyniki są elastyczne. Jeśli ktoś mógłby wyjaśnić, co jest z tym nie tak, byłbym bardzo wdzięczny.
ElPedro,
3
Czy możesz podać wartości dla każdego znaku w formacie, który możemy łatwiej skopiować; Snippet jest całkowicie niepotrzebny.
Kudłaty
4
opowinno być 0 linii, 1 krzywa
Giuseppe
2
Ciąg dalszy z góry ... Przegłosowanie bez informacji zwrotnej daje OP niewielką szansę na poprawę swoich wyzwań w przyszłości.
ElPedro

Odpowiedzi:

8

Haskell, 214 199 188 175 bajtów

 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)

Wypróbuj online!

Liczby linii i krzywych są cyframi liczb podstawowych 5 i są przechowywane jako liczby podstawowe 16. Funkcja gprzekłada się z powrotem na base-5.

Edycja: -13 bajtów dzięki @cole.

nimi
źródło
1
169 bajtów, jeśli możesz wziąć listę znaków. Zamierzam zbadać przenoszenie tego do wariantu strun…
cole
1
175 bajtów, jeśli musisz użyć ciągów (usunąłem mój poprzedni komentarz, ponieważ grałem w trywialne 3 bajty).
cole
@cole: dzięki za ulepszenia. Posługiwanie się listą liczb całkowitych wydaje się oszustwem, ponieważ wyzwanie jest oznaczone jako „ciąg”. Z drugiej strony reguły dopuszczają „bytecodes” jako prawidłowy format wejściowy. Jednak wiele innych odpowiedzi korzysta również z pewnego rodzaju konwersji liczb całkowitych char ->. Nie wiem co robić.
nimi
6

05AB1E , 78 69 65 bajtów

-4 bajty dzięki Kevinowi Cruijssenowi, idź i sprawdź jego jeszcze lepszą odpowiedź 05AB1E

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

Wypróbuj online!

Dane wyjściowe jako [Krzywa, linia]

Jestem naprawdę zły w 05AB1E, właśnie się dowiedziałem. Zdecydowanie mogę zapisać więcej bajtów, jeśli uda mi się zrobić 05AB1E èna mojej liście list


Wyjaśnienie

ž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
Wygasły dane
źródło
1
Twoje dane wyjściowe są odwrócone. To powinno być line curve, nie curve line.
bigyihsuan
1
Dane wyjściowe mogą być tablicą liczb całkowitych, krotką liczb całkowitych, ciągiem znaków oddzielonych przecinkami itp. Te dwie liczby muszą być oddzielne @bigyihsuan, są one oddzielne, nie rozumiem o co chodzi
Data
1
Zasady mówią Output to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order. Uwaga in that order, więc line curve.
bigyihsuan
2
Zgodziłbym się z @ExpiredData w tej sprawie. Może w wyzwaniu sprecyzować, że w odpowiedzi należy podać kolejność. To by wystarczyło.
ElPedro
1
53 bajty (i [Line, Curve]jako z kolejnością wyjściową, chociaż jest to przypadek i nie jest zamierzone).
Kevin Cruijssen
5

Galaretka , 45 bajtów

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

Monadyczny link akceptujący listę znaków, który daje listę (dwóch) liczb całkowitych.

Wypróbuj online! Lub zobacz pakiet testowy .

W jaki sposób?

Ø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
Jonathan Allan
źródło
5

Scala , 235 bajtów

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

Wypróbuj online!

Nie tak mały, prawdopodobnie można go jeszcze pograć w golfa.
Uwaga: 52-znakowy literał łańcuchowy jest jak słownik, który odwzorowuje znak na inny znak, który oznacza liczbę linii i krzywych zgodnie z poniższą tabelą:

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
wózek 813
źródło
5

Python 2 , 159 154 bajtów

Dla każdej postaci lines*4 + curves podaje wartość od 0 do 16. Do zakodowania tych wartości służy Base-36 (1 znak = 1 wartość).

-5 bajtów dzięki @Chas Brown

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

Wypróbuj online!

Python 2 , 141 bajtów

To jest port mojego rozwiązania Python3. Ta wersja wyświetla listę długich liczb całkowitych, więc wygląda na to, że [4L, 2L]zamiast [4, 2].

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

Wypróbuj online!

Daniil Tutubalin
źródło
2
154 bajty przy użyciu base36 i '/'<x<'{'zamiast x.isalnum().
Chas Brown,
1
@Chas Brown dzięki! Myślałam też o tym '/'<x<'{', ale starałam się wyrazić to także, aby się go pozbyć if.
Daniil Tutubalin
4

Galaretka , 51 bajtów

ØBiⱮị“Æƭ&¶*ṪḳAøƬsøD<~²ṂvṠỤṣT3rdʠ¬⁻ÇṆṇ.ÑƑaȮż’b5¤s2¤S

Wypróbuj online!

Łącze monadyczne, które pobiera ciąg wejściowy i zwraca listę liczb całkowitych jako [lines, curves]

Nick Kennedy
źródło
4

JavaScript (Node.js) , 251 219 217 bajtów

-34 bajtów z @Expired Data : o

_=>_.map(a=>(p+=~~"13103202003101432331324301020202443301011111313332011101124413"[(x=a.charCodeAt()-48)>16?(x-=7)>41?x-=6:x:x])&(o+=~~"10120110210211001001000011211010000021111121120021111111100010"[x]),p=o=0)&&[p,o]

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
2
W rzeczywistości 217 bajtów
data ważności wygasła
4

Retina 0.8.2 , 160 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

$
¶$`

Zduplikuj ciąg wejściowy.

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

Policz linie każdego znaku w pierwszej linii.

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

Policz krzywe każdej postaci w drugiej linii.

.
$*
%`1

Sumuj cyfry osobno w każdym wierszu.

Neil
źródło
4

R , 164 153 bajty

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




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

Wypróbuj online!

Miałem taki sam pomysł jak odpowiedź nich przy użyciu kodowania base 5, ale koduje jako znaki ASCII zamiast base 16. Używa nomatch = 0wmatch celu wyeliminowania znaków innych niż alfanumeryczne.

Powraca curves lines.

Giuseppe
źródło
4

Węgiel , 60 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Jest to tablica dwóch ciągów 13103202000101111131333201110112441331014323313243010202024433i 10120110212111112112002111111110001002110010010000112110100000. Ciągi są następnie mapowane.

Φθ№⭆ι⍘ξφλ

Elementy wejściowe są filtrowane według tego, czy są zawarte w (62) znakach domyślnego podstawowego alfabetu konwersji.

⭆...§ι⍘λφ

Pozostałe elementy są następnie konwertowane z bazy (62), a następnie indeksowane do odwzorowanego ciągu.

I...Σ...

Cyfry są sumowane i rzutowane z powrotem na ciąg znaków w celu niejawnego drukowania.

Neil
źródło
4

Python 3 , 165 159 148 146 bajtów

Dla dowolnego znaku (w tym niealfanumerycznego) lines*3 + curves podaje wartość od 0 do 12, więc możemy użyć długiej liczby podstawowej 13 do kodowania danych. Aby był krótszy, jest konwertowany na base-36.

Dzięki @Chas Brown za świetne porady.

-2 bajty poprzez konwersję lambda na program.

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

Wypróbuj online!

Daniil Tutubalin
źródło
4

Python 2 , 179 166 165 163 bajtów

lambda s:[sum(p[:max(0,p.find(c))].count(',')for c in s)for p in',02BDJPbdefghjpqrtuy,57GLRTVnv,14AFHIKNYZiklmz,EMWXwx',',02569CDGJOPRSUbcdefhinopqrstuy,38BQagjm']

Wypróbuj online!

Zwraca listę [curves, lines].

Chas Brown
źródło
3

Python 2 , 525 bajtów

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

Wypróbuj online!

Podobne podejście do realizacji odniesienia, ale nieco krótsze.

ElPedro
źródło
3
283 bajty
Herman L
2
Pomyślałem o tym, gdy po pracy
piłem
1
@HermanL Możesz pisać jako własną odpowiedź. Nie mam czasu na aktualizację tego wigilii.
ElPedro,
2
265 bajtów z odrobiną golfa ...
Chas Brown,
2
231 bajtów
wilkben 17.07.19
2

Perl 5 -MList::Util=sum -p , 180 bajtów

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

Wypróbuj online!

Xcali
źródło
2

05AB1E , 53 bajty

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

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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)

Zobacz moją wskazówkę 05AB1E (sekcje Jak kompresować duże liczby całkowite? I Jak kompresować listy liczb całkowitych? ), Aby zrozumieć, dlaczego •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕjest 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160i •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вjest [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].

Kevin Cruijssen
źródło
1

Python 3 , 697 bajtów

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

Prosta pierwsza próba. Umieściłem tabelę w słowniku, zapętliłem łańcuch, zwiększyłem liczniki i zwróciłem krotkę. Dane wejściowe to ciąg znaków.

Wypróbuj online!

bigyihsuan
źródło
1
Dlaczego nie konkurować? Wygląda mi dobrze.
ElPedro
1
Dlaczego głosowanie bez komentarza?
ElPedro