เซเว่นสแลชดิสเพลย์


99

เขียนโปรแกรมที่ใช้สตริงที่ไม่ว่างเปล่าของตัวเลข 0 ถึง 9 และพิมพ์วิธีที่จะแสดงบนจอแสดงผลเจ็ดส่วนโดยใช้เครื่องหมายทับ ( /, \)

นี่คือรูปร่างหลักที่แม่นยำ:

/\  
\ \
 \/

 \
  \


/\
 /
 \/

/\
 /\
  /

 \
\/\

/
\/\
  /

/
\/\
 \/

/\
  \

/\
\/\
 \/

/\
\/\
  /

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

    /\
     /\
  /\  /
  \ \
/\ \/
 / 
 \/

โปรดทราบว่า1ตัวละครนั้นใช้พื้นที่ในปริมาณเท่ากันกับที่อื่น ๆ เส้นสองเส้น1อยู่ทางด้านขวาของจอแสดงผลไม่ใช่ด้านซ้าย

ดังนั้น159114จะกลายเป็นสิ่งนี้:

           \
          \/\
         \
          \
       \
        \
    /\
    \/\
  /   /
  \/\
 \  /
  \

อาจมีจำนวนและการรวมกันของการขึ้นบรรทัดใหม่ / ช่องว่างหรือช่องว่างในเอาต์พุตตราบใดที่ตัวเลขอยู่ในตำแหน่งที่ถูกต้องซึ่งเกี่ยวข้องกับกันและกัน

ดังนั้นสำหรับ159114สิ่งนี้ก็จะถูกต้อง:



          \        
         \/\     
        \
         \
      \    
       \          
   /\     
   \/\
 /   /
 \/\         
\  /
 \    


รับอินพุตจาก stdin หรือบรรทัดคำสั่งหรือเขียนฟังก์ชันที่รับสาย พิมพ์ผลลัพธ์ไปที่ stdout หรือคุณสามารถส่งคืนเป็นสตริงได้หากคุณเขียนฟังก์ชัน

สตริงที่ไม่ว่างใด ๆ ของตัวเลข 0 ถึง 9 ควรใช้งานได้รวมถึงสตริงตัวเลขหลักเดียว (เช่น8) และสตริงที่มีศูนย์นำหน้า (เช่นใน007ศูนย์จะต้องพิมพ์ศูนย์)

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


41
หัวข้อทั้งหมด: นี่ดูยอดเยี่ยม!
Martijn

4
นี่มันเจ๋งจริงๆ อย่างไรก็ตามฉันไม่แน่ใจว่า kolmogorov-complex เหมาะสมสำหรับคำถามนี้หรือไม่ - ฉันคิดว่าจำเป็นต้องใช้เอาต์พุตที่คงที่หรือไม่
alexander-brett

1
@ alexander-brett iirc ที่เป็นความตั้งใจดั้งเดิมอย่างไรก็ตามเมื่อเร็ว ๆ นี้มันถูกใช้สำหรับปัญหาที่ส่วนใหญ่ของรหัสอาจจะเป็นรหัส hardcoding
undergroundmonorail

นี่ทำให้ฉันไปเหมือน ... ว้าว! แค่ว้าว!
Renae Lider

คำถาม: เราจำเป็นต้องจัดการกับสตริงหรือสตริงที่ไม่มีอักขระหรือไม่?
frederick

คำตอบ:


9

CJam, 77 71 70 69 63 62 ไบต์

r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*

อักขระทั้งหมดสามารถพิมพ์ได้ดังนั้นการคัดลอกและวางควรใช้งานได้ดี

ลองใช้ออนไลน์ในล่าม CJam

ความคิด

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

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

หากเราย้อนกลับบรรทัดของการแสดงเครื่องหมายเจ็ดสแลชของ8เราจะได้รับสิ่งต่อไปนี้:

 \/
\/\
/\

การเป็นตัวแทนของตัวเลขทั้งหมดสามารถเข้ารหัสเป็นจำนวนเต็ม 8 บิตที่ฉันTHบิต0 IFF ฉันTHตัวละครที่ควรจะได้รับการแทนที่ด้วยช่องว่าง สำหรับตัวเลข0ถึง9จำนวนเต็มที่ได้คือ

247 208 235 250 220 190 191 240 255 254

ซึ่งสอดคล้องกับอักขระ ISO-8559-1 ต่อไปนี้:

÷Ðëúܾ¿ðÿþ

สำหรับแต่ละหลักในการป้อนข้อมูลหลังจากเลือกตัวเลือกที่สอดคล้องจำนวนเต็ม 8 บิตเราทำซ้ำฉันTHลักษณะของตัวแทนของ 8ตรงฉันครั้งที่ฉันเป็นฉันTHบิตของจำนวนเต็ม สิ่งนี้จะส่งอาร์เรย์ของสตริงที่มีอักขระหนึ่งตัวหรือเป็นศูนย์ ด้วยการแบ่งอาเรย์นี้เป็นชิ้นความยาว 3 เราจะได้อาเรย์ที่แต่ละองค์ประกอบสอดคล้องกับเส้นของการแทนค่า

ทีนี้เราคำนวณเวกเตอร์สูงสุดของสตริงที่แทนสแควร์และสตริงที่แทนตัวเลข สตริง/และ\ใหญ่กว่าสตริง ดังนั้นพวกเขาจะแทนที่ช่องว่างในตาราง อย่างไรก็ตามสตริงที่ว่างเปล่ามีขนาดเล็กกว่าสตริง ดังนั้นสตริงที่ว่างในการแสดงตัวเลขจะรักษาช่องว่างในช่องสี่เหลี่ยม

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

สุดท้ายเรากลับแต่ละแถวและแทรกตัวป้อนบรรทัดระหว่างแต่ละแถว

รหัส

r_,      e# Read a token from STDIN and push the length of a copy.
5*_      e# Multiply the length by 5 and push a copy.
Sa*      e# Repeat the array [" "] that many times.
a*       e# Repeat the array [[" " ... " "]] that many times.
\{       e# For each character C in the input:
  ~      e#   Push eval(C), i.e., the digit the character represents.

  "÷Ðëúܾ¿ðÿþ"

         e#   Push the encodings of all 10 seven slash representations.

  =      e#   Select the proper one.
  i2b    e#   Push the resulting characters code point in base 2, i.e., its bits.
  S      e#   Push " ".
  "\/"4* e#   Push "\/\/\/\/".
  +W<    e#   Concatenate and eliminate the last character.
  .*     e#   Vectorized repetition.

         e#   For the digit 5, e.g., we have [1 0 1 1 1 1 1 0] and  " \/\/\/\" on
         e#   the stack, so .* yields [" " "" "/" "\" "/" "\" "/" ""].

  3/     e#   Divide the representation into chunks of length 3, i.e., its lines.
  ..e>   e#   Compute the twofold vectorized maximum, as explained above.
  2fm>   e#   Rotate each line to characters to the right.
  2m>    e#   Rotate the lines two units down.
}/
Wf%      e# Reverse each line.
N*       e# Place linefeeds between them.

ผลัดสุดท้ายจะเลอะส่งออกถ้ายาวด้านตารางที่มีขนาดเล็กกว่า2n + 3 ตั้งแต่5n ≥ 2n + 3สำหรับจำนวนเต็มบวกทั้งหมดnสแควร์นั้นใหญ่พอที่จะป้องกันสิ่งนี้ได้


จะเป็นการเหมาะสมไหมถ้าจะโพสต์โค้ดของคุณในเวอร์ชัน base64 ที่นี่?
TRiG

1
+1 แต่พูดตามตรงฉันหวังว่า CJam และคณะ จะนั่งอันนี้ออกมา: p
primo

@primo: ฉันรู้สึกแบบเดียวกันกับคำถาม Pyth และคณิตศาสตร์ : P ฉันนิด ๆ ปลายไปงานเลี้ยงเพราะผมเบื่อ-sniped โดยการจัดเรียงคำ ไม่ได้จนกว่าคุณจะแก้ไขเมื่อเช้านี้ที่ฉันจำคำถามนี้ได้
Dennis

ความท้าทาย @Dennis ดูเหมือนจะดำเนินไปเร็วกว่าที่เคยเป็นมา ฉันยังคงทำงานอย่างใดอย่างหนึ่งจากสองสัปดาห์ที่ผ่านมา: p
primo

1
ฉันมักจะมองหา CJam ก่อนด้วยความคาดหวังว่ามันจะมีจำนวนไบต์ต่ำสุด ฉันยังไม่ต้องผิดหวัง
Engineer Toast

25

Python 3, 189 183 174 ไบต์

s="a%sa"%input()
while s[1:]:b,a,c,d,e,f,g=[c*(ord(n)>>int(s[~(n>"Ͱ")],16)&1)or" "for c,n in zip("\/"*4,"ΟϭŅͭͱͼϻ")];S=len(s)*"  ";print(S+a+b,c+d+"\n"+S+e+f+g);*s,_=s

การบีบอัดดูเหมือนจะไม่เป็นไรสำหรับฉัน แต่ฉันมีปัญหาในการหาวิธีที่ดีในการทิ้งตัวแปรเจ็ดตัว ...

โชคดีที่สเป็คค่อนข้างผ่อนคลายกับกฎของช่องว่างเนื่องจากมีช่องว่างชั้นนำ / ต่อท้ายจำนวนมาก

ขยาย:

s="a%sa"%input()
while s[1:]:
  b,a,c,d,e,f,g=[c*(ord(n)>>int(s[~(n>"Ͱ")],16)&1)or" "
                 for c,n in zip("\/"*4,"ΟϭŅͭͱͼϻ")]
  S=len(s)*"  "
  print(S+a+b,c+d+"\n"+S+e+f+g)
  *s,_=s

คำอธิบาย

ตำแหน่งส่วนที่เป็นตัวแทนของตัวแปรคือ:

    ab               /\
    efg               /\
  ab cd            /\  /
  efg              \ \
ab cd            /\ \/
efg               /
 cd               \/

แต่ละเซกเมนต์ถูกเข้ารหัสด้วยอักขระ Unicode 2 ไบต์เดียว ตัวอย่างเช่นส่วนของการϻเข้ารหัสgเช่น:

bin(ord("ϻ")) = bin(1019) = "0b1111111011"
                               ^^^^^^^^^^
                               9876543210

แท้จริงแล้ว2เป็นตัวเลขหลักเดียวที่จะไม่ใช้ส่วนล่างขวาของจอแสดงผลเจ็ดส่วน


19

C, 1098 345 323 319 ไบต์

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

ผู้เข้าร่วมครั้งแรก แค่เล่น ๆ. สุภาพอ่อนโยน

a[]={100489,2056,98569,67849,2440,67969,100737,2057,100745,67977},i,j,k,n,m;char*c=" /\\";
#define f(q,r) for(q=0;q<(r);q++)
#define P(w) putchar(w)
#define Q(d,i,j) P(c[a[v[1][d]-48]>>(i*3+j)*2&3])
main(w,char**v){f(i,n=strlen(v[1]))f(k,(m=n-i-1)?2:3){f(j,m*2)P(32);f(w,3)Q(m,k,w);if(!k&&i)f(w,2)Q(m+1,2,w+1);P(10);}}

ขยายตัวเตือนฟรี:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int a[]={100489,2056,98569,67849,2440,67969,100737,2057,100745,67977};
char *c=" /\\";
#define f(q,r) for(q=0;q<(r);q++)
#define P(w) putchar(w)
#define Q(d,i,j) P(c[a[v[1][d]-48]>>(i*3+j)*2&3])
int main(int w, char **v)
{
    int i,j,k,n,m;
    f(i,n=strlen(v[1])) {
        m=n-i-1;
        f(k,m?2:3) {
            f(j,m*2) P(32);
            f(w,3) Q(m,k,w);
            if (!k&&i) f(w,2) Q(m+1,2,w+1);
            P(10);
        }
    }
}

ปืนที่เร็วที่สุดในฝั่งตะวันตก ฉันกำลังบีบอัดของฉันตอนนี้
Alexey Burdin

15
เฮ้! ยินดีต้อนรับสู่ Code Golf จุดประสงค์ของการท้าทายนี้คือการทำให้รหัสของคุณสั้นที่สุดเท่าที่จะเป็นไปได้ดังนั้นคุณควรทำการปรับแต่งบางอย่างเกี่ยวกับการลบช่องว่างการย่อคำสั่ง ฯลฯ จากนั้นรายงานจำนวนไบต์ที่ด้านบนของโพสต์ด้วยภาษา โพสต์แรกที่ดีแม้ว่า! สำหรับการอ้างอิงโพสต์เริ่มต้นของคุณมีความยาว 1,098 ไบต์
Kade

ขอบคุณ เพิ่งเพิ่มภาษาและจำนวนไบต์ ต้นฉบับของฉันยังมีความคิดเห็นและการใช้งาน :)
ผู้ใช้บางคน

เคล็ดลับ: เปลี่ยนชื่อตัวแปรทั้งหมดเป็นอักขระเดียว นอกจากนี้คุณยังใช้สำหรับ `(i = 0; ฉัน <digits` มากอาจจะแทนที่ด้วยแมโคร?
Joshpbarron

ทำได้ดีมากที่นี่ ที่จะทำให้คะแนนของคุณการแข่งขันมากขึ้นคุณอาจจะดูที่ของเราเคล็ดลับสำหรับการเล่นกอล์ฟใน C
Alex A.

14

JavaScript, 192 178 167 162 ไบต์

f=x=>{n=b="\n";for(k in x)for(i=0;i<8;)b+=("î\xA0Öô¸|~àþü".charCodeAt(x[k])>>i++&1?i%2?"/":"\\":" ")+(i%3?"":n+"  ".repeat(k));return b.split(n).reverse().join(n)}

การใช้งาน: f("1337");จะกลับมา

      /\
        \
    /\   
     /\
  /\  /
   /\
 \  /
  \

มันใช้คุณสมบัติของ ES6 และอาจมีพฤติกรรมขึ้นอยู่กับการใช้งานบางอย่างเนื่องจากไม่ใช้เครื่องหมายอัฒภาคและวงเล็บ แต่ก็ใช้งานได้ใน Firefox

ขยาย:

f=x=>
{
    n = b = "\n";

    for (k in x)
        for (i=0; i<8;)
            b += ("î\xA0Öô¸|~àþü".charCodeAt(x[k]) >> i++ & 1? i%2? "/" : "\\" : " ") + (i%3? "" : n+"  ".repeat(k));

    return b.split(n).reverse().join(n)
}

คำอธิบาย:

lคืออาร์เรย์ที่มีอักขระไบต์เดียว 10 ตัวซึ่งสอดคล้องกับรูปร่างของแต่ละหลัก ตัวอย่างเช่นตัวเลข 0 แสดงโดยตัวละครî:

/\        11
\ \  -->  101  --> 11 101 110 = î
 \/       011

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


2
มี==0และแน่นอนสิ่งที่จำเป็นก่อน==1 ?ไม่ถือว่า int เป็นบูลีนใน js หรือไม่ @Regret
Alexey Burdin

1
@Regret: "w\x05k/\x1D>~\x07\x7F?"เมื่ออักขระแต่ละตัวกลับด้าน bitwise กลายเป็น"\xee\xa0\xd6\xf4\xb8|~\xe0\xfe\xfc"แต่ละสิ่งเหล่านี้สามารถพิมพ์ได้ สิ่งนี้ให้ 8 ไบต์เพิ่มเติม แม้ว่าจะยังไม่เพียงพอ ...
Alexey Burdin

1
คุณสามารถโกนออกได้ 2 ไบต์ด้วยการลบวงเล็บf=(x)=>{}- พวกมันไม่ต้องการโดยมีเพียงอาร์กิวเมนต์เดียวเท่านั้น
Scimonster

@Alexey ถูกต้องแล้ว ฉันจะเปลี่ยนสิ่งนั้น
เสียใจ

ใช้งานได้หรือไม่ ฉันได้แถวเพิ่มอีก 6 แถวพร้อมตัวละครปลอม
edc65

10

Perl - 103 ไบต์

#!perl -n
print$i+$%2?U^(u,$i--%2?v9:z)[$i<4+$%2&vec$_,4*$-3-$i,1]:$/.!($i=$--)
while$+=2*y/0-9/wPkz\\>?p~/

ด้านบนมีอักขระที่ไม่สามารถพิมพ์ได้ 6 ตัว (สามารถดาวน์โหลดซอร์สได้ที่Ideone ) และเทียบเท่าดังต่อไปนี้:

#!perl -n
print$i+$^F%2?U^(u,$i--%2?v9:z)[$i<4+$^F%2&vec$_,4*$^F-3-$i,1]:$/.!($i=$^F--)
while$^F+=2*y/0-9/wPkz\\>?p\177~/

แต่ละตัว^Fอาจถูกแทนที่ด้วยอักขระตัวอักษร 6 (ACK) และ\177แทนที่ด้วยอักขระ 127 (DEL)

shebang นับเป็น 1 บรรทัดที่สองขึ้นบรรทัดใหม่คือไม่จำเป็น อินพุตถูกนำมาจาก stdin


ตัวอย่างการใช้งาน

$ echo 0123 | perl seven-slash.pl

      /\
       /\
    /\  /
     /
   \ \/
    \
/\
\ \
 \/

$ echo 456789 | perl seven-slash.pl

          /\
          \/\
        /\  /
        \/\
      /\ \/
        \
    /
    \/\
  /  \/
  \/\
 \  /
\/\

คำอธิบาย

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

   /\           56 
   \/\          234
 /\ \/   ->   56 01
 \/\          234 
  \/           01

เอาท์พุทสลับระหว่าง 3 และ 5 สแลชเพื่อให้บิต56หกลง01ในตัวเลขถัดไป 7ไม่ได้ใช้บิต


8

C #, 360 355 331 ไบต์

สวัสดีลองครั้งแรกที่โค้ดกอล์ฟ หวังว่านี่จะไม่ได้คะแนนที่ไม่ดีนักสำหรับผู้ร่วมงาน C #

string p(string n){var l=new string[n.Length*2+1];var i=l.Length-1;for(;i>0;){var x=@"/\\ \\/ \  \  /\ / \//\ /\ / \\/\  / \/\ // \/\\//\  \  /\\/\\//\\/\ /".Substring((n[0]-48)*7,7);for(var j=i-3;j>=0;){l[j--]+="  ";}l[i--]+=" "+x[5]+x[6];l[i--]+=""+x[2]+x[3]+x[4];l[i]+=""+x[0]+x[1];n=n.Remove(0, 1);}return string.Join("\n",l);}

การใช้งาน: p("159114");จะกลับมา

          \
         \/\
        \
         \
      \
       \
   /\
   \/\
 /   /
 \/\
\  /
 \

ขยาย:

string p(string n)
    {
        var l = new string[n.Length * 2 + 1];
        var i = l.Length - 1;
        for (; i > 0; )
        {
            var x = @"/\\ \\/ \  \  /\ / \//\ /\ / \\/\  / \/\ // \/\\//\  \  /\\/\\//\\/\ /".Substring((n[0] - 48) * 7, 7);

            for (var j = i - 3; j >= 0; )
            {
                l[j--] += "  ";
            }
            l[i--] += " " + x[5] + x[6];
            l[i--] += "" + x[2] + x[3] + x[4];
            l[i] += "" + x[0] + x[1];

            n = n.Remove(0, 1);
        }

        return string.Join("\n", l);
    }

1
ฉันรู้ว่ามันเกือบสามปีแล้ว แต่คุณสามารถเล่นกอล์ฟได้ 30 ไบต์: ลองออนไลน์ 301 ไบต์ คำตอบที่ดี +1 จากฉัน
Kevin Cruijssen

เย็น. รู้สึกอิสระที่จะโพสต์เป็นคำตอบของคุณเองแล้ว :)
Shion

1
ไม่มันเป็นรหัสของคุณ ฉันสั้นลงเล็กน้อยโดยการลบวงเล็บสำหรับห่วงและรวมตัวแปร และเปลี่ยนstring s(string n)ไปn=>ใช้แลมบ์ดา อืมคุณสามารถปล่อยให้มันเป็นอย่างนี้ได้ถ้าคุณต้องการ :) ฉันสร้างพอร์ตให้กับ Java ที่ให้เครดิตกับคุณแล้ว ;)
Kevin Cruijssen

4

python 2, 317 298 278 273.15

def f(s):
    r=range;n=len(s)*2;l=[[' ']*-~n for x in r(-~n)]
    for x in r(0,n,2):
        for i,[d,y,c]in enumerate(zip('0112012','1021012',r'\\\\///')):l[n-2-x+int(y)][x+int(d)]=[' ',c][('%7s'%(bin(ord('}(7/jO_,\x7fo'[map(int,s)[x/2]])))[2:])[i]=='1']
    for x in l:print''.join(x)

ฉันถือว่า 4-space เป็นแท็บขณะนับ
ไม่บีบอัดและอ่านได้:

def f(s):
    r=['1111101','0101000','0110111','0101111','1101010','1001111','1011111','0101100','1111111','1101111']
    ''.join(map(lambda x:chr(eval('0b'+x)),r))
    n=len(s)*2
    l=[[' ']*(n+1) for x in xrange(n+1)]
    shifts=[(0,1,'\\'),(1,0,'\\'),(1,2,'\\'),(2,1,'\\'),(0,0,'/'),(1,1,'/'),(2,2,'/')]
    for x in xrange(0,n,2):
        y=n-2-x
        for i,[dx,dy,c] in enumerate(shifts):
            l[y+dy][x+dx]=c if r[map(int,s)[x/2]][i]=='1' else ' '
    return '\n'.join(''.join(x) for x in l)

เฮ้! คำตอบที่ยอดเยี่ยม แต่คุณสามารถทำการเปลี่ยนแปลงเล็กน้อยเพื่อให้สั้นลง การเปลี่ยนl[y+dy][x+dx]=c if r[map(int,s)[x/2]][i]=='1' else ' 'เป็นl[y+dy][x+dx]=[' ',c][r[map(int,s)[x/2]][i]=='1']บันทึก 5 ไบต์เปลี่ยนreturn '\n'.join(''.join(x) for x in l)เป็นการprint'\n'.join(''.join(x)for x in l)บันทึก 3 ไบต์บวกกับการเปลี่ยนแปลงเพิ่มเติมเล็กน้อย นี่คือการเชื่อมโยงที่จะสรุปสาระสำคัญที่ผมได้รับไบต์นับลงไปที่ 440 จาก 508
Kade

6
เคลวินจะพอใจกับคะแนนนั้นมาก
Cristian Lupascu

3
คำตอบของคุณเป็นจริง 272 ไบต์ แต่คุณสามารถบันทึกได้อีกหนึ่งเพราะพื้นที่มีขนาดสั้นกว่าแท็บ ดูที่นี่ คุณมี 273.15 ไบต์ได้อย่างไร?
mbomb007

1
273.15 bytes หมายถึง @AlexeyBurdin คิดคำนวณอะนาล็อกบนแพลตฟอร์มดิจิตอล ทำไมคุณถึงตีพิมพ์ที่นี่ในโลกแทนที่จะเป็นวิทยาศาสตร์? ;-)
hBy2Py

1
ซึ่งหมายความเพียงว่าการแก้ปัญหาคือการแช่แข็งที่ศูนย์แน่นอนคือผมไม่อยากให้ความสำคัญกับสิ่งที่มีอยู่แล้วหายไป :)
Alexey Burdin

3

KDB (Q), 172 136 ไบต์

{d:(9#1 2 0 2)*/:-9#'0b vs'427 136 403 409 184 313 315 392 443 441;
 -1" /\\"{m+(c,/:y),c:(count[m:0 0,x,\:0 0]-3)#0}/[3 3#/:d"J"$'(),x];}

คำอธิบาย

1) สร้างdแผนที่ที่มีรูปร่างทุกหลัก

2) ผัดเมทริกซ์ด้วยค่าศูนย์พิเศษและเพิ่มเข้าด้วยกัน เช่น "01"

0           0 0 0 2 0   
0           0 0 0 0 2
1 2 0 0 0 + 0 0 0 0 0
2 0 2 0 0   0
0 2 1 0 0   0

3) ใช้ดัชนีเพื่อ map และพิมพ์ด้วย" /\"-1

ทดสอบ

q){d:(9#1 2 0 2)*/:-9#'0b vs'427 136 403 409 184 313 315 392 443 441;-1" /\\"{m+(c,/:y),c:(count[m:0 0,x,\:0 0]-3)#0}/[3 3#/:d"J"$'(),x];}"0123456789"
                  /\
                  \/\
                /\  /
                \/\
              /\ \/
                \
            /
            \/\
          /  \/
          \/\
         \  /
        \/\
      /\
       /\
    /\  /
     /
   \ \/
    \
/\
\ \
 \/

ฉันแน่ใจว่านี้จะสั้นกว่านี้ !!

ขอบคุณ @hjk


1
การลดเพียงอย่างเดียวที่ฉันเห็นคือการแทนที่1 2 0 2 1 2 0 2 1ด้วย(9#1 2 0 2)(-6)
hjk

1
โอ้และแทนที่enlistด้วย1#งานดังนั้นนั่นคือ -5
hjk

1
คุณคือดาว! ฉันจะอัปเดต! แต่ไม่สามารถแทนที่ได้enlistแม้ว่าcount[a 0]#0จะไม่ใช่ atom :(
WooiKent Lee

อ่าแปลกมันใช้งานได้สำหรับฉันแม้ว่า ... จะต้องมีการเล่นโวหาร ;)
hjk

1
จริง ๆ แล้ว list plus atom จะขยายอะตอมให้มีความยาวที่ถูกต้องอยู่ดี! คุณเตือนฉันถึงกลไกดังกล่าว! : D
WooiKent Lee

2

Pip, 122 + 1 = 123 ไบต์

ใช้-nธง รับอินพุตผ่านอาร์กิวเมนต์บรรทัดคำสั่ง

l:$.(J"\/ "@^(A_TB3M"⮐䫶ヷ㄃䓳ⴷⴥㅕ⬿⭑")@_.2<>2Ma)z:2*#ap:sXz+2RLz+2Fi,5Fj,z{c:[4-ii]//2+j(pc@0c@1):(lij)}RVp

ตัวละครใน UTF-8 11152, 19190, 12535, 12547, 17651, 11575, 11557, 12629, 11071, 11089สตริงมีจุดรหัสต่อไปนี้:

ungolfed เล็กน้อย:

t:[120022001 222022202 122012021 122012201 220012202 120212201 120212001 122022202 120012001 120012201]
l:$.({J"\/ "@^t@a.2<>2}Ma)
z:2*#a+2
p:sXzRLz
Fi,5
 Fj,2*#a {
  x:i//2+j
  y:(4-i)//2+j
  p@y@x:l@i@j
 }
P RVp

กลยุทธ์พื้นฐานคือการค้นหาอักขระที่เป็นส่วนประกอบของแต่ละหมายเลขแล้วเบ้อย่างเหมาะสม ตัวอย่างเช่นสำหรับ8เราต้องการสิ่งนี้ (ช่องว่างที่แสดงด้วยจุด):

/.
\\
/.
\\
/.

ซึ่งจะกลายเป็นสิ่งนี้:

 .  
/\. 
\/\.
 \/ 

คุณสมบัติที่ดีของกลยุทธ์นี้คือการที่มีตัวเลขที่เบ้ล่วงหน้าหลายหมายเลขสามารถถูกต่อกันได้

ตอนนี้เราสามารถเข้ารหัส/.\\/.\\/.ในฐาน 12001200123 จากนั้นเราสามารถแปลงเป็นทศนิยมและถือว่าเป็นจุดโค้ด UTF-8

นิพจน์J"\/ "@^(A_TB3M"⮐䫶ヷ㄃䓳ⴷⴥㅕ⬿⭑")@_.2<>2Maได้รับข้อมูลที่เอียงล่วงหน้าโดยกระบวนการต่อไปนี้:

                            Ma   Map this lambda function to each character in input:
        (A_TB3M"...")            Create list of the code points of each character in UTF-8
                                   string, converted to base 3
                     @_          Index into that list using the input character
                       .2        Concatenate 2 to the end of the base-3 value (all of the
                                   pre-skewed number grids end in 2, i.e. space)
       ^                         Split the number into a list of its digits
 "\/ "@                          Index into this string with those digits, giving a list
                                   of slashes & spaces
J                                Join the list together into a string
                         <>2     Group string two characters at a time

เมื่อเราต่อสตริงเข้าด้วยกันโดยใช้สตริง$.เราจะสร้างกริดของช่องว่าง (2 * n +2 สแควร์) วนรอบกริดที่เอียงล่วงหน้าและแทนที่ช่องว่างที่เกี่ยวข้องในกริดโพสต์ที่เอียงด้วย ตัวละครที่เหมาะสม หากต้องการดูสิ่งที่เกิดขึ้นเราสามารถแก้ไขโค้ดเพื่อพิมพ์แต่ละสเตจและหยุดชั่วคราวสำหรับอินพุตของผู้ใช้:

อัลกอริทึมในกระบวนการ

กริดถูกสร้างขึ้นกลับหัวเพราะมันทำให้คณิตศาสตร์ง่ายขึ้น

ฉันแน่ใจว่ามีอัลกอริทึมที่ดีกว่าที่จะใช้ แต่ฉันต้องการที่จะเกิดขึ้นกับความคิดของตัวเองมากกว่าที่จะคัดลอกของคนอื่น

เพิ่มเติมเกี่ยวกับ Pip


2

Brainfuck - 719 ไบต์

สำหรับบริบททางประวัติศาสตร์เท่านั้นให้เครดิตกับ Daniel B Cristofani ฉันไม่แน่ใจว่าสิ่งนี้ถูกสร้างขึ้นเมื่อใด แต่มีให้ในInternet Archiveตั้งแต่วันที่ 9 พฤษภาคม 2003

เอาต์พุตสำหรับ9แตกต่างจากคำอธิบายปัญหา

>>>>+>+++>+++>>>>>+++[
  >,+>++++[>++++<-]>[<<[-[->]]>[<]>-]<<[
    >+>+>>+>+[<<<<]<+>>[+<]<[>]>+[[>>>]>>+[<<<<]>-]+<+>>>-[
      <<+[>]>>+<<<+<+<--------[
        <<-<<+[>]>+<<-<<-[
          <<<+<-[>>]<-<-<<<-<----[
            <<<->>>>+<-[
              <<<+[>]>+<<+<-<-[
                <<+<-<+[>>]<+<<<<+<-[
                  <<-[>]>>-<<<-<-<-[
                    <<<+<-[>>]<+<<<+<+<-[
                      <<<<+[>]<-<<-[
                        <<+[>]>>-<<<<-<-[
                          >>>>>+<-<<<+<-[
                            >>+<<-[
                              <<-<-[>]>+<<-<-<-[
                                <<+<+[>]<+<+<-[
                                  >>-<-<-[
                                    <<-[>]<+<++++[<-------->-]++<[
                                      <<+[>]>>-<-<<<<-[
                                        <<-<<->>>>-[
                                          <<<<+[>]>+<<<<-[
                                            <<+<<-[>>]<+<<<<<-[
                                              >>>>-<<<-<-
  ]]]]]]]]]]]]]]]]]]]]]]>[>[[[<<<<]>+>>[>>>>>]<-]<]>>>+>>>>>>>+>]<
]<[-]<<<<<<<++<+++<+++[
  [>]>>>>>>++++++++[<<++++>++++++>-]<-<<[-[<+>>.<-]]<<<<[
    -[-[>+<-]>]>>>>>[.[>]]<<[<+>-]>>>[<<++[<+>--]>>-]
    <<[->+<[<++>-]]<<<[<+>-]<<<<
  ]>>+>>>--[<+>---]<.>>[[-]<<]<
]
[Enter a number using ()-./0123456789abcdef and space, and hit return.
Daniel B Cristofani (cristofdathevanetdotcom)
http://www.hevanet.com/cristofd/brainfuck/]

2
ฉันอาจจะเขียนมันในปี 2002 Internet Archiveกล่าวว่า Panu Kalliokoski เพิ่มมันลงในที่เก็บ brainfuck ของเขาในเดือนสิงหาคม 2002 สำหรับ 9 ฉันคิดว่าฉันใช้รูปแบบจากMicroprocessors และ Interfacingรุ่นที่สองหน้า 4
Daniel Cristofani

1

Perl, 270 ไบต์

ฉันไม่ควรเสียเวลากับเรื่องนี้

$e="\\";$g=" ";$_=reverse<>;$l=length;push@a,(119,18,107,91,30,93,125,19,127,95)[$1]while/(.)/g;for($i=0;$i<=$l;$i++){$j=2*($l-$i);$b=$a[$i];$c=$i&&$a[$i-1];print" "x$j,$b&1?"/":$g,$b&2?$e:$g,$g,$c&32?$e:$g,$c&64?"/":$g,"
"," "x$j,$b&4?$e:$g,$b&8?"/":$g,$b&16?$e:$g,"
"}

แทนที่[$1]while/(.)/gด้วย[$_]for/./gเพื่อบันทึก 4 ไบต์ แทนที่for($i=0;$i<=$l;$i++)ด้วยfor$i(0..$l)เพื่อบันทึก 9 ไบต์
ฮอบส์

1

JavaScript ( ES6 ), 191 206

เรียกใช้ส่วนย่อยใน Firefox เพื่อทดสอบ

F=m=>(
  a='    \\/  /\\/\\ /  /\\  \\\\ \\'.match(/.../g),
  o=f='',r=' ',
  [for(d of m)(
    n=1e3+'¯B\x91ÿ$ê\x86A\x87ë'.charCodeAt(d)+'', // here there are 3 valid characters tha the evil stackoverflow editor just erase off, so I had to put them as hex escape
    o='\n'+f+' '+a[n[2]]+'\n'+r+a[n[1]]+o,
    r=f+a[n[3]],
    f+='  ')],
  r+o
)


//TEST

go=_=>O.innerHTML =(v=I.value)+'\n'+F(v)

go()
<input id=I value='0123456789'><button onclick='go()'>-></button>
<pre id=O></pre>


0

Java 8, 341 ไบต์

n->{int i=n.length*2,j=i+1,k=0,t;String l[]=new String[j],x;for(;j-->0;l[j]="");for(;i>0;l[i--]+=" "+x.substring(5,7),l[i--]+=x.substring(2,5),l[i]+=x.substring(0,2))for(x="/~~ ~~/ ~  ~  /~ / ~//~ /~ / ~~/~  / ~/~ // ~/~~//~  ~  /~~/~~//~~/~ /".replace('~','\\').substring(t=(n[k++]-48)*7,t+7),j=i-2;j-->0;)l[j]+="  ";return"".join("\n",l);}

คำตอบ C # .NETของ@Shion ที่พอร์ตของShion ดังนั้นอย่าลืมอัปเกรดเขาเช่นกัน!

ลองออนไลน์

คำอธิบาย:

n->{                       // Method with character-array parameter and String return-type
  int i=n.length*2,        //  Two times the length of the input array
      j=i+1,               //  Index integer, starting at `i+1`
      k=0,t;               //  Temp integers
  String l[]=new String[j],//  String-array for the rows, default filled with `null`
         x;                //  Temp-String
  for(;j-->0;l[j]="");     //  Replace all `null` with empty Strings
  for(;i>0                 //  Loop `i` downwards in the range [`n.length*2`, 0)
      ;                    //   After every iteration:
       l[i--]+=            //    Append the row at index `i` with:
                           //    (and decrease `i` by 1 afterwards with `i--`)
         " "               //     A space
         +x.substring(5,7),//     And the 6th and 7th characters of temp-String `x`
       l[i--]+=            //    Append the row at index `i` with:
                           //    (and decrease `i` by 1 afterwards with `i--`)
         x.substring(2,5), //     The 3rd, 4th and 5th characters of temp-String `x`
       l[i]+=              //    Append the row at index `i` with:
         x.substring(0,2)) //     The 1st and 2nd characters of the temp-String `x`
    for(x="/~~ ~~/ ~  ~  /~ / ~//~ /~ / ~~/~  / ~/~ // ~/~~//~  ~  /~~/~~//~~/~ /".replace('~','\\')
                           //   String containing all digit-parts
          .substring(t=(n[k++]-48)*7,t+7),
                           //   and take the substring of 7 characters at index
                           //   `n[k]` as integer multiplied by 7
        j=i-2;j-->0;)      //   Inner loop `j` in the range (`i`-2, 0]
      l[j]+="  ";          //    And append the rows at index `j` with two spaces
  return"".join("\n",l);}  //  Return the rows delimited with new-lines
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.