การเรียงตัวอักษรและตัวเลขและเส้นโค้ง


10

รับสายป้อนเขียนโปรแกรมที่ส่งออกจำนวนบรรทัดและเส้นโค้งที่มี

ความท้าทาย

  • ใช้อินพุตจากSTDINหรือวิธีการอินพุตอื่น ๆ
  • เอาท์พุทไปยังSTDOUTหรือวิธีการส่งออกอื่น ๆ จำนวนรวมของเส้นและเส้นโค้งที่มีอยู่ในสตริงในลำดับนั้นขึ้นอยู่กับตารางด้านล่างในข้อมูลโค้ด
  • ควรละเว้นอักขระที่ไม่ใช่ตัวอักษรและตัวเลขใด ๆ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือ รหัสที่สั้นที่สุดจึงชนะ

ชี้แจง

  • เส้นและเส้นโค้งจะถูกกำหนดโดยตัวอักษรที่ใช้ใน Stackexchange code blocksสำหรับ
  • แวดวง (ชอบO, o, 0) และจุด ( i, j) ถือเป็นเส้นโค้ง 1 เส้น
  • การป้อนข้อมูลสามารถเป็นสตริงรายการของตัวละครสตรีมของตัวละคร bytecodes ฯลฯ
  • เอาท์พุทสามารถเป็นอาร์เรย์ของจำนวนเต็ม tuple ของจำนวนเต็มสตริงคั่นด้วยเครื่องหมายจุลภาค ฯลฯตัวเลขสองต้องแยกจากกันเพื่อให้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
สิ่งใดนับเป็นเส้นและเส้นโค้ง คือsเส้นโค้ง 2 หรือ 1? ก้านjเป็นทั้งเส้นและเส้นโค้งหรือไม่? มันจะดีที่สุดถ้าคุณสามารถแสดงรายการค่าที่ต้องการสำหรับตัวอักษรทั้งหมด
Ad Hoc Garf Hunter

4
ฉันไม่เข้าใจ downvotes ของอันนี้จริงๆ สำหรับฉันนี่เป็นความท้าทายที่ระบุไว้อย่างดีกับกรณีทดสอบที่ดีการใช้การอ้างอิงและตารางของค่าที่คาดหวัง (ไม่ว่าจะเป็นด้านเทคนิคหรือถูกสวมใส่เป็นเรื่องของความเห็นส่วนตัว แต่ไม่มีอะไรเกี่ยวข้องกับความท้าทาย) .. การส่งออกมีความยืดหยุ่น หากใครบางคนสามารถอธิบายสิ่งที่ผิดกับสิ่งนี้ฉันจะขอบคุณมากที่สุด
ElPedro

3
คุณช่วยระบุค่าสำหรับตัวละครแต่ละตัวในรูปแบบที่เราสามารถคัดลอกได้ง่ายขึ้น; ส่วนย่อยไม่จำเป็นทั้งหมด
Shaggy

4
oควรเป็น 0 บรรทัด 1 เส้นโค้ง
Giuseppe

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 ฟังก์ชั่นgแปลกลับไปเป็นฐาน -5

แก้ไข: -13 ไบต์ขอบคุณ @cole


1
169 ไบต์ถ้าคุณสามารถใช้รายการ charcodes กำลังจะสำรวจการย้ายข้อมูลนี้ไปยังชุดตัวเลือกสตริง…
โคล

1
175 ไบต์ถ้าคุณต้องใช้สตริง (ลบความคิดเห็นก่อนหน้าของฉันตั้งแต่ฉันเล่นกอล์ฟเล็กน้อย 3 ไบต์)
โคล

@ โคล: ขอบคุณสำหรับการปรับปรุง ไปกับรายการของจำนวนเต็มรู้สึกเหมือนโกงเพราะความท้าทายที่ติดแท็กเป็น "สตริง" ในทางกลับกันกฎอนุญาต "bytecodes" เป็นรูปแบบการป้อนข้อมูลที่ถูกต้อง อย่างไรก็ตามคำตอบอื่น ๆ อีกมากมายใช้การแปลงถ่านจำนวนเต็ม ไม่รู้จะทำยังไง
nimi

6

05AB1E , 78 69 65 ไบต์

-4 ไบต์ขอบคุณ Kevin Cruijssen ไปดูคำตอบ 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
ผลลัพธ์สามารถเป็นอาร์เรย์ของจำนวนเต็ม, tuple ของจำนวนเต็ม, สตริงที่คั่นด้วยเครื่องหมายจุลภาค, ฯลฯ ตัวเลขสองตัวต้องแยกจากกัน @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¤

Monadic Link ยอมรับรายการของอักขระที่ให้รายการของจำนวนเต็ม (สอง)

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

Ø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

Python 2 , 159 154 ไบต์

สำหรับตัวละครใด ๆ lines*4 + curvesให้ค่าตั้งแต่ 0 ถึง 16 Base-36 จะใช้เพื่อเข้ารหัสค่าเหล่านี้ (1 อักขระ = 1 ค่า)

-5 ไบต์ขอบคุณ @Chas Brown

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

ลองออนไลน์!

Python 2 , 141 ไบต์

นี่คือพอร์ตของโซลูชัน Python3 ของฉัน รุ่นนี้ outputs รายการ ints ยาวจึงดูเหมือนแทน[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
@Chas Brown ขอบคุณ! ฉันก็คิด'/'<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 , 164 153 ไบต์

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




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

ลองออนไลน์!

ฉันมีความคิดเช่นเดียวกับคำตอบของ nimiโดยใช้การเข้ารหัส 5 ฐาน แต่เข้ารหัสเป็นอักขระ ASCII แทนที่จะเป็นฐาน 16 ใช้nomatch = 0ในmatchการกำจัดอักขระที่ไม่ใช่ตัวอักษรและตัวเลข

curves linesผลตอบแทน


4

ถ่าน 60 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

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

นี่คืออาร์เรย์ของสองสตริงและ13103202000101111131333201110112441331014323313243010202024433 10120110212111112112002111111110001002110010010000112110100000สตริงจะถูกแมปแล้ว

Φθ№⭆ι⍘ξφλ

องค์ประกอบของการป้อนข้อมูลจะถูกกรองมากกว่าว่าพวกเขามีอยู่ภายใน (62) ตัวอักษรของตัวอักษรการแปลงฐานเริ่มต้น

⭆...§ι⍘λφ

องค์ประกอบที่เหลือจะถูกแปลงจากฐาน (62) และนี่จะถูกจัดทำดัชนีเป็นสตริงที่แมป

I...Σ...

ตัวเลขจะถูกรวมและส่งกลับไปที่สตริงเพื่อพิมพ์โดยนัย


4

Python 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

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
คิดว่าในขณะที่ฉันมีเบียร์ที่จำเป็นมากใน Biergarten หลังเลิกงาน แต่มันเป็นงานมากเกินไปที่จะจัดรูปแบบใหม่ในมือของฉัน :) :)
ElPedro

1
@HermanL รู้สึกอิสระที่จะโพสต์เป็นคำตอบของคุณเอง ฉันไม่มีเวลาที่จะอัพเดทอีฟนี้
ElPedro

2
265 bytesกับการเล่นกอล์ฟเพิ่มขึ้นอีกนิด ...
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
ทำไม downvote โดยไม่ต้องแสดงความคิดเห็น?
ElPedro

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.