สาขาไบนารี


15

รับเลขฐานสองงานของคุณคือการสร้าง 'สาขา' ของจำนวนที่มีความลึก 2

ตัวอย่างเช่นให้0เป็นอินพุตคุณควรส่งออกตรงนี้:

     /000
  /00
 /   \001
0
 \   /010
  \01
     \011

นี่ควรอธิบายตนเองอย่างเป็นธรรมว่าควรสร้างสาขาอย่างไร ความลึก 2 หมายถึงเราคำนวณสาขาสำหรับจำนวนที่ยาวได้สูงสุด 2 หมายเลข นอกจากนี้เรายังคำนวณสาขาตามลำดับด้วยเลขศูนย์ที่ด้านบนและสาขาที่ด้านล่าง

กรณีทดสอบเพิ่มเติม:

0

     /000
  /00
 /   \001
0
 \   /010
  \01
     \011

1

     /100
  /10
 /   \101
1
 \   /110
  \11
     \111

00

       /0000
   /000
  /    \0001
00
  \    /0010
   \001
       \0011

01

       /0100
   /010
  /    \0101
01
  \    /0110
   \011
       \0111

10

       /1000
   /100
  /    \1001
10
  \    /1010
   \101
       \1011

11

       /1100
   /110
  /    \1101
11
  \    /1110
   \111
       \1111

กฎระเบียบ

  • คุณจะไม่ได้รับตัวอักษรในการป้อนข้อมูลอื่น ๆ กว่าและ10
  • 0 < length of input < 11.
  • อนุญาตช่องว่างต่อท้ายที่ส่วนท้ายของบรรทัด

4
0 < length of input < 11เป็น11ทศนิยมหรือไบนารี? : P
ETHproductions

@ETHproductions ทศนิยม: P
Okx

คำตอบ:


4

เจลลี่ , 39 38 ไบต์

L⁶ẋ,W;“/0¶\1 ”ṃ@“ð&ẏ{×ẏĊfẏȷ®ỤṪ⁻ʠaƇGⱮȷ’

ลองออนไลน์!

อย่างไร?

ศิลปะที่จะพิมพ์คือ:

L  L /N00
L /N0
L/ L \N01
N
L\ L /N10
L \N1
L  L \N11

โดยที่NคือสตริงอินพุตและLเป็นสตริงของช่องว่างของความยาวของสตริงอินพุต

เป็นเช่นนั้นประกอบด้วยแปดส่วนประกอบ ( L, N, /, 0, อักขระขึ้นบรรทัดใหม่\, 1และอักขระช่องว่าง) และด้วยเหตุนี้อาจจะถูกเก็บไว้เป็นจำนวนฐาน-8 (ซึ่งอาจจะบีบอัดเป็นจำนวนฐาน-250 ในเจลลี่) แปลงฐานอะตอมรวมและการสร้างดัชนีลงในรายการ (อย่างมีประสิทธิภาพอย่างใดอย่างหนึ่งอาจจะกำหนดตัวเลขโดยพลการที่จะใช้)

L⁶ẋ,W;“/0¶\1 ”ṃ@“ð&ẏ{×ẏĊfẏȷ®ỤṪ⁻ʠaƇGⱮȷ’ - Main link: binary string s  e.g. "100"
 ⁶                                     - space character
  ẋ                                    - repeat by:
L                                      -     length(s)                    [' ',' ',' ']
    W                                  - wrap s in a list                 [['1','0','0']]
   ,                                   - pair               [[' ',' ',' '],['1','0','0']]
      “/0¶\1 ”                         - char list: ['/','0',<newline>,'\',','1',' ']

     ;                                 - concatenate        [[' ',' ',' '],['1','0','0'],'/','0',<newline>,'\',','1',' ']
                “ð&ẏ{×ẏĊfẏȷ®ỤṪ⁻ʠaƇGⱮȷ’ - base 250 number: 91531517467460683226372755994113932025707662527
              ṃ@                       - base decompression [reversed @arguments]
                                        -     this uses the concatenated list above as
                                        -     the 8 digits of that number in base 8.
                                        - implicit print

5

แบตช์178 170 159 ไบต์

@set/pb=
@set s=%b:0= %
@set s=%s:1= %
@set e=@echo %s%
%e%  %s% /%b%00
%e% /%b%0
%e%/ %s% \%b%01
@echo %b%
%e%\ %s% /%b%10
%e% \%b%1
%e%  %s% \%b%11

แก้ไข: บันทึกแล้ว 11 ไบต์ขอบคุณ @ ConorO'Brien


ฉันนับ149เท่านั้น
Engineer Toast

ฉันถือว่า Neil นับการแบ่งบรรทัดเป็น CRLF สไตล์ Windows ในขณะที่ TIO นับพวกเขาเป็น LF ฉันไม่แน่ใจว่า LF สามารถใช้กับ Batch บน Windows ได้หรือไม่
Alex A.

4

JavaScript (ES6), 112 ไบต์

s=>`22   /300
2 /30
2/2  4301
3
242  /310
2 431
22   4311`.replace(/./g,n=>[s.replace(/./g,' '),s,'\\'][n-2]||n)

การสาธิต


ทำไมไม่[n,n,s.replace(/./g,' '),s,'\\'][n]?
tsh

@tsh ซึ่งจะต้องค้นหา/\d/gมากกว่า/./gจะละเว้นอักขระที่ไม่ใช่ตัวเลข
Arnauld

4

Python 3 , 117 109 ไบต์

lambda k:'ll   /g00\nl /g0\nl/l  \g01\ng\nl\l  /g10\nl \g1\nll   \g11'.replace('l',' '*len(k)).replace('g',k)

ลองออนไลน์!

  • บันทึกแล้ว 8 ไบต์ขอบคุณJonathanAllan (การใช้ฟังก์ชั่นแลมบ์ดา)

สตริงรูปแบบเมื่อพิมพ์ดูเหมือนว่า:

ll   /g00
l /g0
l/l  \g01
g
l\l  /g10
l \g1
ll   \g11

นี่ดูดีสำหรับสตริงที่มีความยาว 1 ทั้งหมดที่เราต้องทำคือแทนที่ l ด้วยช่องว่างที่มีความยาวเท่ากับ g และแน่นอน g จะถูกแทนที่ด้วยสตริงเดิม


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

4

Python 3.6, 172 153 128 ไบต์

แท้จริงแล้วไม่ได้ตรงไปตรงมามากกว่านี้ ... จริง ๆ แล้วสั้นกว่าความพยายามเริ่มต้นของฉันในการสร้างอัลกอริทึม ช่างน่าเศร้าเหลือเกิน

k=input()
l=len(k)
b=' '*l
print(f'{b*2}   /{k}00\n{b} /{k}0\n{b}/ {b}\\{k}01\n{k}\n{b}\\ {b}/{k}10\n{b} \\{k}1\n{b*2} \\{k}01')

-19 ไบต์ขอบคุณ @Leo
-25 ไบต์ขอบคุณ @ L3viathan


ฉันคิดว่ามันจะสั้นกว่าถ้าปล่อย a, c และ d และใช้เฉพาะ b และช่องว่างในสตริงสุดท้าย (a is b*2+' ')
Leo

แปลกสำหรับฉันยังดู 172 ไบต์
programmer5000

@ programmer5000 ขออภัยนั่นอาจเป็นเพราะฉันลืมอัปเดตโค้ดเอง
HyperNeutrino

บันทึก 26 ตัวอักษรด้วยสตริงรูปแบบ:print(f'{a}/{k}00\n{b} /{k}0\n{b}/ {b}\\{k}01\n{k}\n{b}\\ {b}/{k}10\n{b} \\{k}1\n{b*2} \\{k}01')
L3viathan

@ L3viathan คุณตรวจสอบไวยากรณ์ได้ไหม? มันทำให้ฉันมีข้อผิดพลาดทางไวยากรณ์
HyperNeutrino

3

C, 170 168 ไบต์

ขอบคุณ @Neil สำหรับการบันทึกสองไบต์!

n;f(char*s){n=strlen(s);printf("%*c%s00\n%*c%s0\n %*c%*c%s01\n%s\n %*c%*c%s10\n%*c%s1\n%*c%s11",2*n+4,47,s,n+2,47,s,n,47,n+3,92,s,s,n,92,n+3,47,s,n+2,92,s,2*n+4,92,s);}

ลองออนไลน์!


1
แทนที่จะพิมพ์ a /หรือ` padded to width n + 1 , why not print a space, and then a / `หรือ\padded to width n?
Neil

เอาละลองอีกครั้งนะ แทนที่จะพิมพ์ a /หรือ\padded to width n+1ทำไมไม่พิมพ์ space และ a /หรือ\padded to width n?
Neil

3

Python 3 , 96 ไบต์

lambda s:"""   /00
 /0
/  \01

\  /10
 \1
   \11""".translate([s,' '*len(s),s])

ลองออนไลน์! อักขระที่ไม่สามารถพิมพ์ได้แสดงไม่ถูกต้อง รูปแบบสตริงเหมือนกับในรูปแบบของทางการแต่\x01สำหรับlและ\x02สำหรับgสำหรับ

ll   /g00
l /g0
l/l  \g01
g
l\l  /g10
l \g1
ll   \g11

ใช้ทดแทนสตริงกับงูหลาม 3 translateมีความยืดหยุ่น แปลรายการ[s,' '*len(s),s]แผนที่\x01การ' '*len(s)และการ\x02 sอักขระขนาดใหญ่ใด ๆ จะไม่เปลี่ยนแปลงเนื่องจากพวกเขาให้ดัชนีที่อยู่นอกขอบเขตของรายการ \x00ไม่สามารถใช้งานได้เนื่องจากมีการอ่านค่า null เป็นจุดสิ้นสุดของโปรแกรมดังนั้นรายการแรกจึงสูญเปล่า



2

ซ้อนกัน 81 ไบต์

{!n#'' '*@s's  s /n00
s /n0
s/ s \n01
n
s\ s /n10
s \n1
s  s \n11' '\l'$#~1/repl}

ลองออนไลน์!

ไม่น่าสนใจมากโชคไม่ดี นี่คือส่วนที่น่าสนใจที่สุด:

'\l'$#~1/repl
         repl     replace all
'\l'              letters
    $#~           by evaluating
       1/         over one argument (otherwise, it would evaluate the "last" thingy)

นี่คือการแก้ไขสตริงโดยทั่วไป แต่สั้นกว่า builtin 10 ไบต์


2

/// , 116 ไบต์

/[/\\\///x///*/[y\\0[ y\/\/y\\1[ y\//**********/y///s/yx//~/  /~ ss[x00
 s[x0
s[~s\\x01
x
s\\~s[x10
 s\\x1
~ ss\\x11

ลองออนไลน์!

อินพุตมีดังนี้:

/[/\\\///x/INPUT HERE!!!!!!!!//*/[y\\0[ y\/\/y\\1[ y\//**********/y///s/yx//~/  /~ ss[x00
 s[x0
s[~s\\x01
x
s\\~s[x10
 s\\x1
~ ss\\x11

ทำงานโดยใช้เทมเพลตพื้นฐานและเพิ่มช่องว่างและอักขระตามต้องการ

จำนวนไบต์เพิ่มขึ้นเนื่องจากØrjan Johansen ตระหนักว่ามันไม่ได้จัดการระยะห่างในตอนแรก แต่ปัญหาได้รับการแก้ไขแล้ว


ฉันให้ upvote ก่อนที่จะตรวจสอบว่ามันใช้งานได้ - แต่คุณไม่ได้ปรับระยะห่างให้ยาว ฉันไม่เห็นวิธีรวบรัดในการทำเช่นนั้นด้วยรูปแบบอินพุตตามตัวอักษร
Ørjan Johansen

หรือรอไม่ใช่ความสิ้นหวังทั้งหมดเนื่องจากมีการจำกัดความยาวของอินพุตที่ 11
Ørjan Johansen

สิ่งที่ต้องการและจากนั้นคุณจะได้รับระยะห่างกับ/*/\/y0\/ y\/\/y1\/ y\//**********/y///s/yx/ s
Ørjan Johansen

@ ØrjanJohansenโอ๊ะลืมเรื่องเว้นวรรค ... ขอบคุณ ฉันจะรวมรหัสของคุณเป็นคำตอบได้อย่างไร
สหาย SparklePony

FWIW /00/0|0//01/0|1//10/1|0//11/1|1//|/<\\y>//z/<y>x//<y>0/ //<y>1/ //<\\y\>///s/z/สามารถรองรับความยาวโดยพลการ
Ørjan Johansen

1

Python 2 , 101,91 ไบต์ 113 ไบต์

lambda y:'   ++/_00\n +/_0\n+/  +\\_01\n_\n+\\  +/_10\n +\\_1\n   ++\\_11'.replace('_',y).replace('+',' '*len(y))

ลองออนไลน์!

อินพุตเป็นสตริงของ 0 และความยาว 1 หรือ 2! นั่นคือ 0,01,10 หรือ 11!

+12 ไบต์ - แก้ไขระยะห่างใน \ สำหรับความยาวสองอินพุต


3
เอาต์พุตของคุณจะไม่ปรับตามความยาวของสตริง
ประกาศอย่างเป็นทางการ

1
... และคำถามระบุ " 0 < length of input < 11"
Jonathan Allan

1
@ อย่างเป็นทางการโอ้ใช่ เพิ่งสังเกตเห็น ขอบคุณ จะอัปเดตคำตอบของฉัน! โจนาธาน .. นั่นเป็นคำที่สะกดผิด ขอบคุณฉันแก้ไขมัน
กีรนาปราการะรัน

0

ถ่าน 34 ไบต์

P<³←⮌θF²«J³⁻×⁴ι²θP<²Iι↗F²«P⁺⁺θικ↓↓

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

P<³

พิมพ์คู่ซ้ายของ/s และ\s

←⮌θ

พิมพ์อินพุตที่จัดชิดขอบขวาที่ตำแหน่งปัจจุบัน

F²«

วนผ่านกิ่งไม้

J³⁻×⁴ι²

ย้ายตำแหน่งของสาขา เราสามารถทำสิ่งนี้ได้เพราะรากถูกพิมพ์อย่างถูกต้องชอบธรรมเพื่อให้สาขาตรงกลางอยู่ในตำแหน่งที่แน่นอนเสมอ

θ

พิมพ์อินพุต

P<²

พิมพ์คู่ขวาของและ/\

Iι

พิมพ์คำต่อท้ายสาขา

เลื่อนไปที่ใบไม้แรก

F²«

วนผ่านใบไม้

P⁺⁺θικ

พิมพ์อินพุตและสาขาและคำต่อท้ายใบ

↓↓

เลื่อนไปที่ใบไม้ถัดไป หมายเหตุ: หากช่องว่างต่อท้ายเป็นที่ยอมรับก็F²⁺⁺⁺θι궶จะบันทึกไบต์

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