ข้อความไซน์


30

เป้าหมาย:เขียนโปรแกรมหรือฟังก์ชั่นที่พิมพ์สตริงอินพุตในรูปแบบไซน์

ไซน์ไซนัส ASCII

นี่คือช่วงเวลาหนึ่งของไซนัสอยด์:

         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         

โปรดทราบว่าแต่ละจุดมีจุดหนึ่งจุดอย่างแน่นอน

  • อักขระแต่ละตัวในสตริงอินพุตจะแทนที่จุดในรูปร่างด้านบนจากซ้ายไปขวา
  • ช่องว่างในอินพุตจะต้องถูกเอาต์พุตเช่นอักขระปกติแทนจุด
  • อักขระเริ่มต้นสอดคล้องกับจุดซ้ายสุดในรูปด้านบน
  • นี่เป็นเพียงช่วงเวลาเดียวอินพุตอาจยาวกว่าจำนวนจุดด้านบน

อินพุต

  • อินพุตเป็นสตริง ASCII ที่มีเฉพาะอักขระระหว่าง ASCII ทศนิยม 32 (ช่องว่าง) และ ASCII ทศนิยม 126 (Tilde ~)
  • อินพุตจะเป็นหนึ่งบรรทัดเท่านั้น (ไม่มีการแบ่งบรรทัด)
  • อินพุตสามารถถ่ายผ่าน STDIN, พารามิเตอร์ฟังก์ชัน, อาร์กิวเมนต์บรรทัดคำสั่งหรือสิ่งอื่นที่คล้ายคลึงกัน

เอาท์พุต

  • จะต้องพิมพ์งานออกมาตรงตามที่ระบุในกรณีทดสอบ
  • ช่องว่างต่อท้ายบนบรรทัดได้รับอนุญาตตราบใดที่ความยาวของบรรทัดที่มีช่องว่างต่อท้ายไม่เกินความยาวของบรรทัดที่ยาวที่สุด (อันที่มีอักขระตัวสุดท้ายอยู่)
  • ไม่อนุญาตให้นำหน้า / ต่อท้ายบรรทัด

กรณีทดสอบ

  • การป้อนข้อมูล: .................................................

เอาท์พุท:

         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         
  • การป้อนข้อมูล: Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

เอาท์พุท:

         ng Puzz                                         ion and                                         siasts                                          stratio           
      mmi       les                                   est        an                                   thu       and                                   egi       n r        
    ra              &                               qu             sw                               en              c                                r             eq      
   g                                                                 e                                               o                             o                 u     
  o                   C                           a                   r                           e                   d                           n                   i    
 r                     o                                                                         l                     e                                               r   
P                       d                       s                       s                       z                                               ,                       e  
                         e                     i                         i                     z                         g                     e                         d 
                                                                          t                   u                           o                   e                           .
                           G                 e                             e                 p                             l                 r                             
                            ol             ng                                f             g                                fe              f                              
                              f S       cha                                   or        min                                   rs.       00%                                
                                 tack Ex                                         program                                          It's 1                                   
  • การป้อนข้อมูล: Short text.

เอาท์พุท:

         t.
      tex  
    t      
   r       
  o        
 h         
S          
  • การป้อนข้อมูล: The quick brown fox jumps over the lazy dog

เอาท์พุท:

          brown                            
      ick       fox                        
    qu              j                      
                     u                     
  e                   m                    
 h                     p                   
T                       s                  

                          o                
                           v               
                            er             
                               th       dog
                                 e lazy    

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

นี่คือดังนั้นโปรแกรมหรือฟังก์ชั่นที่สั้นที่สุดในหน่วยไบต์ชนะ


นี่คือสิ่งที่ฉันคิด
Beta Decay

โอ้ฉันเห็นว่ามันค่อนข้างคล้ายกัน
เสียชีวิต

บังเอิญคลื่นของคุณไม่ได้เป็นไซน์ (โดยธรรมชาติฉันพยายามใช้sinฟังก์ชั่นในการทำซ้ำ แต่ตำแหน่งต่างออกไปเล็กน้อย)
David Z

@DavidZ นั่นไม่ทำให้ฉันประหลาดใจเลยฉันดูรูปร่าง ASCII คุณสามารถรับบางสิ่งบางอย่างโดยไม่มี "ช่องว่าง" ในคอลัมน์ (เช่นหนึ่งจุดต่อคอลัมน์) หรือไม่
ทำให้เสียชีวิต

4
ฉันใช้เวลาสองสามนาทีเพื่อให้ความบันเทิงด้วยตัวเองโดยการเลื่อนแถบเลื่อนบนเอาต์พุตของเคสทดสอบ 2 ไปมาอย่างรวดเร็ว
mbomb007

คำตอบ:


7

Pyth, 59 ไบต์ (57 ตัวอักษร)

Xjb.sC.>V+R*12\ Xz\ C9*+-L12K+JsM._+6jC\཈2tP_JKlz]*dlzC9d

สาธิต.

ตารางการค้นหาไบนารีจะถูกเข้ารหัสภายในซึ่งมีมูลค่า 3912. [1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0]นี้จะถูกแปลงเป็นไบนารีให้ สิ่งนี้ถือเป็นความแตกต่างระหว่างความสูงต่อเนื่อง โดยการเติม 6 เป็นการสร้างส่วนนำหน้าทั้งหมดและการจับคู่แต่ละรายการกับผลรวมของไตรมาสแรกของคลื่นจะถูกสร้างขึ้น

sM._+6jC\཈2ประเมิน[6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12]ตามที่อธิบายไว้ข้างต้น จากนั้นรหัสจะต่อกันที่ด้านหลังของสายนี้เพื่อก่อให้เกิดครึ่งแรกของคลื่นแล้วจึงลบออกจาก 12 เพื่อให้คลื่นทั้งหมด

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

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


@FryAmTheEggman แก้ไขค่าใช้จ่าย 16 ไบต์
isaacg

12

Python 2, 156 ไบต์

l=map(int,"654322111%08d1122345"%1);l+=[12-c for c in l]
def f(t):
 h=len(t);o=bytearray(' '*h+'\n')*13;i=0
 for c in t:o[i-~h*l[i%48]]=c;i+=1
 print o[:-1]

คำอธิบาย

  • โค้ดทั้งหมดก็ทำให้บล็อกของช่องว่าง (กo) tและแทนที่ช่องว่างที่เหมาะสมกับตัวอักษรของการป้อนข้อมูล

  • ตัวแปรจัดlเก็บรายการออฟเซ็ตจากด้านบน เพื่อให้nตัวละครของวันที่ควรจะอยู่ในสายtl[n]

  • bytearray oทำหน้าที่เป็นสตริงที่ไม่แน่นอนเนื่องจากสตริงนั้นไม่เปลี่ยนรูปในไพ ธ อน

  • -~hเหมือนกับh+1แต่ประหยัดพื้นที่เพราะฉันไม่ต้องการวงเล็บ


7

Java, 219 209 199 ไบต์

void p(char[]s){int r=6,c;String t="";for(;r>-7;r--,t+='\n')for(c=0;c<s.length;c++)t+=(s(c%48)==r?s[c]:' ');System.out.println(t);}int s(int a){return a<4?a:a<6?4:a<9?5:a<15?6:a<24?s(24-a):-s(a-24);}

ฉันยังเป็นมือใหม่ที่นี่และหวังว่ามันจะเป็นไปตามกฎที่จะแนะนำฟังก์ชั่นย่อย (เมื่อนับจำนวนไบต์ของฟังก์ชั่นนี้แน่นอน) ถ้าไม่ฉันจะพยายามแปลงsinฟังก์ชั่นเป็นการค้นหาอาร์เรย์ที่ฉลาด ...

public class SinusText
{
    public static void main(String[] args)
    {
        SinusText s = new SinusText();
        s.p(".................................................".toCharArray());
        s.p("Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.".toCharArray());
        s.p("Short text.".toCharArray());
        s.p("The quick brown fox jumps over the lazy dog".toCharArray());
    }
    void p(char[]s){int r=6,c;String t="";for(;r>-7;r--,t+='\n')for(c=0;c<s.length;c++)t+=(s(c%48)==r?s[c]:' ');System.out.println(t);}int s(int a){return a<4?a:a<6?4:a<9?5:a<15?6:a<24?s(24-a):-s(a-24);}
}

1
char[]สำหรับบางคนความท้าทายสตริงตามมันยังช่วยประหยัดถ้าคุณใช้การป้อนข้อมูลเป็น ที่นี่มันจะกำจัดตัว()ต่อlengthและกำจัดcharAt()เช่นกัน ถ้าฉันอ่านมันถูกต้องคุณสามารถใช้print()แทนprintln()เพื่อประหยัดอีกสองสาม
Geobits

@Geobits เหล่านี้เป็นระดับของเสรีภาพที่ฉันไม่ได้ตระหนักถึง คำอธิบายงานพูดถึง "String" ดังนั้นฉันคิดว่ามันจะต้องเป็น "THE" การแสดงสตริงของภาษานั้น ๆ ...
Marco13

ใช่ฉันถามเกี่ยวกับเมตาในบางเวลา นี่คือลิงค์สำหรับการอ้างอิง: meta.codegolf.stackexchange.com/q/2214/14215
Geobits

ขอบคุณ 209 แล้ว (บางทีฉันอาจจะพยายามบีบออกอีกสองสามไบต์ในภายหลังฟังก์ชั่น "บาป" ยังดูเหมือน verbose มากเกินไป ... )
Marco13

1
อืมไม่ได้มีการปรับปรุงมาก แต่คุณสามารถตัด 10 ด้วยการทำสิ่งที่ทั้งโมดูลัส 48. เปลี่ยนสิ้นไปและเรียกมันด้วย...a<24?s(24-a):-s(a-24); s(c%48)
Geobits

4

Perl, 222 ไบต์

$n[$_%13].=substr$l[$_/13],$_%13,1for 0..13*(@l=map{(map{sprintf"%013b",$_}@t=(64,128,256,512,(1024)x2,(2048)x3),(4096)x7,reverse@u=(32,16,8,4,4,2,2,2),(1)x7,(reverse@u),@t)[$-++%48]=~s/./$&?$_:$"/egr}<>=~/./g);$,=$/;say@n

จำเป็นต้องใช้-Eสำหรับการจัดsayเก็บตำแหน่งเป็นจำนวนเต็มส่งไปยังหมายเลขไบนารีและพลิกของอาร์เรย์อาจไม่ได้มีประสิทธิภาพมากไบต์ฉลาด นอกจากนี้ฉันแน่ใจว่ามีเงินออมจำนวนมากที่ต้องทำดังนั้นฉันจะพยายามกระตุ้นและกระตุ้น

ตัวอย่างผลลัพธ์:

$perl -E '$n[$_%13].=substr$l[$_/13],$_%13,1for 0..13*(@l=map{(map{sprintf"%013b",$_}@t=(64,128,256,512,(1024)x2,(2048)x3),(4096)x7,reverse@u=(32,16,8,4,4,2,2,2),(1)x7,(reverse@u),@t)[$-++%48]=~s/./$&?$_:$"/egr}<>=~/./g);$,=$/;say@n' <<< '.................................................'
         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         

$perl -E '$n[$_%13].=substr$l[$_/13],$_%13,1for 0..13*(@l=map{(map{sprintf"%013b",$_}@t=(64,128,256,512,(1024)x2,(2048)x3),(4096)x7,reverse@u=(32,16,8,4,4,2,2,2),(1)x7,(reverse@u),@t)[$-++%48]=~s/./$&?$_:$"/egr}<>=~/./g);$,=$/;say@n' <<< 'Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It'\''s 100% free, no registration required.'
         ng Puzz                                         ion and                                         siasts                                          stratio           
      mmi       les                                   est        an                                   thu       and                                   egi       n r        
    ra              &                               qu             sw                               en              c                                r             eq      
   g                                                                 e                                               o                             o                 u     
  o                   C                           a                   r                           e                   d                           n                   i    
 r                     o                                                                         l                     e                                               r   
P                       d                       s                       s                       z                                               ,                       e  
                         e                     i                         i                     z                         g                     e                         d 
                                                                          t                   u                           o                   e                           .
                           G                 e                             e                 p                             l                 r                             
                            ol             ng                                f             g                                fe              f                              
                              f S       cha                                   or        min                                   rs.       00%                                
                                 tack Ex                                         program                                          It's 1                                   

3

JavaScript, 251 243 224 220 217

การใช้งานที่ง่ายมาก: มันใช้สตริงของอักขระเพื่อแสดงตำแหน่ง y ของแต่ละอักขระบน wave (ชดเชยด้วยaซึ่งเป็นรหัส ASCII 97) จากนั้นจะวนซ้ำแถวที่เป็นไปได้ทั้งหมด ถ้าค่า y ของแถวปัจจุบันเหมือนกันกับตำแหน่ง y บนคลื่นมันเขียนอักขระจากสตริง นอกจากนี้ยังมีการล้างข้อมูลในตอนท้ายเพื่อลบแถวหากปรากฏว่าว่างเปล่า

โปรดทราบว่าผลลัพธ์จะไม่ปรากฏขึ้นในalert()หน้าต่างถ้ามันไม่ได้ใช้แบบอักษร monospaced คุณสามารถเปลี่ยนมันconsole.log()เพื่อตรวจสอบผลลัพธ์ที่ถูกต้อง

s=prompt(o=[])
for(y=i=0;y<13;++y){o[i]=""
for(x=0;x<s.length;++x)o[i]+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
if(o[i++].trim().length<1)o.splice(--i,1)}
alert(o.join("\n"))

EDIT1: ++และ--มีอยู่จริง

EDIT2: การลบบรรทัดว่างจะเสร็จสิ้นในลูปเดียวกันกับส่วนที่เหลือโดยบันทึก 17 อักขระ ไม่จำเป็นต้องใช้วงเล็บเหล่านี้เช่นกันเพื่อเพิ่ม 2 ตัวอักษร

EDIT3: ไม่จำเป็นต้องประกาศรูปแบบของคลื่นเป็นตัวแปรประหยัด 4 ตัวอักษร

EDIT4: ดังที่ Dom Hastings แสดงความคิดเห็นจำนวนไบต์รวมถึง carriage return เช่นเดียวกับอักขระขึ้นบรรทัดใหม่อัพเดตจำนวนไบต์สำหรับการแก้ไขทั้งหมดเพื่อแยกการรับคืน carriage

EDIT5: บันทึกความอนุเคราะห์จาก Dom Hastings 3 ไบต์ ฉันไม่ได้ใช้งานการo.spliceแก้ไขเนื่องจากไม่สามารถลบบรรทัดว่าง (อย่างน้อยที่สุด)


1
เยี่ยมมาก! สถานที่บางแห่งที่คุณสามารถบันทึกได้อีกสองสามไบต์: แทนที่: if(o[i++].trim().length<1)o.splice(--i,1)ด้วยo.splice(i-(t=!o[i++].match(/\s/)),t), สำหรับ, -4, s=prompt() o=[]ด้วย: s=prompt(o=[]), -1 และfor(y=0,i=0;y<13;++y){o[i]=""ด้วยfor(y=i=0;y<13;++y){o[i]="", -2 อาจเป็นไปได้ที่คุณจะรวมลูปของคุณเข้าด้วยกันเพื่อประหยัดมากขึ้น ... สิ่งสุดท้ายสิ่งหนึ่งที่ควรระวังคือฉันมี 220 สำหรับจำนวนไบต์ปัจจุบันของคุณดังนั้น 225 ของคุณอาจเป็นหน้าต่าง\r\nแทนที่จะเป็นแบบ\nที่ฉันคิดว่าคุณสามารถเพิกเฉยได้ (โปรดแก้ไขให้ฉันด้วยถ้าฉันผิด) ...
Dom Hastings

จับได้ดีในการคืนรถ! ครั้งต่อไปฉันจะไม่เชื่อแผ่นจดบันทึก ++ มาก :) :)
Sean Latham

ฉันคิดว่าฉันลดลงเหลือ 166 คนสามารถตรวจสอบได้หรือไม่ ฉันเปลี่ยนพฤติกรรมอาร์เรย์เป็นบันทึกตลอดทั้งโปรแกรม ฉันใช้ไฟฟ้าลัดวงจรแทนคำสั่ง if และกำจัดวงเล็บด้วยการใส่ท่อนท้ายของลูปแรก for(s=prompt(),y=0;y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
Vartan

ใช้ศูนย์ที่เป็นเท็จเพื่อแทนที่ == ด้วยการลบ 165 ตัวอักษร for(s=prompt(y=0);y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97-y?" ":s[x]
Vartan

ฉันมีปัญหาในการวางจากความคิดเห็นของฉันดังนั้น heres bitbin bit.ly/1VQgGXw 217-> 166 = 76%
Vartan

3

Matlab, 133 , 130 ไบต์

ซับหนึ่ง:

s=input('');y=ceil(5.6*sin(0:pi/24:pi-.1).^.9);l=[-y y]+7;n=numel(s);t=repmat(' ',13,n);for k=1:n;t(l(mod(k-1,48)+1),k)=s(k);end;t

และรุ่นขยาย:

function f(s)
    y=ceil(5.6*sin(0:pi/24:pi-.1).^.9);l=[-y y]+7;  %// calculate the line number for each column position
    n=numel(s);                                     %// number of character in input
    t=repmat(' ',13,n);                             %// Create a blank canvas of whitespace characters
    for k=1:n
        t(l(mod(k-1,48)+1),k)=s(k);                 %// place each input character where it should be
    end
    t                                               %// force the output display

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


รายละเอียด:

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


กรณีทดสอบ:

บันทึกรุ่นฟังก์ชั่นภายใต้textsine.mในเส้นทางของคุณแล้วเรียกใช้:

s = {'.................................................';...
    'Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It''s 100% free, no registration required.';...
    'Short text.';...
    'The quick brown fox jumps over the lazy dog'};

for txtcase=1:4
    textsine(s{txtcase,1})
end

จะส่งออก:

t =

         .......                                 
      ...       ...                              
    ..             ..                            
   .                 .                           
  .                   .                          
 .                     .                         
.                       .                       .
                         .                     . 
                          .                   .  
                           .                 .   
                            ..             ..    
                              ...       ...      
                                 .......         


t =

         ng Puzz                                         ion and                                         siasts                                          stratio           
      mmi       les                                   est        an                                   thu       and                                   egi       n r        
    ra              &                               qu             sw                               en              c                                r             eq      
   g                                                                 e                                               o                             o                 u     
  o                   C                           a                   r                           e                   d                           n                   i    
 r                     o                                                                         l                     e                                               r   
P                       d                       s                       s                       z                                               ,                       e  
                         e                     i                         i                     z                         g                     e                         d 
                                                                          t                   u                           o                   e                           .
                           G                 e                             e                 p                             l                 r                             
                            ol             ng                                f             g                                fe              f                              
                              f S       cha                                   or        min                                   rs.       00%                                
                                 tack Ex                                         program                                          It's 1                                   


t =

         t.
      tex  
    t      
   r       
  o        
 h         
S          








t =

          brown                            
      ick       fox                        
    qu              j                      
                     u                     
  e                   m                    
 h                     p                   
T                       s                  

                          o                
                           v               
                            er             
                               th       dog
                                 e lazy    

หากคุณต้องการทดสอบซับเวอร์ชั่นหนึ่งที่มีอินพุตstdinคุณต้องป้อนอินพุตของคุณเป็นหนึ่งเดียวstringดังนั้นคุณจะต้องใส่อินพุตระหว่าง'อักขระ ตัวอย่าง:

'Short text.'   %//   valid input
Short text.     %// INVALID input

ขอบคุณที่Luis Mendoโกนได้ถึง 3 ไบต์ ;-)


@LuisMendo ขอบคุณสำหรับ 3 ไบต์ที่บันทึกไว้ :-) ฉันอธิบายวิธีการใส่สตริงที่เหมาะสมดังนั้นความเรียบง่ายs=input('');ยังคงใช้ได้
Hoki

2

สกาล่า 377 ตัวละคร

ตัดครั้งแรก อาจจะได้รับสูตรดีกว่าที่จะแปลxไปy

(s:String)⇒s.zipWithIndex.map(t⇒(t._1,t._2,t._2%48 match{
case i if i<5⇒6-i
case 5|19⇒2
case 6|7|8|16|17|18⇒1
case i if i<16⇒0
case i if i<29⇒i%20+2
case 29|43⇒10
case 30|31|32|40|41|42⇒11
case i if i<40⇒12
case i if i>43⇒10-i%44
})).groupBy(_._3).toSeq.map{case(y,xs)⇒(""→0/:xs.sortBy(_._2)){case((p,l),(c,x,_))⇒(p+" "*(x-l-1)+c)→x}._1→y}.sortBy(_._2).map(_._1).mkString("\n")

1

Lisp สามัญ, 205 ไบต์

(lambda(s &aux p v o)(dotimes(r 13)(setf o 0 p v v(round(*(/ 24 pi)(+(asin(-(/ r 6)1))pi))))(when p(map()(lambda(c)(princ(if(some(lambda(k)(<= p(mod k 48)(1- v)))`(,o,(- 23 o)))c" "))(incf o))s)(terpri))))

การทดสอบ

ดูhttp://pastebin.com/raw.php?i=zZ520FTU

หมายเหตุ

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


1

Python 2, 172 ไบต์

มันไม่ดีเท่าคำตอบของ Alex Lแต่ก็ใกล้เคียงกัน รับอินพุตจากอินพุตมาตรฐานและทำงานได้ดีที่สุดใน.pyไฟล์

l=map(int,bin(9960000)[2:]);l+=[-c for c in l];s=6;o=[];i=9
for c in raw_input():b=[' ']*13;b[s]=c;o+=[b];s+=l[i%48];i+=1
print''.join(sum(zip(*o+['\n'*13])[::-1],())[:-1])

ฉันตัดสินใจที่จะสร้างการส่งออกขนย้าย (แต่ละคอลัมน์เป็นแถว) และจากนั้นไขว้ผลตั้งแต่ในหลาม transpose map(*m)ของเมทริกซ์คือ

  • l: การแสดงของไบนารี9960000(หลังจากการตัดออก"0b"จากbin) 100101111111101001000000เป็น นี่คือ "ขั้นตอน" ของคลื่นไซน์แต่ละคอลัมน์เริ่มต้นที่ตัวอักษรสุดท้ายของจุดต่ำสุด ฉันคัดลอกรายการนี้คัดค้านแต่ละหมายเลขและตรึงมันไว้ที่ส่วนท้ายของตัวเองเพื่อสร้างสิ่งที่เป็นอนุพันธ์ของฟังก์ชันได้อย่างมีประสิทธิภาพ
  • s: นี่คือตัวแปรที่ติดตามแถว (คอลัมน์ในการแปลง) ซึ่งอักขระตัวถัดไปจะถูกแทรกเข้าไป
  • o: เอาต์พุตสิ้นสุด transposed
  • i: ติดตามระยะเวลาของคลื่นไซน์ เริ่มต้นที่ 9 เนื่องจากlมีการขยับเล็กน้อย

ในforลูปฉันสร้างรายการของช่องว่าง 13 รายการ (ฉันใช้ bytearrays แต่รายการของตัวละครกลายเป็นคำสั่งพิมพ์ที่สั้นกว่า) จากนั้นแทนที่sอักขระ th ด้วยอักขระอินพุต ผนวกbที่ส่วนท้ายของoเพิ่มขั้นตอนที่เหมาะสมกับและเพิ่มขึ้นsi

ฉันหวังว่าprintข้อความจะง่ายเหมือน\n'.join(*zip(o))แต่ไม่มีโชคเช่นนั้น zip(*o+['\n'*13])[::-1]ผนวกคอลัมน์ของบรรทัดใหม่แล้วกลับด้านและสลับสิ่งทั้งปวง (โดยไม่ต้องสลับคลื่นไซน์กลับด้าน) sum(...,())เชื่อมต่อ tuples เข้าด้วยกันเป็นหนึ่ง tuple ของอักขระจากนั้น''.join(...)เชื่อมอักขระและพิมพ์เข้าด้วยกัน

สิ่งอื่น ๆ ที่ฉันพยายามทำคือการเว้นวรรค 12 ตัวละครและแทรกตัวละครใหม่เข้าไปในสถานที่ที่เหมาะสมและแทนที่l+=[-c for c in l];ด้วยคณิตศาสตร์บางประเภทที่มีการคูณ1และ-1ด้วยผลลัพธ์ของการจัดทำดัชนีlแต่ไม่มีอะไรที่ฉันสามารถทำได้ เมื่อสิ้นสุดลงจะสั้นกว่า


0

Mathematica, 131 ไบต์

i=[input string];c=Characters@i;l=Length@c;StringJoin@Riffle[StringJoin@@@SparseArray[Table[{7-Round[6 Sin[.13(x-1)]],x},{x,l}]->c,{13,l}," "],"\n"]

นั่นเป็น 131 i=foo;ตัวอักษรรวมทั้งสาม นั่นเป็นวิธีที่สมเหตุสมผลในการรับอินพุต; ฉันสามารถใส่มันลงไปในคำจำกัดความของcและบันทึกไม่กี่จังหวะ แต่ที่รู้สึกไม่ยุติธรรม

มันค่อนข้างตรงไปตรงมา - เกือบอ่านได้ มันแยกสตริงในรายการของตัวละครแล้วทำให้ตัวละครเหล่านั้นลงในอาร์เรย์เบาบางที่ตำแหน่งที่กำหนดจากTable(จุดใด ๆ ในอาร์เรย์ไม่ได้กำหนดค่าเริ่มต้นของตัวอักษรที่ต้องการพื้นที่) เส้นถูกประกอบแยกจากกันจากนั้นบรรทัดใหม่จะถูกโรยระหว่างพวกเขา StringJoin สุดท้ายเย็บมันทั้งหมดขึ้น

หมายเหตุ:เช่นเดียวกับวิธีแก้ปัญหาอื่น ๆ สิ่งนี้อาจไม่ถูกต้องเพราะมันสร้างไซน์ไซด์จริงแทนที่จะเป็นตัวอย่างที่ทำด้วยมือ (สวยงาม)

แบบทดสอบ:

(*i=Programming Puzzles...*)
         ng Puzz                                          on and                                          iasts                                           tration          
       mi       le                                     sti       a                                      us      and                                     is        r        
     am           s                                   e           ns                                  th            c                                 eg           eq      
    r               &                               qu              we                              en               o                               r               u     
  og                  C                                               r                                               d                            o                  ir   
 r                     o                          a                                               e                    e                          n                     e  
P                       d                       s                       si                       l                       g                                               d 
                         e                     i                          t                    zz                         o                     ,                         .
                           G                                               e                  u                            lf                 ee                           
                            o               ge                               f               p                               e               r                             
                             lf           an                                  or           g                                  rs            f                              
                                St      ch                                       p      min                                     .        0%                                
                                  ack Ex                                          rogram                                          It's 10                                  
(*i=.... ...*)
         .......                                 
       ..       ..                               
     ..           ..                             
    .               .                            
  ..                 ..                          
 .                     .                         
.                       .                       .
                         ..                    . 
                           .                  .  
                            .               ..   
                             ..           ..     
                               ...      ..       
                                  ......         
(*i= Short text.*)
         t.
       ex  
      t    
    t      
  or       
 h         
S          





(*i=The quick...*)              
          brown                            
       ck       fo                         
     ui           x                        
    q               j                      
  e                  um                    
 h                     p                   
T                       s                  
                          o                
                           v               
                            e              
                             r            g
                               the      do 
                                   lazy    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.