นับตัวอักษร - ทีละนิด!


19

ส่วนที่เรียบง่าย:กำหนดสตริงอินพุตที่มีเฉพาะอักขระ ASCII ที่พิมพ์ได้ (ช่องว่าง - ตัวหนอน) นับจำนวนครั้งของอักขระแต่ละตัวและส่งคืนผลลัพธ์ในรูปแบบที่สะดวก ผลลัพธ์ของสตริงa%hda7aควรเป็นดังนี้: a:3, %:1, h:1, 7:1, d:1. การเรียงลำดับไม่จำเป็นตัวคั่นและรูปแบบเป็นตัวเลือก แต่ต้องเข้าใจง่ายว่าหมายเลขใดสอดคล้องกับอักขระตัวใด คุณจะต้องไม่รวมตัวละครที่ไม่ได้อยู่ในสายป้อน ( a:3, b:0, c:0, d:1, ...ไม่ตกลง)

ความท้าทายที่แท้จริง:

แปลงตัวละครทุกตัวในรหัสของคุณไปยังเลขฐานสอง 8 บิต (หรือ 16 บิตถ้าคุณกำลังใช้ UTF-16 หรือคล้ายกัน) 0และระบุตัวละครทุกตัวเริ่มต้นที่

ทุกตัวอักษร ( iเป็นแจงนับ) ที่i%7บิต1 ต้อง1เป็น บิตจะถูกกำหนดหมายเลขจากด้านขวา บิตอื่น ๆ ทั้งหมดสามารถเป็นอะไรก็ได้ที่คุณต้องการ

ลองใช้รหัสต่อไปนี้เป็นตัวอย่าง:

[f]-xif)#f

การแปลงเป็นไบนารี่เราจะได้อาร์เรย์ด้านล่าง ตัวเลขแรก (แสดงถึง[มี1ตำแหน่ง 0'th ดังนั้นจึงเป็น OK หมายเลขที่สอง (แทนfได้1ในตำแหน่งที่ 1'st เพื่อให้เป็นที่ตกลงเช่นกันคุณจะเห็น รหัสด้านบนนั้นถูกต้อง

C 76543210 หมายเลข Bit
- -------- ----------
[0101101 1   0 - ตกลง
f 011001 1 0 1 - ตกลง
] 01011 1 01 2 - ตกลง
- 0010 1 101 3 - ตกลง
x 011 1 1,000 4 - ตกลง
ฉัน 01 1 01001 5 - ตกลง
f 0 1 100110 6 - ตกลง
) 0010100 1   0 - ตกลง
# 001000 1 1 1 - ตกลง
f 01100 1 10 2 - ตกลง

หากเราเปลี่ยนรหัสเป็น: ]f[-xif)#fเราจะเริ่มต้นลำดับต่อไปนี้:

C  76543210  Bit number
-  --------  ----------
]  01011101  0   <- OK
f  01100110  1   <- OK
[  01011011  2   <- Not OK
-  00101101  3   <- OK

อย่างที่เราเห็นอักษรตัวที่สาม[ไม่มี1ตำแหน่งที่ 2 (ดัชนีเป็นศูนย์) ดังนั้นรหัสนี้จึงไม่ถูกต้อง

กรณีทดสอบ:

Input:
This is a string containing some symbols: ".#!".#&/#

Output:
   !  "  #  &  /  :  T  a  b  c  e  g  h  i  l  m  n  o  r  s  t  y  .
7  1  2  3  1  1  1  1  2  1  1  1  2  1  5  1  2  4  3  1  6  2  1  2

รูปแบบผลลัพธ์ที่สมเหตุสมผลใด ๆ ก็โอเค (สิ่งใดก็ตามที่สะดวกที่สุดสำหรับคุณ) คุณสามารถเช่นมี: หรือ:7, !:1, ":2, #:3, &:1, /:1, T:1, a:2 ... [ ,7][!,1][",2][#,3][&,1]...เอาต์พุตอยู่ในรูปแบบมาตรฐาน (กลับจากฟังก์ชันพิมพ์ไปยัง STDOUT และอื่น ๆ )

1โมดูลัสi7


นี่คือดังนั้นรหัสที่สั้นที่สุดในไบต์จะชนะโทษ


6
เพื่อเป็นความช่วยเหลือเล็กน้อยนี่คือตัวละครที่คุณได้รับอนุญาตให้ใช้ในn%7จุดที่> pastie.org/pastes/10985263/text
TidB

@TidB เว็บไซต์ออฟไลน์
Rod

1
@ Rod Yeah, Pastie ดูเหมือนจะมีปัญหาบางอย่าง ลองใช้ pastebin แทน
TidB

1
00001010โปรดจำไว้ว่าการขึ้นบรรทัดใหม่ที่เป็น มันก็มีประโยชน์เช่นกัน! :)
Stewie Griffin

1
หากต้องการความช่วยเหลือเพิ่มเติมบางอย่างที่นี่สคริปต์การตรวจสอบคุณสามารถใช้สำหรับ UTF-8 เข้ารหัส เพียงแค็ปซูลอินพุตในสตริงเหมือนตัวอย่าง
AdmBorkBork

คำตอบ:


6

Pyke, 1 6 ไบต์

1cn;1c

ลองที่นี่!

1c     - chunk(size=1, input)
  n;1  - noop. 
     c - count(^)

ครึ่งหนึ่งของรหัสนี้เป็นเพียงไม่เลือก ...

00110001 - 1
01100011 - c
01101110 - n
00111011 - ;
00110001 - 1
01100011 - c

@EriktheOutgolfer มีจุดที่ถูกต้อง ฉันไม่คิดว่ารูปแบบการป้อนข้อมูลนี้ถูกต้องเว้นแต่จริง ๆ แล้วเป็นสตริงปกติใน Pyke มันจะเป็นสตริงอินพุตที่ถูกต้องใน MATLAB / Octave ตั้งแต่'abc'==['a','b','c']นั้นจึงอาจอยู่ใน Pyke ด้วย ...
Stewie Griffin

@StewieGriffin นี่ไม่ใช่วิธีที่ Pyke จัดการกับสตริง หากไม่เป็นไรฉันจะเห็นเกี่ยวกับการเปลี่ยนรูปแบบการป้อนข้อมูล แต่เนื่องจากรายชื่อตัวละครอยู่ภายใต้รายการค่าเริ่มต้นที่ยอมรับแม้ว่านี่อาจนับว่าเป็นการโกงภายใต้
สีน้ำเงิน

5
ขออภัยที่ทำลายความท้าทายของคุณด้วยบิวด์อินขนาด 1 ไบต์ฉันไม่คิดว่าคุณจะเสียใจจริง ๆ และความท้าทายนี้ไม่ได้ทำลายโดย :-)
Luis Mendo

2
นี่ไม่ใช่รายการตัวละคร มันคือรายการของสตริง ในขณะที่รายชื่อตัวละครอยู่ที่+ 17 / -0 , รายการสตริงอยู่ที่+ 2 / -2ดังนั้นจึงไม่ค่อยได้รับการยอมรับค่าเริ่มต้น @StewieGriffin ควรตัดสินใจว่ามันถูกต้องหรือไม่
เดนนิส

1
@StewieGriffin ดีกว่าไหม
บลู

6

Pyth, 12 8 7 ไบต์

-1 ไบต์ขอบคุณ @Loovjo

m+d/Qd{
      { # remove all duplicated elements from the (implicit) input
m       # map each element (d) of the parameter (the set from previous operation)
   /Qd  # count the occurrences of d in Q
 +d     # concatenate with d

การเป็นตัวแทนไบนารี

0110110 1ม
001010 1 1 +
01100 1 00 d
0010 1 111 /
010 1 0001 Q
01 1 00100 d
0 1 111011 {

ลองที่นี่


ดี! :) ผลลัพธ์13ของมัน111ดูแปลก ๆ แต่ก็ไม่สามารถเข้าใจผิดได้ (ไม่มีตัวอักษรเดียว13ที่ใช้ 1 ครั้ง) ดังนั้นมันจึงใช้ได้อย่างสมบูรณ์!
Stewie Griffin

4

Befunge-93, 150 bytes

={<{p+}3/}*77\%*7{7:\+{}{1g}+3/*77\%*7{7:}=:_{}{}={}{}{v#{}{}`x1:~
}-}=*}{2*}97}:<$}={$_v#}!:-*84g+3/*77\%*7{7:}=:}:}+}1{}<_{@#
}{}{}={}{}{}={^.},\={<

ลองออนไลน์!

ฉันเริ่มต้นด้วยการเขียนโปรแกรมนี้เป็นโปรแกรม Befunge ปกติซึ่งฉันเล่นกอล์ฟให้มากที่สุด ฉันเพิ่มการเติมเพื่อให้แน่ใจว่าอักขระต่าง ๆ ในโปรแกรมปรากฏในตำแหน่งที่อนุญาตเท่านั้น การขยายนี้อาศัยความจริงที่ว่าคำสั่งที่ไม่ได้รับการสนับสนุนจะถูกละเว้นใน Befunge-93 ดังนั้นฉันจึงต้องการลำดับของอักขระที่ไม่ได้ใช้ซึ่งบิตนั้นสอดคล้องกับตำแหน่งที่ต้องการ (ลำดับที่ฉันใช้คือ={}{}{})

บิตที่ซับซ้อนคือสาขาต่าง ๆ ระหว่างบรรทัดจำเป็นต้องเรียงแถวอย่างถูกต้อง (เช่นvลูกศรในหนึ่งบรรทัดจะต้องเรียงแถวด้วย<ลูกศรด้านล่าง) นี่คือความซับซ้อนต่อไปโดยข้อเท็จจริงที่ว่าคำสั่งสะพาน (# ) ไม่สามารถแยกออกจากลูกศรแยกย่อยที่อยู่ติดกันได้ ตอนแรกฉันพยายามสร้างช่องว่างแบบเป็นระบบ แต่ในที่สุดมันก็เป็นกระบวนการแบบแมนนวล

เนื่องจากขนาดของโปรแกรมฉันจะไม่แสดงรายการการวิเคราะห์ตัวละครแบบเต็ม แต่นี่เป็นตัวอย่างจากจุดเริ่มต้นและจุดสิ้นสุด:

= 00111101 0
{ 01111011 1
< 00111100 2
{ 01111011 3
p 01110000 4
+ 00101011 5
} 01111101 6
3 00110011 0
/ 00101111 1
...
{ 01111011 1
^ 01011110 2
. 00101110 3
} 01111101 4
, 00101100 5
\ 01011100 6
= 00111101 0
{ 01111011 1
< 00111100 2

การขึ้นบรรทัดใหม่ถือเป็นอักขระขึ้นบรรทัดใหม่ดังนั้นจะอยู่ในตำแหน่งที่ 1 หรือ 3


3

MATL , 17 ไบต์

u"G91x@=zD91x@uRD

แสดงการนับจากนั้นอักขระที่เกี่ยวข้องจะถูกคั่นด้วย newline ทั้งหมด ความยากลำบากที่ยิ่งใหญ่ที่สุดคือสิ่ง@ที่เป็น0b01000000; ฉันหวังว่าฉันสามารถหาวิธีที่จะทำโดยไม่ได้

ลองออนไลน์!

คำอธิบาย:

u"  % Implicit input. Take (u)nique characters and loop (") over them.
G   % Take the input a(G)ain
91x % Filler: push 91, delete immediately.
@   % Push current character of loop
=   % Check for equality with earlier G
z   % Count number of equal characters
D   % Display
91x % More filler!
@   % Get loop character again
uR  % Filler: two NOPs for the single-character @
D   % Display. Implicitly end loop.

MATL, 15 ไบต์ (ผลลัพธ์ที่น่าสงสัย)

หากอนุญาตให้ปล่อยเวกเตอร์สองแถวลงบนสแต็กเท่านั้น (พฤติกรรมคล้ายฟังก์ชั่นตามโพสต์ Meta นี้ ) เราสามารถลงไปได้

u"G91x@=zv]v!Gu

แต่ที่นี่ผลผลิตไม่ได้สั่งเท่าที่ควร


สแต็กถูกพิมพ์โดยปริยายในตอนท้ายของโปรแกรมและรูปแบบผลลัพธ์มีความยืดหยุ่นตามความท้าทายดังนั้นฉันจึงไม่เห็นปัญหาใด ๆ กับวิธีที่สอง
Luis Mendo

@ LuisMendo ฉันไม่แน่ใจ หากคุณมีอักขระอินพุตที่แตกต่างกัน 90 ตัวก็ยากที่จะบอกได้ว่าคีย์ใดเป็นของอักขระตัวใดตัวหนึ่งดังนั้นฉันคิดว่าฉันต้องบอกว่าไม่ให้กับ Sanchises อันนั้น - สตีวีกริฟฟิ 2 ชั่วโมงที่ผ่านมาได้รับการตอบกลับไปยังไฮบริดที่นำเสนอ (นับเป็นรายบุคคลD'D, Guในตอนท้ายของโปรแกรม) และผมไม่แน่ใจว่าถ้ารุ่น 15 ไบต์จะแตกต่างกันพอสมควร
Sanchises

@StewieGriffin คุณอาจลองดูว่ารุ่น 15 ไบต์ ( ลองออนไลน์! ) ตกลงหรือไม่?
Sanchises

ไม่แน่ใจว่า Stewie จะได้รับ ping ในโพสต์นี้ดีกว่าใช้โพสต์ความท้าทาย
Luis Mendo

ไม่ทราบเกี่ยวกับคุณ แต่ฉันไม่คิดว่ามันเข้าใจง่ายที่นี่ :) ฉันชอบโซลูชัน 17 ไบต์แต่อย่าลังเลที่จะเก็บ 15 ไบต์ไว้ในคำตอบด้วย! คำตอบที่ดีโดยวิธี :)
สตีวีกริฟฟิ

1

CJam, 14 ไบต์

q__|_ @sfe=]zp

ลองที่นี่

ช่องว่างด้านหน้าก่อน@และsหลังเป็นอักขระเติมเพื่อแทรกรหัส ASCII ให้พอดีกับรูปแบบที่ต้องการ: พื้นที่ไม่ได้ทำอะไรเลยและsเพียงแค่แปลงสตริงเป็นสตริง นอกจากนั้นนี่เป็นการดำเนินงานที่ท้าทายและเรียบง่ายตรงไปตรงมา:

q_ "อ่านอินพุตและสร้างสำเนา";
  _ | "ยุบตัวอักขระซ้ำในสำเนา";
    _ "บันทึกสำเนาของสตริงที่ยุบ";
      @ "ดึงสตริงอินพุตต้นฉบับไปที่ด้านบนของสแต็ก";
       s "(ไม่ทำอะไรที่นี่)";
        fe = "สำหรับอักขระแต่ละตัวในสตริงที่ยุบให้นับ ... ";
                 "... จำนวนครั้งที่มันเกิดขึ้นในสตริงเดิม";
           ] z "จับคู่การนับด้วยสำเนาที่บันทึกไว้ของสตริงที่ยุบ";
             p "พิมพ์การแทนค่าสตริงของผลลัพธ์";

สำหรับการป้อนข้อมูลรหัสนี้เอาท์พุทfoobar123 [['f 1] ['o 2] ['b 1] ['a 1] ['r 1] ['1 2] ['2 2] ['3 1]]หากเพียงพิมพ์จำนวนในบรรทัดหนึ่งและอักขระที่เกี่ยวข้องในอีกบรรทัดดังเช่นใน:

[1 2 1 1 1 2 2 1]
fobar123

ถือเป็นรูปแบบการออกยอมรับแล้ว]zอาจถูกมองข้ามที่จะบันทึกสองไบต์รวมเป็น12 ไบต์ ใช่รหัสย่อจะยังคงผ่านข้อกำหนดรูปแบบบิต

ps ฉันยังเขียนตัวตรวจสอบซอร์สโค้ดพื้นฐานสำหรับความท้าทายนี้ เมื่อได้รับบรรทัดของรหัสเป็นอินพุทมันจะก้องบรรทัดนั้นแล้วพิมพ์บรรทัดเดียวกันกับตัวละครแต่ละตัวที่ถูกแทนที่ด้วย ( n % 7) บิต ASCII ที่ -th หากบรรทัดที่สองคือบรรทัดทั้งหมดอินพุตจะถูกต้อง


1

เยลลี่ขนาด 6 ไบต์ในเพจรหัสของเจลลี่

ṢZṢṀŒr

ลองออนไลน์!

นี่คือฟังก์ชั่นที่คืนค่ารายการของคู่ (อักขระ, จำนวน) (เจลลี่แสดงรายการเช่นข้อความเช่นถ้าพวกมันถูกส่งไปยังเอาต์พุตมาตรฐานโดยเชื่อมต่อองค์ประกอบซึ่งเป็นสาเหตุที่คุณต้องปฏิบัติต่อสิ่งนี้เป็นฟังก์ชั่นแทนที่จะเป็นโปรแกรมที่สมบูรณ์ ( นี่คือโปรแกรมเดียวกันที่มีรหัสต่อท้ายบางส่วน เรียกใช้ฟังก์ชั่นแล้วพิมพ์โครงสร้างภายในไปยังเอาต์พุตมาตรฐานเพื่อพิสูจน์ว่าเอาต์พุตอยู่ในรูปแบบที่ไม่คลุมเครือ)

การเป็นตัวแทนไบนารีและคำอธิบาย:

  76543210 

Ṣ 1011011 1    เรียงอักขระของอินพุต
Z 010110 1 0 ย้ายรายการ (เป็น 1D ดังนั้นนี่จึงเป็นการรวมรายการไว้ในรายการอย่างมีประสิทธิภาพ)
Ṣ 10110 1 11 เรียงลำดับรายการ (ห้ามใช้เนื่องจากมีองค์ประกอบเดียว)
Ṁ 1100 1 000 ใช้องค์ประกอบที่ใหญ่ที่สุด (เช่นเท่านั้น)
Œ 000 1 0011 ไบต์แรกของคำสั่งสองไบต์
r 01 1 10010 ความยาวตัวเข้ารหัส

จะเห็นได้ว่าตัวอักษรตัวที่สองตัวที่สามและตัวที่สี่ยกเลิกกันและอยู่ที่นั่นเพียงเพื่อรักษารูปแบบบิตที่เราต้องการ Œrแม้ว่าจะสะดวกเกินไปและการซ้อนโปรแกรมเพื่อให้เราสามารถใช้งานได้อาจทำให้เรามีโปรแกรมที่สั้นกว่าการพยายามแก้ปัญหาโดยไม่ต้องใช้บิวอิน

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