วาดลูกคิดสวนผึ้ง


32

เขียนโปรแกรมที่สั้นที่สุดที่ใช้จำนวนเต็มเดียวเป็นอินพุตและพิมพ์ลูกคิด Suanpan

Testcases

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

314159

เอาท์พุท:

|\======================================/|
||  (__)  (__)  (__)  (__)  (__)  (__)  ||
||  (__)  (__)  (__)  (__)   ||    ||   ||
||   ||    ||    ||    ||    ||    ||   ||
||   ||    ||    ||    ||   (__)  (__)  ||
|<======================================>|
||  (__)  (__)  (__)  (__)   ||   (__)  ||
||  (__)   ||   (__)   ||    ||   (__)  ||
||  (__)   ||   (__)   ||    ||   (__)  ||
||   ||    ||   (__)   ||    ||   (__)  ||
||   ||    ||    ||    ||    ||    ||   ||
||   ||    ||    ||    ||   (__)   ||   ||
||   ||   (__)   ||   (__)  (__)   ||   ||
||   ||   (__)   ||   (__)  (__)   ||   ||
||  (__)  (__)   ||   (__)  (__)   ||   ||
||  (__)  (__)  (__)  (__)  (__)  (__)  ||
|/======================================\|

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

6302715408

เอาท์พุท:

|\==============================================================/|
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  ||
||   ||   (__)  (__)  (__)   ||   (__)   ||   (__)  (__)   ||   ||
||   ||    ||    ||    ||    ||    ||    ||    ||    ||    ||   ||
||  (__)   ||    ||    ||   (__)   ||   (__)   ||    ||   (__)  ||
|<==============================================================>|
||  (__)  (__)   ||   (__)  (__)  (__)   ||   (__)   ||   (__)  ||
||   ||   (__)   ||   (__)  (__)   ||    ||   (__)   ||   (__)  ||
||   ||   (__)   ||    ||    ||    ||    ||   (__)   ||   (__)  ||
||   ||    ||    ||    ||    ||    ||    ||   (__)   ||    ||   ||
||   ||    ||    ||    ||    ||    ||    ||    ||    ||    ||   ||
||   ||    ||   (__)   ||    ||    ||   (__)   ||   (__)   ||   ||
||  (__)   ||   (__)   ||    ||   (__)  (__)   ||   (__)   ||   ||
||  (__)   ||   (__)  (__)  (__)  (__)  (__)   ||   (__)   ||   ||
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)   ||   (__)  (__)  ||
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  ||
|/==============================================================\|

สามารถกำหนดหมายเลขในบรรทัดคำสั่งได้หรือไม่
Joey

ข้อ จำกัด ใด ๆ เกี่ยวกับความยาวอินพุต?
Joey

คล้ายกับgolf.shinh.org/p.rb?Soroban+ แก้ไขถ้าใครต้องการไอเดียเกี่ยวกับวิธีการเล่นกอล์ฟมากขึ้น
Nabb

1
ดังนั้นแถวบนและแถวล่างจึงถูกเติมเต็มเสมอ? ทำไมพวกเขาจึงคิดค้นลูกคิดซ้ำซ้อนเช่นนี้? :)
Timwi

@ Timwi ลูกคิดเดียวกันสามารถใช้เลขฐานสิบหกได้ เมื่อใช้สำหรับทศนิยมจะใช้แถวพิเศษเป็นส่วนใหญ่เมื่อดำเนินการคูณและหาร
gnibbler

คำตอบ:


14

J, 126 124 121 119 116 115 113 105 116 115 112 ตัวอักษร

'|'s":(' 's[:,.(_6[\'  ||   (__)'){~(,-.))&.>,.(|:@(1,.<&5);((i.5)</5|]))".,.1!:1[1[(s=:[,.~,.)9!:7'\=/<=>/=\|='

ใช้อินพุตจากคีย์บอร์ด ตัวอย่าง:

   '|'s":(' 's[:,.(_6[\'  ||   (__)'){~(,-.))&.>,.(|:@(1,.<&5);((i.5)</5|]))".,.1!:1[1[(s=:[,.~,.)9!:7'\=/<=>/=\|='
6302715408
|\==============================================================/|
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  ||
||   ||   (__)  (__)  (__)   ||   (__)   ||   (__)  (__)   ||   ||
||   ||    ||    ||    ||    ||    ||    ||    ||    ||    ||   ||
||  (__)   ||    ||    ||   (__)   ||   (__)   ||    ||   (__)  ||
|<==============================================================>|
||  (__)  (__)   ||   (__)  (__)  (__)   ||   (__)   ||   (__)  ||
||   ||   (__)   ||   (__)  (__)   ||    ||   (__)   ||   (__)  ||
||   ||   (__)   ||    ||    ||    ||    ||   (__)   ||   (__)  ||
||   ||    ||    ||    ||    ||    ||    ||   (__)   ||    ||   ||
||   ||    ||    ||    ||    ||    ||    ||    ||    ||    ||   ||
||   ||    ||   (__)   ||    ||    ||   (__)   ||   (__)   ||   ||
||  (__)   ||   (__)   ||    ||   (__)  (__)   ||   (__)   ||   ||
||  (__)   ||   (__)  (__)  (__)  (__)  (__)   ||   (__)   ||   ||
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)   ||   (__)  (__)  ||
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  ||
|/==============================================================\|

เคล็ดลับหลักของที่นี่คือการใช้ชกมวยของ J โดยการนิยามตัวละครที่ใช้ใหม่ มันใช้พารามิเตอร์ส่วนกลาง - 9!:7- เพื่อทำสิ่งนี้ อาจมีห้องสำหรับเล่นกอล์ฟต่อไป แต่ตามจริงแล้วฉันแค่ดีใจที่ได้งานที่ควรชดเชยความพยายามครั้งสุดท้ายของฉันที่คำถามนี้

พอดีกับทวีตที่มีตัวอักษรเหลือพอที่จะพูดว่า 'Gaz ทำสิ่งนี้' :-)

แก้ไข:การออม 3 ตัวเนื่องจากการยืมคำตอบ2 6$' || (__)'จากJesse Millikan

การแก้ไขเพิ่มเติม:แพ้ 11 ตัวอักษรเพิ่มช่องว่างเพิ่มเติมที่ด้านใดด้านหนึ่งที่ฉันไม่ได้สังเกตเห็นว่าไม่มีอยู่

คำอธิบาย:

รหัสอยู่ในสามส่วนหลัก:

1) ตั้งค่า

[(s=:[,.~,.)9!:7'\=/<=>/=\|='

นี่คือตัวมันเองในสองส่วน
9!:7'\=/<=>/=\|='กำหนดอักขระที่ J จะใช้เพื่อแสดงกล่อง ปกติแล้วมวยของ J จะมีลักษณะเช่นนี้:

   2 2$<"0[1 2 3 4
┌─┬─┐
│1│2│
├─┼─┤
│3│4│
└─┴─┘

แต่หลังจากนิยามใหม่ดูเหมือนว่า:

   2 2$<"0[1 2 3 4
\===/
|1|2|
<===>
|3|4|
/===\

(s=:[,.~,.)กำหนดคำกริยาฉันจะใช้อีกสองสามครั้งในภายหลัง นี่เป็นสถานที่ที่ดีที่สุดในการประกาศ มันต้องใช้ตัวอักษรทางซ้ายและอาเรย์ของตัวละครทางด้านขวาและประกบอาเรย์ระหว่างตัวละคร ตัวอย่างเช่น:

   3 5$'abcdefghijklmno'
abcde
fghij
klmno

   '-' s 3 5$'abcdefghijklmno'
-abcde-
-fghij-
-klmno-

สุดท้าย[ก็ทำหน้าที่แยกการตั้งค่าจากส่วนถัดไป

2) การป้อนข้อมูลและการเป็นตัวแทน

,.(|:@(1,.<&5);((i.5)</5|]))".,.1!:1[1

".,.1!:1[1 นำอินพุตจากคีย์บอร์ดและแยกออกเป็นตัวเลขแต่ละตัว:

   ".,.1!:1[1
314159
3 1 4 1 5 9

((i.5)</5|]) สร้างศูนย์และวัตถุที่เป็นตัวแทนของส่วนล่างของลูกคิด:

   ((i.5)</5|]) 3 1 4 1 5 9
1 1 1 1 0 1
1 0 1 0 0 1
1 0 1 0 0 1
0 0 1 0 0 1
0 0 0 0 0 0

|:@(1,.<&5) สร้างศูนย์และตัวแทนคนของส่วนบนของลูกคิด:

   |:@(1,.<&5) 3 1 4 1 5 9
1 1 1 1 1 1
1 1 1 1 0 0

ทั้งสองส่วนจะถูกบรรจุเข้าด้วยกันโดยใช้;:

   (|:@(1,.<&5);((i.5)</5|])) 3 1 4 1 5 9
\=======================/
|1 1 1 1 1 1|1 1 1 1 0 1|
|1 1 1 1 0 0|1 0 1 0 0 1|
|           |1 0 1 0 0 1|
|           |0 0 1 0 0 1|
|           |0 0 0 0 0 0|
/=======================\

จากนั้นกล่องจะถูกวางไว้ด้านบนของกล่องอื่นเพื่อสร้างพื้นฐานของลูกคิดให้:

   ,.(|:@(1,.<&5);((i.5)</5|]))".,.1!:1[1
314159
\===========/
|1 1 1 1 1 1|
|1 1 1 1 0 0|
<===========>
|1 1 1 1 0 1|
|1 0 1 0 0 1|
|1 0 1 0 0 1|
|0 0 1 0 0 1|
|0 0 0 0 0 0|
/===========\

3) การส่งออก

'|'s":(' 's[:,.(_6[\'  ||   (__)'){~(,-.))&.>

&.>หมายความว่าสิ่งต่อไปนี้จะทำงานบนทั้งสองกล่องในทางกลับกัน
(,-.)นี่คือตะขอที่จะคัดค้านการป้อนข้อมูลและเพิ่มลงในตอนท้ายของต้นฉบับ:

   2 5$1 0 1 0 1
1 0 1 0 1
1 0 1 0 1

   (,-.) 2 5$1 0 1 0 1
1 0 1 0 1
1 0 1 0 1
0 1 0 1 0
0 1 0 1 0

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

   (,-.)&.>,.(|:@(1,.<&5);((i.5)</5|]))".,.1!:1[1
314159
\===========/
|1 1 1 1 1 1|
|1 1 1 1 0 0|
|0 0 0 0 0 0|
|0 0 0 0 1 1|
<===========>
|1 1 1 1 0 1|
|1 0 1 0 0 1|
|1 0 1 0 0 1|
|0 0 1 0 0 1|
|0 0 0 0 0 0|
|0 0 0 0 1 0|
|0 1 0 1 1 0|
|0 1 0 1 1 0|
|1 1 0 1 1 0|
|1 1 1 1 1 1|
/===========\

[:,.(_6[\' || (__)'){~ ตอนนี้เลขศูนย์และคนที่ใช้ในการเลือกสตริงเพื่อเป็นตัวแทนลูกปัดหรือขาดหนึ่ง:

   ([:,.(_6[\'  ||   (__)'){~(,-.))&.>,.(|:@(1,.<&5);((i.5)</5|]))".,.1!:1[1
314159
\====================================/
| (__)  (__)  (__)  (__)  (__)  (__) |
| (__)  (__)  (__)  (__)   ||    ||  |
|  ||    ||    ||    ||    ||    ||  |
|  ||    ||    ||    ||   (__)  (__) |
<====================================>
| (__)  (__)  (__)  (__)   ||   (__) |
| (__)   ||   (__)   ||    ||   (__) |
| (__)   ||   (__)   ||    ||   (__) |
|  ||    ||   (__)   ||    ||   (__) |
|  ||    ||    ||    ||    ||    ||  |
|  ||    ||    ||    ||   (__)   ||  |
|  ||   (__)   ||   (__)  (__)   ||  |
|  ||   (__)   ||   (__)  (__)   ||  |
| (__)  (__)   ||   (__)  (__)   ||  |
| (__)  (__)  (__)  (__)  (__)  (__) |
/====================================\

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

   (' 's[:,.(_6[\'  ||   (__)'){~(,-.))&.>,.(|:@(1,.<&5);((i.5)</5|]))".,.1!:1[1
314159
\======================================/
|  (__)  (__)  (__)  (__)  (__)  (__)  |
|  (__)  (__)  (__)  (__)   ||    ||   |
|   ||    ||    ||    ||    ||    ||   |
|   ||    ||    ||    ||   (__)  (__)  |
<======================================>
|  (__)  (__)  (__)  (__)   ||   (__)  |
|  (__)   ||   (__)   ||    ||   (__)  |
|  (__)   ||   (__)   ||    ||   (__)  |
|   ||    ||   (__)   ||    ||   (__)  |
|   ||    ||    ||    ||    ||    ||   |
|   ||    ||    ||    ||   (__)   ||   |
|   ||   (__)   ||   (__)  (__)   ||   |
|   ||   (__)   ||   (__)  (__)   ||   |
|  (__)  (__)   ||   (__)  (__)   ||   |
|  (__)  (__)  (__)  (__)  (__)  (__)  |
/======================================\

สิ่งที่เหลือก็คือการแปลงให้เป็นสตริงโดยใช้":เพื่อให้เราสามารถประกบมันระหว่างสองคอลัมน์ของ|:

   '|'s":(' 's[:,.(_6[\'  ||   (__)'){~(,-.))&.>,.(|:@(1,.<&5);((i.5)</5|]))".,.1!:1[1
314159
|\======================================/|
||  (__)  (__)  (__)  (__)  (__)  (__)  ||
||  (__)  (__)  (__)  (__)   ||    ||   ||
||   ||    ||    ||    ||    ||    ||   ||
||   ||    ||    ||    ||   (__)  (__)  ||
|<======================================>|
||  (__)  (__)  (__)  (__)   ||   (__)  ||
||  (__)   ||   (__)   ||    ||   (__)  ||
||  (__)   ||   (__)   ||    ||   (__)  ||
||   ||    ||   (__)   ||    ||   (__)  ||
||   ||    ||    ||    ||    ||    ||   ||
||   ||    ||    ||    ||   (__)   ||   ||
||   ||   (__)   ||   (__)  (__)   ||   ||
||   ||   (__)   ||   (__)  (__)   ||   ||
||  (__)  (__)   ||   (__)  (__)   ||   ||
||  (__)  (__)  (__)  (__)  (__)  (__)  ||
|/======================================\|

ฉันรู้สึกว่ามีบางอย่าง "ผิดปกติ" กับเอาต์พุตของคุณ แต่ใช้เวลาพอสมควรที่จะจดจำ: คุณไม่ต้องเว้นว่างคอลัมน์ทางด้านซ้ายและขวาของจอแสดงผล (คอลัมน์ ascii ที่สามและสามสุดท้าย)
Howard

@ Howard Woah จุดที่ดี ฉันไม่ได้สังเกตว่า ฉันจะดูที่การแก้ไข
Gareth

@ โฮวาร์ดกำหนดราคา 11 ตัวอักษร อับอายฉันคิดว่าฉันอาจมีโอกาสได้ต่ำกว่า 100 :-(
Gareth

ทำได้ดีมาก ดูเหมือน @Howard มีจำนวนมากของการทำงานจะทำอย่างไรที่จะจับขึ้น
gnibbler

เงินรางวัลมีเวลา 3 วัน ฉันได้ทำเครื่องหมายสิ่งนี้ว่าเป็นที่ยอมรับในเวลานั้น
gnibbler

14

Ruby 1.9, 154 ตัวอักษร

puts'|\%s/|'%$r=?=*(2+6*gets.size),(0..14).map{|a|a==4?"|<#$r>|":"|| #{$_.gsub(/./){(5*a+n=$&.hex)/10!=1&&(a-n%5)/5!=1?' (__) ':'  ||  '}} ||"},"|/#$r\\|"

สมมติว่าอินพุตไม่ได้ถูกยกเลิกด้วยการขึ้นบรรทัดใหม่

ความจริงแล้วสนุก: เนื่องจากวิธีที่ฉันเปลี่ยนตัวเลขอินพุตให้เป็นตัวเลข ( $&.hexสั้นกว่าหนึ่งไบต์$&.to_i) ลูกคิดนี้จึงใช้งานกับเลขฐานสิบหกได้ถึงe:

$ echo -n "0123456789abcdef" | ruby suanpan.rb
|\==================================================================================================/|
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)   ||    ||    ||    ||    ||    ||   ||
||  (__)  (__)  (__)  (__)  (__)   ||    ||    ||    ||    ||    ||    ||    ||    ||    ||   (__)  ||
||   ||    ||    ||    ||    ||    ||    ||    ||    ||    ||   (__)  (__)  (__)  (__)  (__)  (__)  ||
||   ||    ||    ||    ||    ||   (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  ||
|<==================================================================================================>|
||   ||   (__)  (__)  (__)  (__)   ||   (__)  (__)  (__)  (__)   ||   (__)  (__)  (__)  (__)   ||   ||
||   ||    ||   (__)  (__)  (__)   ||    ||   (__)  (__)  (__)   ||    ||   (__)  (__)  (__)   ||   ||
||   ||    ||    ||   (__)  (__)   ||    ||    ||   (__)  (__)   ||    ||    ||   (__)  (__)   ||   ||
||   ||    ||    ||    ||   (__)   ||    ||    ||    ||   (__)   ||    ||    ||    ||   (__)   ||   ||
||   ||    ||    ||    ||    ||    ||    ||    ||    ||    ||    ||    ||    ||    ||    ||    ||   ||
||  (__)   ||    ||    ||    ||   (__)   ||    ||    ||    ||   (__)   ||    ||    ||    ||   (__)  ||
||  (__)  (__)   ||    ||    ||   (__)  (__)   ||    ||    ||   (__)  (__)   ||    ||    ||   (__)  ||
||  (__)  (__)  (__)   ||    ||   (__)  (__)  (__)   ||    ||   (__)  (__)  (__)   ||    ||   (__)  ||
||  (__)  (__)  (__)  (__)   ||   (__)  (__)  (__)  (__)   ||   (__)  (__)  (__)  (__)   ||   (__)  ||
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  ||
|/==================================================================================================\|

สำหรับ0xfลูกปัดที่สามปรากฏขึ้นอย่างน่าอัศจรรย์ในครึ่งบน

เมื่ออนุญาตการตั้งค่าสถานะเพิ่มเติมระหว่างการเรียกใช้สคริปต์สามารถทำให้สั้นลงได้ถึง 152 ไบต์ (149 รหัสไบต์ + การตั้งค่าสถานะการเรียกใช้เพิ่มเติม 3 ไบต์):

puts'|\%s/|'%$r=?=*(2+6*~/$/),(0..14).map{|a|a==4?"|<#$r>|":"|| #{$_.gsub(/./){(5*a+n=$&.hex)/10!=1&&(a-n%5)/5!=1?' (__) ':'  ||  '}} ||"},"|/#$r\\|"

ทำงานด้วย ruby -n suanpan.rbทำงานด้วย


12

Perl (151 ตัวอักษร)

( 168 163 158 157 156 154 )

$i=<>;$c.=$_-4?"
||  $i||":"
|<$m>|",$m='==',$c=~s!\d!$m.='='x6;($_-$&%5)/5%2|(5*$_+$&)/10%7==1?' ||   ':'(__)  '!eg for 0..14;print"|\\$m/|$c
|/$m\\|"

คำอธิบาย

# Read the number from STDIN.
$i = <>;

# for statement starts here...

    # Append to $c a line containing either the horizontal dividing bar (in row #4)
    # or the current abacus row with the digits in place of the pegs.
    # This relies on the fact that $m will have been computed after at least one iteration.
    $c .= $_-4 ? "\n||  $i||" : "\n|<$m>|",

    # Notice that $m is redundantly recomputed from scratch in each iteration.
    $m = '==',

    # Substitute the correct pegs for the digit characters.
    $c =~ s!\d!
        $m .= '=' x 6;

        # Weird expression for the abacus function.
        # I have to use “% 7” because otherwise the division is floating-point...
        # Notice that $_ is the row and $& is the digit.
        ($_ - $& % 5)/5 % 2 | (5*$_ + $&)/10 % 7 == 1
        ? ' ||   '
        : '(__)  '
    !eg
for 0..14;

# Could shorten further by using “say” if you don’t mind excluding the “-E” from the count...
print "|\\$m/|$c\n|/$m\\|"

การแก้ไข

  • (154 → 151)เปลี่ยน\nอักขระสามบรรทัดเป็นอักขระขึ้นบรรทัดใหม่จริง ไม่อยากเชื่อเลยว่าฉันไม่ได้คิดถึงเรื่องนั้นมาก่อนเลย!

1
นี่เป็นเพียง ... เยี่ยมยอด!
german_guy

8

Windows PowerShell, 191

$y='='*(2+6*($i=[char[]]"$input").Count)
filter f($v){"|| $((' (__)','  || ')[($i|%{iex $_%$v})])  ||"}"|\$y/|"
f 1
f 10-ge5
f 1+1
f 10-lt5
"|<$y>|"
1..5|%{f 5-lt$_}
1..5|%{f 5-ge$_}
"|/$y\|"

ประวัติความเป็นมา:

  • 2011-03-11 23:54 (340)ความพยายามครั้งแรก
  • 2011-03-12 00:21 (323)การใช้การแก้ไขสตริงตลอดทั้งรหัส
  • 00:21 2011/03/12 (321)$l inlined
  • 2011-03-12 01:07 (299)ใช้ฟังก์ชั่นสำหรับชิ้นส่วนที่ซ้ำซ้อนและสตริงรูปแบบ
  • 2011-03-12 01:19 (284)เปลี่ยนอาร์กิวเมนต์ไปที่ฟังก์ชันเล็กน้อย ไชโยสำหรับโหมดการแยกวิเคราะห์คำสั่ง
  • 2011-03-12 01:22 (266)ตัวแปรเพิ่มเติมสำหรับนิพจน์ที่เกิดซ้ำ
  • 2011-03-12 01:28 (246)ตอนนี้ทุกแถวถูกสร้างโดยฟังก์ชัน
  • 2011-03-12 01:34 (236)เนื่องจากฉันใช้ตัวอักษรเฉพาะในการแก้ไขสตริงฉันจึงสามารถเพิกเฉยต่อสิ่ง%ที่ทำให้ตัวเลขจากตัวเลข
  • 2011-03-12 01:34 (234)ปรับการสร้างดัชนีอาร์เรย์ในฟังก์ชั่นเล็กน้อย
  • 2011/03/12 01:42 (215)ผมไม่จำเป็นต้องและ$r $bและ$aก็ยังล้าสมัย $lในฐานะที่เป็น
  • 2011-03-12 01:46 (207)ไม่จำเป็นต้องตั้งค่า$OFSถ้าฉันต้องการเพียงครั้งเดียว
  • 01:49 2011/03/12 (202)$f inlined
  • 2011-03-12 01:57 (200)ไม่จำเป็นต้องใช้สตริงรูปแบบอีกต่อไป การแก้ไขสตริงทำงานได้ดี
  • 2011-03-12 02:00 (198)ปรับการสร้างแถวแต่ละแถวเล็กน้อย (สั่งซื้อไพพ์ไลน์และดัชนีอาร์เรย์อีกครั้ง)
  • 2011-03-12 02:09 (192)ไม่จำเป็นต้องใช้-joinเพราะเราสามารถใช้พื้นที่เพิ่มเติมเพื่อให้ได้ผลที่ดี

5

Haskell, 243 ตัวอักษร

z x|x=" (__) ";z _="  ||  "
h[a,b]d f w='|':a:replicate(2+6*length d)'='++b:"|\n"++q z++q(z.not)
 where q b=w>>=(\v->"|| "++(d>>=b.(>v).f)++" ||\n")
s d=h"\\/"d(5-)[-9,0]++h"><"d(`mod`5)[0..4]++h"/\\"d id[]
main=interact$s.map(read.(:[])).init

ไม่ฉลาดโดยเฉพาะ ฉันแน่ใจว่ามันจะสั้นลงได้ ...


  • แก้ไข: (246 -> 243) ใช้คำแนะนำของ @ FUZxxl เพื่อใช้การโต้ตอบ

วิธีใช้งานinteract
FUZxxl

บรรทัดแรกสามารถย่อให้z x|x=" (__) "|0<1=" || "เป็น
FUZxxl

บรรทัดแรกที่เป็นทางเลือกของคุณสั้นกว่าเนื่องจากคุณทิ้งช่องว่างสองช่องที่ต้องการ!
MtnViewMark

อ๊ะ! คุณพูดถูก
FUZxxl

4

Delphi, 348

รุ่นนี้สร้างสตริงเพื่อเขียนเพียงครั้งเดียว ตัวเลขได้รับการจัดการโดยฟังก์ชั่นแยกต่างหากที่ทำงานผ่านการdigit modulo m >= valueสร้าง (เมื่อตะกี้ถ้าค่า <0)

var d,s,o,p:string;c:Char;i:Int8;function g(m,v:Int8):string;begin p:='|| ';for c in d do p:=p+Copy('  ||   (__) ',1+6*Ord(((Ord(c)+2)mod m>=Abs(v))=(v>0)),6);g:=p+' ||'^J;end;begin ReadLn(d);s:=StringOfChar('=',2+6*Length(d));for i:=1to 5do o:=g(5,6-i)+o+g(5,-i);Write('|\'+s+'/|'^J+g(1,-1)+g(10,-5)+g(1,1)+g(10,5)+'|<'+s+'>|'^J+o+'|/'+s+'\|')end.

Delphi, 565

ความพยายามครั้งแรก:

var _:array[0..6]of string=('  ||  ',' (  ) ','======','|\==/|','||  ||','|/==\|','|<==>|');m:array[0..186]of Byte;o:array[0..16]of string;i,j,c,f,l:Word;begin for i:=0to 9do begin f:=i*17;m[f+1]:=1;m[f+2]:=Ord(i<5);m[f+3]:=0;m[f+4]:=Ord(i>4);for j:=6to 10do m[f+j]:=Ord(i mod 5>j-6);for j:=11to 15do m[f+j]:=Ord(i mod 5<=j-11);m[f]:=2;m[5+f]:=2;m[16+f]:=2;end;f:=170;m[f]:=3;for i:=1to 15do m[f+i]:=4;m[f+5]:=6;m[f+16]:=5;repeat for i:=0to 16do Insert(_[m[f+i]],o[i],l);Read(PChar(@c)^);c:=c-48;f:=c*17;l:=Length(o[0])-2;until c>9;for i:=0to 16do WriteLn(o[i])end.

ใช้ 3 อาร์เรย์ หนึ่งรายการสำหรับ 7 สตริงที่สามารถแยกได้หนึ่งรายการสำหรับบรรทัดเอาท์พุทและอีกรายการหนึ่งเพื่อจับคู่ 7 สายกับ 11 คอลัมน์ (10 หลักและ 1 คอลัมน์เริ่มต้น)


3

GolfScript 139 ตัวอักษร

0+17'|':Q*:R'\<||'4Q**'/'+@{48-.5<)[1]*2,2*$+4<\5%[1]*2,5*$+10<+`{{1$=}%+2>'=='1/*5/('='+\+}+'     (|_|_ )'2//}/;;;;'/>||'4Q**'\\'+R]zip n*

ยังไม่ค่อยเล่นกอล์ฟมากนัก แต่มันเหมาะกับทวีต (มีเฉพาะ ASCII) ลองมันนี่


2

J, 225

ผ่านการทดสอบสองครั้งที่กำหนดควรทำงานได้อย่างน้อยหลายร้อยหลัก

c=:2 6$'   ||   (__)'
f=:(2{.[),('='#~2+6*#@]),2}.[
d=:'||',"1'  ||',~"1,"2&(c{~|:)
g=:('|\/|'&f,d&(1,.-.,.0,.])&(4&<),'|<>|'&f,d&(5($!.0"1)0,~"(1)1#~"0|~&5),|.&d&(5($!.0"1)1#~"0(5-5|])),'|/\|'&f)
4(1!:2)~LF,"1 g"."0}:(1!:1)3

ก่อนปิด: ใช่แล้ว ประการที่สอง: นั่นเป็นเพียงความยาวที่น่าอาย โอ้ดี ฉันยังไม่ตัดสินใจว่าจะเล่นกอล์ฟต่อไปหรือขดตัวในท่าทารกในครรภ์และร้องไห้ (หรือทั้งคู่!)

ต่อไปนี้เป็นคำอธิบายเล็กน้อยแทนโปรแกรมที่สั้นกว่า:

  • c คือ 2x6 ตารางของเซลล์ว่างเซลล์ลูกปัดสำหรับการเรนเดอร์
  • f แสดงแถว '=' โดยมีอักขระภายนอกสี่ตัวเป็นอาร์กิวเมนต์ด้านซ้าย
  • วาทกรรมลูกคิดแถวโดยการแปลเมทริกซ์ 0/1 เป็นเซลล์ลูกปัดเบาะด้วย ||
  • g ใช้ตัวเลขและรวบรวมแถวอักขระในแนวตั้งโดยใช้ f สำหรับแถว 'การจัดรูปแบบ' และ d สำหรับแถวลูกคิด
  • แถวสุดท้ายได้รับอินพุตแยกเป็นอักขระและแปลงเป็นตัวเลขฟีดไปที่ g แล้วพิมพ์

2

C, 277 274 ตัวอักษร

คุณรู้ไหมว่าสำหรับเราแล้วเราไม่มีโซลูชั่นเพียงพอที่จะใช้ประโยชน์จากตัวประมวลผลล่วงหน้า C อย่างแท้จริง ส่วนหนึ่งเป็นเพราะพื้นที่เหล่านั้น#defineใช้พื้นที่ว่างพอสมควร แต่ก็ยังมีศักยภาพมาก ฉันรู้สึกว่าจำเป็นต้องจัดการกับข้อบกพร่องนี้

#define L(x,z)for(printf("|"x),p=b;*p||puts(#z)<0;++p)printf(
#define F(x,y,z)L(#x,==z|)"======",y);
#define T(y)L("|  ",||)*p-47 y?"(__)  ":" ||   ");
i;char*p,b[99];main(j){gets(b);F(\\,0,/)T()T(<6)T(<1)T(>5)F(<,*p>52?*p-=5:0,>)
for(;++i<6;)T(>i)for(;++j<7;)T(<j)F(/,0,\\)}

นั่นดีกว่า.


2

Mathematica 281

w@n_:= Module[{t=Table,f,g},
 f@d_:=ReplacePart["O"~t~{7},{2-Quotient[d,5]-> "|",3+Mod[d,5]-> "|"}];
 g@k_:=IntegerDigits@n~PadLeft~10;
 Grid[Insert[Insert[(f/@g@n)T,"=="~t~{10},{{1},{3},{8}}]T,""~t~{10},{{1},{11}}]T]]

ตัวอย่าง

w[6302715408]

ลูกคิด


ขอแสดงความยินดีกับ 10k! :-D
Doorknob

@Doorknob ขอบคุณ! ขอแสดงความยินดีกับคุณเช่นกัน!
DavidC

1

C, 548

#define p(a) printf(a);
#define F(x,m) for(x=0;x<m;x++)
#define I(x) {p("||")F(j,l)if(b[l*(i+x)+j]){p("  (__)")}else{p("   || ")}p("  ||\n")}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int a,char* c[]){int i,j,l,m,*b;l=strlen(c[1]);b=(int*)malloc(l*56);m=6*l;F(i,14*l)b[i]=0;
F(j,l){b[j]=1;if(c[1][j]<53){b[l+j]=1;}else{b[3*l+j]=1;c[1][j]-=5;}F(i,5){if(i<c[1][j]-'0'){
b[(i+5)*l+j]=1;}else{b[(i+9)*l+j]=1;}}}p("|\\=")F(i,m)p("=")p("=/|\n")F(i,4)I(0)p("|<=")F(i,m)
p("=")p("=>|\n")F(i,9)I(5)p("|/=")F(i,m)p("=")p("=\\|\n")}

รุ่นแรกเพียงแค่เล่นกอล์ฟจนถึงตอนนี้


1

สกาลา (489 ตัวอักษร)

def a(i:String){val b=" (__) ";val n="  ||  ";1 to 17 map{l=>;{print(l match{case 1=>"|\\=";case 6=>"|<=";case 17=>"|/=";case _=>"|| "});print(l match{case 1|6|17=>"======"*i.size;case 2|16=>b*i.size;case 4|11=>n*i.size;case 3=>i flatMap{d=>{if(d.asDigit<5)b else n}};case 5=>i flatMap{d=>{if(d.asDigit>4)b else n}};case _=>i flatMap{d=>{if(l<11)if(d.asDigit%5<l-6)n else b else if(d.asDigit%5>l-12)n else b}}});;print(l match{case 1=>"=/|";case 6=>"=>|";case 17=>"=\\|";case _=>" ||"})}}}

พยายามเส็งเคร็งสวยจริงๆ


1

Sclipting , 77 ตัวอักษร

ค่าหัวหมายถึงทวีตและ Twitter นับตัวอักษร (ไม่ใช่ไบต์) :)

꿓뤽꿓뤽①長復標독렽꿐②껷렊밃겠上❶가侔是丟돃렽꿐②꿧렊不돇렠글⓶①各❷❷걐剩減갰減갰分❸⓷걀大加增增감右與꺅뭟꺒갠⓵긇롼긂갠嗎⓶終丟돇렊終終돂묽꿐②뇇렊

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

คำอธิบาย

꿓뤽꿓뤽①長復 | let x = "======" times the length of the input string
標 | mark
독렽꿐②껷렊 | "|\\==" + x + "/|\n"
밃겠上 | for row in [-4 .. 10]
    ❶가侔是 | if row == 0
        丟돃렽꿐②꿧렊 | "|<==" + x + ">|\n"
    不 | else
        돇렠글 | "||  "
        ⓶①各 | foreach char c in input
            | ((r-(c%5)-3)/3 & ((r + (c>4?3:2)) >> 1)) ? "(__) " : " ||   "
            ❷❷걐剩減갰減갰分❸⓷걀大加增增감右與꺅뭟꺒갠⓵긇롼긂갠嗎⓶
        終丟
        돇렊 | "||\n"
    終
終
돂묽꿐②뇇렊 | "|/==" + x + "\\|\n"

ขอบคุณสำหรับคำตอบที่น่าสนใจของคุณ ฉันเห็นด้วยที่ดีที่สุดที่จะปฏิบัติตามกฎว่าเฉพาะภาษาที่เผยแพร่ก่อนคำถามที่ถูกถามควรมีสิทธิ์ ฉันไม่เชื่อว่าคุณจงใจออกแบบภาษาของคุณเพื่อเอาชนะความท้าทายนี้ แต่ในขณะเดียวกันฉันไม่คิดว่ามันยุติธรรมสำหรับผู้ตอบคำถามคนอื่นและเราไม่ต้องการเปิดประตูระบายน้ำสำหรับภาษาที่ประดิษฐ์ขึ้นใหม่ คำถามตั้งแต่เรารู้ว่าอะไรจะเกิดขึ้น ...
gnibbler

@gnibbler: แน่นอนฉันไม่เป็นไร ฉันคิดว่ากฎนี้เป็นสิ่งสำคัญ
Timwi

1

งูหลาม 309 301 288 ตัวอักษร

รุ่นกะทัดรัด:

q=p,b="  ||  "," (__) "
t="|| %s ||\n"
a=lambda h:t%"".join(q[i]for i in h)
n=[int(d)for d in str(input())]
c=len(n)
e="="*(c*6+2)
h="|\\"+e+"/|"
print h+"\n"+t%(b*c)+a(d<5 for d in n)+t%(p*c)+a(d>4 for d in n)+"|<"+e+">|\n"+"".join(a((d%5>i%5)^(i>4)for d in n)for i in range(10))+h[::-1]

รุ่นที่ชัดเจน:

bead = " (__) "
pole = "  ||  "
template = "|| %s ||\n"
output = ""
def addline(hasbeads):
    global output
    output += template % "".join([bead if item else pole for item in hasbeads])

digits = [int(d) for d in str(input())]
count = len(digits)
equalsigns = "=" * (count * 6 + 2)
output = ""
header = "|\\" + equalsigns + "/|"
output += header + "\n"
output += template % (bead * count)
addline([d < 5 for d in digits])
output += template % (pole * count)
addline([d > 4 for d in digits])
output += "|<" + equalsigns + ">|\n"
for i in range(5):
    addline([d % 5 > i for d in digits])
for i in range(5):
    addline([d % 5 <= i for d in digits])
output += header[::-1]
print output

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

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