Alfasayısal Çizgi ve Eğri Sayımı


10

Bir girdi dizesi verildiğinde, sahip olduğu toplam satır ve eğri sayısını çıkaran bir program yazın.

Meydan okuma

  • Girdiyi STDINveya başka bir girdi yöntemini alın.
  • Çıktı STDOUT, ya da başka bir çıkış metodu, çizgiler ve eğri toplam sayısı, dizge içinde ihtiva bu sırayla kod parçasında aşağıdaki tabloya göre,.
  • Alfasayısal olmayan karakterler göz ardı edilmelidir.
  • Standart boşluklar yasaktır.
  • Bu , en kısa kod kazanır.

Açıklamalar

  • Çizgiler ve eğriler, Stackexchange için kullanılan yazı tipine göre belirlenir code blocks.
  • Daireler (gibi O, o, 0) ve noktalar ( i, j), her biri 1 eğri olarak kabul edilir.
  • Giriş bir dize, karakter listesi, karakter akışı, bayt kodları vb. Olabilir.
  • Çıktı tamsayılar dizisi, vb tamsayılar, virgülle ayrılmış dizesini tanımlama grubu olabilir , iki sayı ayrı olmalıdır böylece 104geçerli değil, ama 10,4, 10 4, 10\n4, [10,4], (10, 4), vb olduğunu.
  • Başlık ve sondaki boşluk tamamen kabul edilebilir.

Örnek Giriş ve Çıkış

# 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

Karakter Tablosu

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
Çizgi ve eğri nedir? Mi s2 eğrileri veya 1? Kök jhem bir çizgi hem de eğri mi? Tüm harfler için gerekli değerleri listeleyebilmeniz iyi olur.
Ad Hoc Garf Hunter

4
Bu konudaki düşüşleri gerçekten anlamıyorum. Benim için bu, iyi test senaryoları, referans uygulaması ve hangi değerlerin beklendiği konusunda bir tablodur (teknik olarak doğru veya worng olsun, kişisel görüş meselesidir, ancak meydan okuma ile ilgisi yoktur) .. Girdi ve çıktı esnektir. Birisi bunun neyin yanlış olduğunu açıklayabilirse çok minnettar olurum.
ElPedro

3
Lütfen her karakter için değerleri daha kolay kopyalayabileceğimiz bir biçimde sağlayabilir misiniz? Snippet tamamen gereksizdir.
Shaggy

4
o0 satır, 1 eğri olmalıdır
Giuseppe

2
Yukarıdan devam etti ... Geri bildirimi olmayan downvotes OP'ye gelecekte zorluklarını iyileştirmek için çok az şans veriyor.
ElPedro

Yanıtlar:


8

Haskell'in 214 199 188 175 bayt

 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)

Çevrimiçi deneyin!

Çizgi ve eğri sayıları baz-5 sayılarının rakamlarıdır ve baz-16 sayıları olarak saklanır. Fonksiyon gtaban-5'e geri döner.

Düzenleme: @cole sayesinde -13 bayt.


1
Charcodes listesini alabiliyorsanız 169 bayt . Bunu dize varyantına taşıyarak keşfedecek…
cole

1
175 bayt dizeleri kullanmak zorunda (önemsiz 3 bayt kapalı golf beri benim önceki yorum silindi).
cole

@cole: geliştirmeler için teşekkürler. Bir tamsayı listesi ile gitmek hile gibi geliyor, çünkü meydan okuma "string" olarak etiketlendi. Öte yandan, kurallar geçerli bir girdi biçimi olarak "bayt kodlarına" izin verir. Ancak, diğer birçok cevap da bir çeşit char -> tamsayı dönüşümü kullanır. Ne yapacağımı bilmiyorum.
nimi

6

05AB1E , 78 69 65 bayt

-4 bayt Kevin Cruijssen sayesinde, Git ve onun daha iyi 05AB1E cevabını kontrol

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

Çevrimiçi deneyin!

Çıktılar [Eğri, Çizgi]

05AB1E'de gerçekten kötüyüm yeni öğrendim. èListelerim boyunca 05AB1E alabileceğimde kesinlikle daha fazla bayt kaydedebilirim


açıklama

ž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
Çıktınız ters çevrildi. Olmalı line curve, değil curve line.
bigyihsuan

1
Çıktı iki sayı ayrı olmalıdır vb tamsayılar dizisi, tamsayılar kayıt düzeni virgülle ayrılmış dize olabilir bunlar ayrıdır @bigyihsuan, ben konudur görmüyorum
Süresi Dolan Veri

1
Kurallar söylüyor Output to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order. Not in that orderyüzden line curve.
bigyihsuan

2
Bu konuda @ExpiredData ile kabul ediyorum. Belki meydan okumada siparişin cevapta belirtilmesi gerektiğini belirtin. Bu üstesinden gelmek için yeterli olurdu.
ElPedro

1
53 bayt (ve [Line, Curve]çıktı sırası ile, bu bir rastlantısal ve kasıtlı olmasa da).
Kevin Cruijssen

5

Jöle , 45 bayt

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

Bir (iki) tamsayı listesi veren karakterlerin listesini kabul eden monadic Link.

Çevrimiçi deneyin! Veya test takımına bakın .

Nasıl?

Ø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 bayt

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

Çevrimiçi deneyin!

O kadar küçük değil, muhtemelen daha fazla golf edilebilir.
Not: 52 karakterlik dize değişmez değeri, bir karakteri aşağıdaki tabloya göre çizgi ve eğri sayısını gösteren başka bir karakterle eşleyen bir sözlük gibidir:

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 2 , 159156 bayt

Herhangi bir karakter lines*4 + curvesiçin 0 ila 16 arasında bir değer verir. Base-36, bu değerleri kodlamak için kullanılır (1 karakter = 1 değer).

@Chas Brown sayesinde -5 bayt

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

Çevrimiçi deneyin!

Python 2 , 141 bayt

Bu benim Python3 çözümümün bir limanı. Bu sürüm, uzun girişlerin bir listesini çıkarır, bu yüzden [4L, 2L]yerine benziyor [4, 2].

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

Çevrimiçi deneyin!


2
154 bayt base36 '/'<x<'{'yerine x.isalnum().
Chas Brown

1
@Chas Brown teşekkürler! Ben de düşünüyordum '/'<x<'{'ama kurtulmak için onu ifade etmeye çalıştım if.
Daniil Tutubalin

4

Jöle , 51 bayt

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

Çevrimiçi deneyin!

Dizeyi girdi olarak alan ve tamsayıların listesini döndüren monadik bir bağlantı [lines, curves]



4

Retina 0.8.2 , 160 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama:

$
¶$`

Giriş dizesini çoğaltın.

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

İlk satırdaki her karakterin satırlarını sayın.

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

Her karakterin eğrilerini ikinci satırda sayın.

.
$*
%`1

Rakamları her satırdaki ayrı ayrı toplayın.


4

R , 164153 bayt

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




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

Çevrimiçi deneyin!

Ben aynı fikri vardı nimi cevabı 16. Kullanımları ASCII karakterleri yerine temel olarak bir taban 5 kodlamayı ancak kodlamakta kullanarak nomatch = 0içinde matchalfasayısal olmayan karakterler ortadan kaldırmak için.

İade curves lines.


4

Kömür , 60 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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

Bu iki dizelerden oluşan bir dizidir 13103202000101111131333201110112441331014323313243010202024433ve 10120110212111112112002111111110001002110010010000112110100000. Dizeler daha sonra eşlenir.

Φθ№⭆ι⍘ξφλ

Girişin öğeleri, varsayılan temel dönüşüm alfabesinin (62) karakterleri içinde bulunup bulunmadığına göre filtrelenir.

⭆...§ι⍘λφ

Kalan elemanlar daha sonra tabandan (62) dönüştürülür ve bu daha sonra eşlenen dizeye endekslenir.

I...Σ...

Rakamlar toplanır ve örtük yazdırma için dizgiye geri döner.


4

Piton 3 , 165 159 148 146 bayt

Herhangi bir karakter için (alfasayısal olmayan dahil) lines*3 + curves0 ile 12 arasında değer verir, bu nedenle verileri kodlamak için uzun taban-13 sayısını kullanabiliriz. Kısaltmak için üs-36'ya dönüştürülür.

Harika tavsiyeler için @Chas Brown'a teşekkürler.

Lambda'yı programa dönüştürerek -2 bayt.

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

Çevrimiçi deneyin!


4

Python 2 , 179 166 165 163 bayt

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

Çevrimiçi deneyin!

Bir liste döndürür [curves, lines].


3

Python 2 , 525 bayt

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

Çevrimiçi deneyin!

Referans uygulamasına benzer yaklaşım ama biraz daha kısa.



2
Ben işten sonra Biergarten çok ihtiyaç duyulan bira yaparken düşünmüştüm ama benim kullanışlı yeniden biçimlendirmek için çok fazla iş :)
ElPedro

1
@HermanL Kendi cevabınız olarak yayınlamaktan çekinmeyin. Bu arifeyi güncellemek için vaktim yok.
ElPedro

2
265 bayt biraz daha golf ...
Chas Brown


2

Perl 5 -MList::Util=sum -p , 180 bayt

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

Çevrimiçi deneyin!


2

05AB1E , 53 bayt

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

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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)

Neden •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕolduğunu 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160ve •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вolduğunu anlamak için bu 05AB1E benim ucu ( büyük tamsayı nasıl sıkıştırılır ? Ve tamsayı listeleri nasıl sıkıştırılır? ) Bölümlerine bakın[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 bayt

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

Basit bir ilk girişim. Tabloyu bir sözlüğe koydum, dizeden geçtim, bazı sayaçları artırdım ve bir tuple döndüm. Girdi bir dizedir.

Çevrimiçi deneyin!


1
Neden rekabet etmiyor? Bana iyi geliyor.
ElPedro

1
Neden yorum yapmadan downvote?
ElPedro

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.