ช่วย: Aliens โปรแกรมเมอร์เท่านั้นพูด ASCII


22

จัดฉาก:

มันเป็นช่วงบ่ายโดยเฉลี่ยในขณะที่คุณผ่อนคลายหลังจากเหน็ดเหนื่อยมาทั้งวันด้วยการมีส่วนร่วมในงานอดิเรกที่คุณโปรดปราน: ตอบคำถามที่น่าดึงดูดใจใน PPCG มันไม่ได้เป็นวันที่ดีสำหรับคุณ โปรแกรมเมอร์ Pyth ที่ถูกสาปนั้นจะได้รับคำตอบที่ดีที่สุดและมันก็ทำให้คุณรู้สึกแย่ ทันใดนั้นคุณสังเกตเห็นว่ามีการโพสต์คำถามใหม่! คุณตัดสินใจ ไม่ใช่ CJammers ในเวลานี้ คายคุณเริ่มพิมพ์ให้กำเนิดตัวละคร; ทารกในครรภ์ของวง BrainFuck อันรุ่งโรจน์ที่ผลิตภัณฑ์สุดท้ายของคุณจะเป็น คุณพิมพ์และพิมพ์ ได้เร็วขึ้น! เร็วขึ้น! คุณมุ่งเน้นมากจนคุณไม่สังเกตว่าไฟบนหน้าจอเริ่มกะพริบและดับ ทันใดนั้นมอนิเตอร์ก็ส่องเป็นสีเขียวซึ่งเป็นสัญลักษณ์ของมนุษย์ต่างดาวที่ปรากฏบนเดสก์ท็อป ใช้ทักษะไร้ที่ติของคุณคุณcat ~/Desktop/aliensymbolและนำเสนอด้วยตัวเลขจำนวนหนึ่งข้อความ! การเป็นโปรแกรมเมอร์ PPCG ที่ฉลาดหลักแหลมที่คุณเป็นคุณสังเกตเห็นว่ามันดูเหมือน ASCII ไม่ว่าสำหรับคุณคุณprint(chr(i) for i in file)และถอดรหัสข้อความ ความคิดแรกของคุณ: "ฉันต้องการแบ่งปันสิ่งนี้กับชุมชน!"

...

ใครจะไปคิดบ้าง ว่าคนแรกที่ติดต่อกับมนุษย์ต่างดาวจะเป็นโปรแกรมเมอร์ที่อ่อนน้อมถ่อมตนของ PPCG ทำไมต้องเป็นเรา อาจเป็นเพราะเราเป็นตัวอย่างที่ดีเลิศของความฉลาดของมนุษย์ หรืออาจเป็นเพราะ BrainFuck นั้นใกล้เคียงกับภาษามนุษย์ต่างดาว อย่างไรก็ตามมนุษย์ต่างดาว - ซึ่งเป็นสิ่งมีชีวิตที่ชาญฉลาดนั้นต้องการที่จะทดสอบว่าพวกเขาควรจะจำแนกเผ่าพันธุ์มนุษย์ว่าเป็นคนฉลาดหรือไม่ เพื่อเป็นการทดสอบความสามารถทางจิตของมนุษย์ต่างดาวเราได้ขอให้เราส่งโปรแกรมคอมพิวเตอร์สองสามรายการเพื่อแสดงให้เห็นว่าเราได้รับการอบรมทางด้านเทคโนโลยี ปัญหาคือภาษามนุษย์เดียวที่พวกเขาเข้าใจคือ ASCII เชิงตัวเลข!

ช่วยมนุษย์แสดงสิ่งมีชีวิตเหล่านั้นที่อัลฟาทางปัญญาที่แท้จริงคือ เราจำเป็นต้องส่งสคริปต์ที่จะแปลงซอร์สโค้ดแบบข้อความของเราให้เป็นเวอร์ชัน ASCII ที่เป็นตัวเลข น่าเสียดายเนื่องจากเทคโนโลยีที่ด้อยพัฒนาของเรา (ขอบคุณโอบามา) เราต้องส่งโปรแกรมแปลให้น้อยที่สุดเท่าที่จะทำได้ สิ่งที่ดีที่พวกเขาเลือกที่จะติดต่อ PPCG!

ความท้าทาย:

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

ตัวอย่างนี้จะชี้แจงอย่างมาก การใช้ซอร์สโค้ดของ infamous hello worldเป็นอินพุต:

#include <stdio.h>

int main() {
    printf("hello, world\n");
    return 0;
}

โปรแกรมของคุณควรส่งออก:

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   (   )       {
105 110 116 32  109 97  105 110 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

รายละเอียดการใช้งาน:

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

สิ่งที่ควรทราบ

  • อักขระแต่ละตัวในผลลัพธ์ถูกคั่นด้วย '\ t' เพื่ออนุญาตให้มีช่องว่าง 3 หลักในบรรทัดด้านล่างเพื่อจัดเรียง (เราจะถือว่าแท็บของคุณถูกตั้งค่าเป็น 4 ช่องว่างหรือมากกว่า)
  • บรรทัดใหม่จะปรากฏขึ้นบนบรรทัดที่กดแป้นส่งคืน (สังเกต 10 ในตัวอย่าง)
  • ข้อกำหนดการพิมพ์ '\ t' และ '\ n' นั้นเข้มงวดเกินไป โดยทั่วไปแล้วผลลัพธ์ของคุณจะต้องถูกใจตา (ต้องแสดงเอเลี่ยนที่เรามีความสวยงามเช่นกัน) และถ้าคุณสามารถงอสองจุดก่อนหน้านี้ในขณะที่รักษาความสมบูรณ์ของภาพคุณจะได้รับการอภัย
  • คุณสามารถเลือกได้ว่าจะมีการขึ้นบรรทัดใหม่หรือไม่ในตอนท้ายของบรรทัดสุดท้าย

เกณฑ์การให้คะแนน

นี่คือรหัส - กอล์ฟเพื่อให้โปรแกรมสั้นที่สุดชนะ หมายเหตุแม้ว่าโปรแกรมของคุณจะไม่สั้นที่สุด แต่ใช้เคล็ดลับที่ประณีตจริงๆเมื่อเทียบกับภาษาที่คุณใช้ +1 ของคุณ!

โชคดี. การจัดอันดับความฉลาดทางอวกาศของมนุษยชาติวางอยู่บนไหล่ของคุณ

หมายเหตุ: โปรดยกโทษให้หลุมของพล็อต ฉันไม่ใช่นักเขียน : D


8
อาจลดลงหรือลดความซับซ้อนของ "พล็อต" และเพียงแค่ปล่อยให้ความท้าทาย ฉันจะไม่อ่าน backstory 3 ย่อหน้าโดยสุจริต ฉันแค่จะอ่านความท้าทายเพราะนั่นคือสิ่งที่ฉันอยู่ที่นี่
mbomb007

1
@YetiCGN ตัวแบ่งบรรทัดทำหน้าที่เป็นตัวแบ่งบรรทัด (คุณไม่สามารถเห็นตัวละครที่เป็นตัวแทน แต่คุณสามารถเห็นตัวแบ่ง) และคุณยังคงต้องเขียนอย่างชัดเจนในเวอร์ชัน ascii ลองคิดดูว่าถ้าคุณ regex ค้นหาซอร์สโค้ดสำหรับ '\ n' ทุก ๆ ที่การค้นหาของคุณจะเน้นที่ที่คุณควรเขียน 10 นี่คือตัวอย่างจากเสียงเรียกเข้า (ละเว้นคนสุดท้าย)
gowrath

26
@ mbomb007 tbh นั่นเป็น backstory มหากาพย์ที่น่ารัก ฉันชอบมันมาก
Maltysen

7
@ mbomb007 ผู้ที่ต้องการอ่านสามารถผู้ที่ไม่สามารถตรงไปยังส่วนที่ท้าทาย เช่นนี้เป็นความงามของคำบรรยาย
gowrath

1
ฉันอ่านมันว่า "คนแรกที่ติดต่อกับมนุษย์จะเป็นโปรแกรมเมอร์ที่อ่อนน้อมถ่อมตนของ PPCG"
marczellm

คำตอบ:


5

Dyalog APL ขนาด 14 ไบต์

รับรายการสตริงที่มีลำดับการขึ้นบรรทัดใหม่ (10 หรือ 13 10 เป็นต้น)

↑(⊢,[.5]⎕UCS

ครบกำหนดรายชื่อของรายการที่ประกอบด้วย

(... สำหรับการกลับมาแต่ละบรรทัด ...

ข้อความตัวเอง

,[.5] ตามด้วยมิติใหม่ก่อนมิติแรกโดย

⎕UCSU nicode C haracter S et จุดรหัส

ลองใช้ออนไลน์!


คุณไม่เรียกใช้สิ่งนี้หนึ่งครั้งต่อแต่ละบรรทัดแทนที่จะป้อนข้อมูลทั้งหมดพร้อมกันหรือไม่
Steven H.

1
@StevenH ไม่ฟังก์ชัน (ส่วนขวาสุดของ) มีการวนรอบ แต่โดยรวมจะเรียกเพียงครั้งเดียว ดูตัวอย่าง TryAPL ที่fถูกเรียกโดยตรงบนอินพุต ฟังก์ชั่นในการโทรครั้งต่อบรรทัดถ้าจะได้กล่าวว่า
อดัม

9

Pyth, 17 13 ไบต์

อีกหนึ่งในโปรแกรมเมอร์ Pyth ขอโทษ

รหัสใหม่จะต้องห่อแต่ละบรรทัดด้วยเครื่องหมายคำพูดและหลบหนี (รวมถึงการขึ้นบรรทัดใหม่หากคุณต้องการให้พิมพ์บรรทัด) แต่ให้เพิ่มบรรทัดใหม่ระหว่างบรรทัดและ ASCII

jjLC9smCMBd.Q

ลองออนไลน์!

คำอธิบาย:

           .Q  Evaluate all input lines
      m        For each of those lines:
         Bd     Return the line and
       CM       the line mapped to ASCII characters
     s         Sum all these together to begin alternating between line and mapped line
 jLC9          Join all the characters and numbers in the lines and mapped lines on tabs
j              And join all of those on newlines

ฉันกำลังเก็บรหัสเก่าและคำอธิบายของมันไว้ด้านล่าง

#Jw
jKC9J
jK+CMJT

ลองออนไลน์!หรือใช้กรณีทดสอบที่อ่านง่ายกว่ากรณีทดสอบง่ายต่อการอ่าน

คำอธิบาย:

#                  Until we run into an error:
 Jw                 Read in the next line of input and call it J.
                     (When there is no line of input, error is thrown that ends program.) 

j                  Join: 
    J               all characters in input line
 KC9                and insert tab characters (C9), which we can refer to later as K.
                        (Setting it to a variable doesn't save or lose bytes.)

                   Implicit print that join with trailing newline.

j                  Join:
   CMJ              the mapping of ASCII numbers to characters in the input,
 K                  inserting tab characters in between every number
  +   T             And with a trailing 10 for the newline at the end.

1
ฉันคิดว่าลิงก์แรกของคุณใช้งานไม่ได้และลิงก์ที่สองทำ (ไม่พิมพ์บรรทัดใหม่ที่ฉันคิด) คุณอาจต้องการอัพเดทรหัส
gowrath

8

Python 2, 105 ไบต์

วิธีนี้ใช้วิธีที่แตกต่างจากคำตอบของ OP เล็กน้อย โปรดทราบว่าดังนั้น messes แท็บตัวอักษรของฉันมีช่องว่าง

def f(s):
 o=x=''
 for c in s:
    o+=c+"  ";x+="%s    "%ord(c)
    if"\n"==c:print o[:-1],x;o=x=''
 print o+"\n"+x

ลองออนไลน์


จะไม่x+=ord(c)+" "สั้นกว่านี้"%s "%ord(c)หรือ
DJMcMayhem

@DJMcMayhem คุณไม่สามารถผนวกจำนวนเต็มต่อท้ายสตริงได้ x+=`ord(c)`+" "มีความยาวเท่ากัน
mbomb007

8

เป็นกลุ่ม, 86, 77 การกดแป้น

:g/^/norm A<C-v><C-v>10<C-v><esc>Yp:s/./\=char2nr(submatch(0))."\t"/g<C-v><cr>k:s/./&\t/g<C-v><cr>
:%s/<C-v><cr>0<cr>

นี่เป็นวิธีที่ยาวเกินไป แต่นั่นคือสิ่งที่คุณจะได้รับเมื่อใช้evalคุณสมบัติของกลุ่ม( \=)


6
ไม่สามารถบอกได้ว่าคุณ\=กำลังอธิบายคุณสมบัติการประเมินหรือหน้าเศร้าเพราะคุณกำลังใช้คุณสมบัติการประเมิน ...
AdmBorkBork

2
@timmyD ครั้งแรก นี่คือหน้าเศร้าของฉัน D;
DJMcMayhem


6

Perl, > 33 31 ไบต์

รวมถึง +3 สำหรับ-F(ไม่สามารถใช้ร่วมกับ-eและรหัสได้'เช่นกันดังนั้นพื้นที่และ-นับด้วย)

รันด้วยอินพุตบน STDIN หรือกำหนดชื่อไฟล์ตั้งแต่หนึ่งชื่อขึ้นไปเป็นอาร์กิวเมนต์

perl -M5.010 asciidump.pl <<< "Hoi"

asciidump.pl

#!/usr/bin/perl -F
$"=v9;say"@F@{[unpack'W*']}"

เอาต์พุตไม่สวยงามถ้าข้อความมีแท็บหรือไม่มีบรรทัดใหม่สุดท้าย


5

Pyth, 21 ไบต์

j.imjC9d.zmjC9+CMdT.z

นี่คือรายการจากหนึ่งใน"โปรแกรมเมอร์ Pyth เหล่านั้น" ;)

โปรแกรมที่รับอินพุตของสตริงหลายบรรทัดที่ไม่ได้ระบุบน STDIN และพิมพ์ผลลัพธ์ นี่ถือว่าข้อมูลทั้งหมดมีการขึ้นบรรทัดใหม่ หากคุณต้องการให้มันจัดการกับการขึ้นบรรทัดใหม่ไม่ทันเพิ่ม<ที่จุดเริ่มต้นของโปรแกรมและ)_3ท้าย

ลองออนไลน์

ผลลัพธ์สำหรับกรณีทดสอบยากที่จะเห็นในล่ามออนไลน์ดังนั้นฉันได้รวมไว้ที่นี่:

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   t   (   )       {
105 110 116 32  109 97  105 110 116 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

มันทำงานอย่างไร

j.imjC9d.zmjC9+CMdT.z  Program. Input: .z (All of STDIN split on newlines)
     C9                 Yield tab character by taking chr(9)
    j                   Join on tab
   m   d.z             Map that over .z
               CM       Map ord()
              +   T     Append 10
           jC9          Join on tab
          m      d .z  Map that over .z
 .i                    Interleave the results of the two mappings
j                      Join on newlines
                       Implicitly print

คุณสามารถบันทึก 2 ไบต์โดยการกำจัด.zและการป้อนข้อมูลเป็นรายการของสาย
Maltysen

1
@ Maltysen ตัดสินจากคำถามและคำตอบอื่น ๆ ฉันคิดว่าการแบ่งบรรทัดใหม่เป็นส่วนหนึ่งของความท้าทาย
TheBikingViking

5

C, 136 117 114 Bytes

#define p(s)while(l[i])printf(s,l[i++]);i=0;puts("")
char l[99];i;f(f){while(fgets(l,99,f)){p("%c\t");p("%d\t");}}

char l[99];i;f(f){while(fgets(l,256,f)){i=0;while(l[i])printf("%c\t",l[i++]);i=0;puts("");while(l[i])printf("%d\t",l[i++]);puts("");}}

สามารถทดสอบได้เช่นนี้

infile;
main(c,v)char**v;
{
    infile=fopen(v[1],"r");
    f(infile);    
}

การมีchar**vอยู่ข้างในmain()จะช่วยให้คุณประหยัด 2 ตัวละคร ..
อเล็กซิสวิลเก

เอ่อฉันแค่นับ 114 ไบต์ในรหัสนั้น ฉันคิดว่าคุณกำลังใช้ CRLF แทน LF (117-> 115) และคุณมีบรรทัดใหม่ที่ต่อท้าย (115-> 114)
ทิม Sepas

4

PowerShell v2 +, 85 ไบต์

gc $args|%{$a=$b='';$_-split'(.)'-ne''|%{$a+="$_`t";$b+="$(+[char]$_)`t"};$a;$b+"10"}

การป้อนข้อมูลผ่านเส้นทางไปยังไฟล์ จากนั้นเราGet-Content(นามแฝงgc) ในไฟล์ดังกล่าวซึ่งแยกบรรทัดใหม่โดยอัตโนมัติ |%{...}เราห่วงแต่ละคน เริ่มต้นด้วยการตั้งค่า$aและ$bเป็นสตริงว่าง - นี่คืออักขระ ASCII และรหัสจุดตามลำดับ จากนั้นเราก็-splitใส่บรรทัดของตัวละครทุกตัวลงไป(.)และลบค่าว่าง-ne'' (เนื่องจากวิธี. NET regex แยกวิเคราะห์) จากนั้นส่งพวกเขาไปยังวงอื่น

แต่ละวงภายในเราสตริง concatenate ตัวละครในปัจจุบันมีแท็บและเพิ่มที่เข้าสู่`t $aเช่นเดียวกัน$bยกเว้นเรากำลังคัดเลือกให้เป็นcharและจากนั้น+int

นอกวงด้านในเราวางผลลัพธ์$aและ$b(ด้วยตัวออกแบบบรรทัดป้อนเนื่องจากจะไม่เกิดขึ้นในการวนซ้ำของเรา) บนไปป์ไลน์ สิ่งเหล่านี้รวมเข้าด้วยกันWrite-Outputเมื่อโปรแกรมเสร็จสมบูรณ์

ตัวอย่าง

(ด้วยความเข้าใจว่าฉันได้รับการป้อนบรรทัดและ Markdown ทำให้แท็บอักขระ)

PS C:\Tools\Scripts\golfing> .\aliens-only-understand-ascii.ps1 '.\aliens-only-understand-ascii.txt'
#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >   
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   t   (   )       {   
105 110 116 32  109 97  105 110 116 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   w   ,       w   o   r   l   d   \   n   "   )   ;   
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 119 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;   
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}   
125 10

ประณามฉันเพิ่งเขียนคำตอบ PowerShell ในขณะที่การจัดการที่จะพลาดอย่างสมบูรณ์! ดีใจเสมอที่ได้เห็นตัวแทนสุดหรู! :)
ต้มตุ๋น

4

> <> (ปลา) 48 ไบต์

>i:0(?v::oa=?v9o
2';'oa<.20r  <~p3
o9nv?=0l
voa<

งานที่ภาษาเปล่งประกายอยู่! ฉันแน่ใจว่าฉันน่าจะเล่นกอล์ฟเพิ่มอีกสักหน่อย แต่มันก็เป็นสัปดาห์ที่ยาวนาน อาจจะดูในภายหลังว่า

ลองออนไลน์!

ลองเลือกแบบออนไลน์ที่ดูดีกว่าในความคิดของฉัน แต่การตัดข้อความยุ่งเล็กน้อยสำหรับการป้อนข้อมูลที่มีเส้นยาวเช่นกรณีทดสอบ


4

PHP, 131 115 ไบต์

แค่ FGITW ฉันอาจปรับปรุงให้ดีขึ้นได้อีก ปรากฎฉันทำได้!

รุ่นแรกที่ 131 ไบต์:

<?$s=file($argv[1]);foreach($s as$l){$a=str_split(trim($l));echo join(' ',$a).'
';$i=0;while($c=ord($l{$i++}))echo$c.'  ';echo'
';};

ชื่อไฟล์ถูกระบุเป็นอาร์กิวเมนต์แรกหลังชื่อสคริปต์: php aliens.php helloworld.c

รุ่นที่สองที่ 115 ไบต์:

function($s){foreach($s as$l){$a=str_split($l);echo join('  ',$a);$i=0;while($c=ord($a[$i++]))echo$c.'  ';echo'
';}};

เวอร์ชันแรกบัญชีสำหรับบรรทัดใหม่ที่ขาดหายไปที่ท้ายบรรทัด แต่หลังจากการชี้แจงเพิ่มเติมเราสามารถปล่อยโค้ดนั้นและวางทุกอย่างในฟังก์ชันเพื่อบันทึก 16 ไบต์

ตัวละครในช่องว่างjoin(' ',$a)เช่นเดียวกับในecho$c.' 'ตัวละครแท็บ \t= บรรทัดใหม่ในรหัสมีจุดมุ่งหมาย


3

Python 3, 89 77 ไบต์

รุ่น golfed เพิ่มเติมตามแนวคิดเดียวกัน:

def f(s):
 for a in s:print(*map('{:>4}'.format,[*a,*a.encode()]),end='\n\n')

หากมี '\ t ในการป้อนข้อมูลแล้วเปลี่ยนไป49

รุ่นก่อนหน้า:

def f(s):
 for l in s:
  print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')

รับรายการสตริงแต่ละอันลงท้ายด้วย '\ n'


protip: คุณสามารถออกจากงบพิมพ์บนท้ายของfor l in sIEfor l in s:print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')
ทำลายมะนาว

ฉันยังไม่ได้ทดสอบ แต่ฉันคิดว่าจะสามารถถอดออกได้ 8 แบบlambda s:'\n\n'.join(*map('{:>4}'.format,[*a,*a.encode()])for a in s)
DJMcMayhem

3

Powershell, 56 ไบต์

gc $args|%{($a=[char[]]$_)-join"    ";[int[]]$a+10-join"    "}

สคริปต์ยอมรับพา ธ ไฟล์เป็นอินพุต รับเนื้อหาโดยอัตโนมัติแยกการป้อนข้อมูลลงในอาร์เรย์ของสตริงแยกขึ้นบรรทัดใหม่ในแหล่งที่มา

จากนั้นฉันป้อน foreach ส่งไปยังอาร์เรย์ของอักขระและตั้งค่าเป็น $ a เข้าร่วมด้วยแท็บและพิมพ์ ต่อไป แต่ก็ยังอยู่ใน foreach ที่ฉันส่งอาร์เรย์อักขระไปยังอาร์เรย์จำนวนเต็มผนวก linefeed และเข้าร่วมอีกครั้งด้วยแท็บ

การโทรมีลักษณะเช่นนี้:

PS C:\PretendFolder> .\aoua.ps1 ".\aoua.txt"

และนี่คือตัวอย่างผลลัพธ์

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   (   )       {
105 110 116 32  109 97  105 110 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

2

JavaScript (ES6), 94 ไบต์

s=>s.replace(/(.*)\n?/g,(s,n)=>n&&[...s].join`␉`+`
${[...n].map(c=>c.charCodeAt()).join`␉`}
`)

โดยที่␉หมายถึงอักขระแท็บตัวอักษร ทำงานตราบเท่าที่อินพุตไม่มีอักขระแท็บ รุ่น 81- ไบต์ที่ต้องการอินพุตเพื่อให้มีบรรทัดใหม่ต่อท้าย:

s=>s.replace(/.*\n/g,s=>[...s].join`␉`+[...s].map(c=>c.charCodeAt()).join`␉`+`
`)

ผมคิดว่าอาจจะชนะมากกว่า.split().map() .replace()เมื่ออักขระที่หลบหนีได้รับการปรับให้เหมาะสมกับ backticks ควรเป็น 85 ไบต์: s=>s.split('\n').map(c=>(s=[...c]).join('\t')+'\n'+s.map(c=>c.charCodeAt()).join('\t')).join('\n')(ขออภัยฉันไม่รู้ว่าจะรวม backticks ในความคิดเห็นได้อย่างไร)
Arnauld

@Arnauld ใช้ไม่ได้กับ (เช่น) อักขระขึ้นบรรทัดใหม่ นอกจากนี้หากต้องการรวม backticks ในความคิดเห็นนำหน้าด้วย backslash
Neil

2

C #, 64 63 ไบต์

s=>{foreach(int c in s+(s=""))s+=c+(10==c?"\n":"    ");return s;};

-1 ไบต์โดยใช้อักขระแท็บจริงแทน \tไบต์โดยใช้อักขระแท็บจริงแทน หมายเหตุ: แสดงผลเป็น 4 ช่องว่างด้านบนและ 2 ช่องว่างในรุ่นที่ไม่ได้บรรจุด้านล่าง

Ungolfed:

/*Func<string, string> Lambda =*/ s =>
{
    // Enumerate the ascii (int) values of the chars in s, 
    // but at the same time set input s to "" to use at the output var.
    // +(s="")   is 2 bytes less than   var o="";
    foreach (int c in s + (s=""))
        // Append the string representation of the ascii value,
        // Append new line if c was new line, otherwise append tab. 
        s += c + (10==c ? "\n" : "  ");
    return s;
};

ผล:

(หมายเหตุ: Visual Studio ใช้\r\nสำหรับบรรทัดใหม่เมื่อฉันวางอินพุตดังนั้นการ13 10สิ้นสุดบรรทัดในเอาต์พุต)

Input:

#include <stdio.h>

int maint() {
    printf("hello, world\n");
    return 0;
}

Output:

35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  13  10
13  10
105 110 116 32  109 97  105 110 116 40  41  32  123 13  10
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  13  10
32  32  32  32  114 101 116 117 114 110 32  48  59  13  10
125 

2

CJam, 27 ไบต์

qN/{_1/9c*N+\{is9c}%+}%AN+*

ลองออนไลน์!

คำอธิบาย

q       e# Take the whole input
N/      e# Split on newlines
{       e# Map this block to every line:
_        e# Duplicate
1/       e# Split into characters
9c*      e# Join with tabs (ASCII code 9)
N+       e# Append a newline
\        e# Swap top elements
{is9c}%  e# Map each character to its ASCII code plus a tab character
+        e# Concatenate the two lines
}%      e# (end of block)
AN+*    e# Join with "10" plus a newline

1/และsไม่จำเป็น
Martin Ender

2

PowerShell, 61 59 ไบต์

gc m|%{$b="$_
"[0..$_.Length]
$b-join'    '
[int[]]$b-join' '}

สิ่งที่ควรทราบ:

  • อ่านอินพุตจากไฟล์ที่มีชื่อmในไดเร็กทอรีปัจจุบัน
  • ตัวแบ่งบรรทัดทั้งหมด (รวมถึงอันที่ฝังอยู่ในสตริงหลังอันแรก$_) เป็นตัวป้อนบรรทัดที่แท้จริงเท่านั้น (0xA) ดังนั้นหนึ่งไบต์ต่อกัน
  • เนื้อหาของสตริงโดยตรงหลังจาก -joinโอเปอเรเตอร์คืออักขระแต่ละแท็บเดียว (ไม่ว่าจะแสดงที่นี่อย่างไร)

Ungolfed

Get-Content m | ForEach-Object -Process { # Read the file line by line
    $b = "$_`n"[0..$_.Length]   # Line by line processing strips line endings, so add a newline
                                # Index operator on a [string] returns a [char], or given a [range], a [char[]]
                                # Using $_.Length automatically accounts for the extra linebreak (0 based index)
    $b -join "`t"               # PowerShell displays [char] as the printable character by default, so join the array with a tab
    [int[]]$b -join "`t"        # We need to convert the [char]s to an [int]s so we can display it as a number
                                # So cast the [char[]] as [int[]], then join with tab again

}

รหัสของคุณกำลังพิมพ์ ascii 13 ขึ้นบรรทัดใหม่แทนที่จะเป็น 10 คืนค่าขนส่งเหมือนในตัวอย่างผลลัพธ์ของการท้าทาย
Chirishman

@Chirishman PowerShell รองรับการใช้งานเฉพาะ ASCII 10 สำหรับการแบ่งบรรทัดในไฟล์. ps1 แต่อาจเป็นเรื่องยากที่จะทำเช่นนั้นใน Windows ด้วยโปรแกรมแก้ไขข้อความส่วนใหญ่ การใช้ SCiTE หรือ Notepad ++ หรือตัวแก้ไขการรับรู้บรรทัดอื่น ๆ คุณสามารถมั่นใจได้ว่ามันใช้จุดสิ้นสุดยูนิกซ์ เมื่อคุณแน่ใจแล้วว่าไฟล์ไม่มีตัวอักษร 13 ตัวใดไฟล์หนึ่งก็จะพิมพ์ไฟล์ตัวที่ 10
ต้มตุ๋น

0

Java, 202 ไบต์

s->{for(String g : s.split("\n")){g.chars().forEach(c->System.out.print((char)c+"   "));System.out.println();g.chars().forEach(c->System.out.print(c+(c<10?"  ":c<100?"  ":" ")));System.out.println();}};

ฉันไม่สามารถแม้แต่จะทำให้เรื่องนี้สั้นลงได้อีก ..



-1

Python 3, 92 97 107 ไบต์

สำหรับ i ในรายการ (open (อินพุต ()). read (). split ("\ n")): สำหรับ j ใน i: print (i + "\ n" + ord (j))

p=print
for i in list(open(input()).read().split("\n"))
    s=t=''
    for j in i:
        r=str(ord(j))
        s+=j+' '*len(r)
        t+=r+' '
    p(s)
    p(t)

สิ่งนี้ไม่ได้ทดสอบ แต่ควรใช้งานได้

ขอบคุณ @gowrath ที่ชี้ให้เห็นว่ารหัสไม่ได้ทำตามที่ระบุ


ทำไมไม่ input()คำสั่งทั้งหมดกำลังทำอยู่นั่นคือเรียกชื่อไฟล์ให้เปิด
sonrad10 10 Sep16

@gowrath โอ้โห
sonrad10 10 Sep16

สิ่งนี้ไม่ได้ซ้อนทับข้อความและผลลัพธ์ ASCII เช่นเดียวกับในข้อกำหนดของคำถาม; เพียงพิมพ์ตัวเลข
gowrath

@gowrath ขอบคุณฉันจะแก้ไขโดยเร็ว
sonrad10 10 Sep16

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