Gambarkan sempoa Suanpan

32

Tulis program terpendek yang menggunakan bilangan bulat tunggal sebagai input dan mencetak sempoa Suanpan

Testcases

Memasukkan:

314159

Keluaran:

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

Memasukkan:

6302715408

Keluaran:

|\==============================================================/|
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  ||
||   ||   (__)  (__)  (__)   ||   (__)   ||   (__)  (__)   ||   ||
||   ||    ||    ||    ||    ||    ||    ||    ||    ||    ||   ||
||  (__)   ||    ||    ||   (__)   ||   (__)   ||    ||   (__)  ||
|<==============================================================>|
||  (__)  (__)   ||   (__)  (__)  (__)   ||   (__)   ||   (__)  ||
||   ||   (__)   ||   (__)  (__)   ||    ||   (__)   ||   (__)  ||
||   ||   (__)   ||    ||    ||    ||    ||   (__)   ||   (__)  ||
||   ||    ||    ||    ||    ||    ||    ||   (__)   ||    ||   ||
||   ||    ||    ||    ||    ||    ||    ||    ||    ||    ||   ||
||   ||    ||   (__)   ||    ||    ||   (__)   ||   (__)   ||   ||
||  (__)   ||   (__)   ||    ||   (__)  (__)   ||   (__)   ||   ||
||  (__)   ||   (__)  (__)  (__)  (__)  (__)   ||   (__)   ||   ||
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)   ||   (__)  (__)  ||
||  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  (__)  ||
|/==============================================================\|
gnibbler
sumber
Bisakah nomornya diberikan pada command-line?
Joey
Adakah batasan panjang input?
Joey
Mirip dengan golf.shinh.org/p.rb?Soroban+Fixed jika ada yang membutuhkan ide tentang cara bermain golf lebih banyak.
Nabb
1
Jadi baris paling atas dan baris paling bawah selalu terisi penuh? Mengapa mereka menciptakan sempoa yang berlebihan? :)
Timwi
@Timwi, sempoa yang sama dapat digunakan untuk hexidecimal. Ketika digunakan untuk desimal, baris tambahan sebagian besar digunakan ketika melakukan perkalian dan pembagian
gnibbler

Jawaban:

14

J, 126 124 121 119 116 115 113 105 116 115 112 karakter

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

Mengambil input dari keyboard. Contoh:

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

Trik utama di sini adalah penyalahgunaan tinju J dengan mendefinisikan ulang karakter yang digunakannya. Ini menggunakan parameter global - 9!:7- untuk melakukan ini. Mungkin ada ruang untuk bermain golf lebih lanjut, tetapi sejujurnya saya hanya senang mendapatkan sesuatu yang berfungsi yang dapat mengimbangi upaya terakhir saya pada pertanyaan ini .

Cocok dalam tweet dengan karakter yang tersisa untuk mengatakan 'Gaz made this' :-).

Sunting: 3 karakter penghematan adalah karena meminjam jawaban 2 6$' || (__)'dari Jesse Millikan .

Sunting lebih lanjut: Kehilangan 11 karakter yang menambahkan ruang ekstra di kedua sisi yang tidak saya perhatikan tidak ada.

Penjelasan:

Kode ini ada dalam tiga bagian utama:

1) Pengaturan

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

Ini sendiri dalam dua bagian.
9!:7'\=/<=>/=\|='mendefinisikan kembali karakter yang akan digunakan J untuk menampilkan kotak. Tinju J biasanya terlihat seperti ini:

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

tetapi setelah mendefinisikan ulang tampilannya seperti ini:

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

(s=:[,.~,.)mendefinisikan kata kerja yang akan saya gunakan beberapa kali kemudian. Ini ternyata menjadi tempat terbaik untuk mendeklarasikannya. Dibutuhkan karakter di sebelah kiri dan array karakter di sebelah kanan dan sandwich array di antara karakter. Sebagai contoh:

   3 5$'abcdefghijklmno'
abcde
fghij
klmno

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

Final [hanya berfungsi untuk memisahkan pengaturan dari bagian selanjutnya.

2) Input dan Representasi

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

".,.1!:1[1 mengambil input dari keyboard dan memisahkannya menjadi satu digit:

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

((i.5)</5|]) menciptakan angka nol dan representasi dari bagian bawah sempoa:

   ((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) menciptakan angka nol dan representasi dari bagian atas sempoa:

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

Kedua bagian ini dikotak bersama menggunakan ;:

   (|:@(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|
/=======================\

Kemudian kotak-kotak ditempatkan satu di atas yang lain untuk membentuk dasar sempoa, memberikan:

   ,.(|:@(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) Output

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

&.>berarti apa yang mengikuti akan beroperasi pada kedua kotak pada gilirannya.
(,-.)ini adalah pengait yang akan meniadakan input dan kemudian menambahkannya ke akhir dokumen asli:

   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

Ini benar-benar bagian dari representasi, tetapi untuk tujuan golf lebih baik memilikinya di bagian ini. Diterapkan ke input sebelumnya:

   (,-.)&.>,.(|:@(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[\' || (__)'){~ Nol dan yang sekarang digunakan untuk memilih string untuk mewakili manik atau tidak adanya:

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

Tapi sekarang, seperti yang ditunjukkan Howard kepada saya, ada satu ruang pendek di kedua sisi manik-manik. Jadi kami menggunakan skata kerja yang telah ditentukan sebelumnya untuk mengapit isi setiap kotak antara dua kolom spasi:

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

Setelah melakukan itu, yang tersisa adalah mengonversinya menjadi string menggunakan ":sehingga kita dapat memasukkannya di antara dua kolom |:

   '|'s":(' 's[:,.(_6[\'  ||   (__)'){~(,-.))&.>,.(|:@(1,.<&5);((i.5)</5|]))".,.1!:1[1
314159
|\======================================/|
||  (__)  (__)  (__)  (__)  (__)  (__)  ||
||  (__)  (__)  (__)  (__)   ||    ||   ||
||   ||    ||    ||    ||    ||    ||   ||
||   ||    ||    ||    ||   (__)  (__)  ||
|<======================================>|
||  (__)  (__)  (__)  (__)   ||   (__)  ||
||  (__)   ||   (__)   ||    ||   (__)  ||
||  (__)   ||   (__)   ||    ||   (__)  ||
||   ||    ||   (__)   ||    ||   (__)  ||
||   ||    ||    ||    ||    ||    ||   ||
||   ||    ||    ||    ||   (__)   ||   ||
||   ||   (__)   ||   (__)  (__)   ||   ||
||   ||   (__)   ||   (__)  (__)   ||   ||
||  (__)  (__)   ||   (__)  (__)   ||   ||
||  (__)  (__)  (__)  (__)  (__)  (__)  ||
|/======================================\|
Gareth
sumber
Saya merasa ada sesuatu yang "salah" dengan output Anda, tetapi butuh beberapa waktu untuk mengenali: Anda menghilangkan kolom kosong di bagian paling kiri dan kanan layar (kolom ascii ketiga dan ketiga terakhir).
Howard
@Howard Woah, tempat yang bagus. Saya tidak memperhatikan itu. Saya akan lihat memperbaikinya.
Gareth
@ Howard Diperbaiki dengan biaya 11 karakter. Sayang, saya pikir saya mungkin memiliki kesempatan untuk mendapatkan di bawah 100. :-(
Gareth
Kerja bagus. Sepertinya @Howard memiliki banyak pekerjaan yang harus dilakukan untuk mengejar ketinggalan
gnibbler
Bounty memiliki 3 hari tersisa. Saya telah menandai yang ini untuk saat ini.
gnibbler
14

Ruby 1.9, 154 karakter

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\\|"

Asumsikan inputnya adalah tidak diakhiri oleh baris baru.

Fakta menyenangkan: Karena cara saya mengubah digit input menjadi angka ( $&.hexsatu byte lebih pendek dari $&.to_i), sempoa ini benar-benar berfungsi dengan hex digit hingga e:

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

Untuk 0xf , manik ketiga secara ajaib muncul di bagian atas.

Saat mengizinkan flag tambahan selama permintaan script, ini dapat dipersingkat menjadi 152 byte (kode 149 byte + 3 byte flag invokasi tambahan):

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\\|"

Jalankan dengan ruby -n suanpan.rb.

Ventero
sumber
12

Perl (151 karakter)

( 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\\|"

Penjelasan

# 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\\|"

Suntingan

  • (154 → 151) Mengubah tiga \ns menjadi karakter baris baru yang sebenarnya. Tidak percaya saya tidak memikirkan itu sebelumnya!
Timwi
sumber
1
Ini hanya ... Luar biasa!
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\|"

Sejarah:

  • 2011-03-11 23:54 (340) Upaya awal.
  • 2011-03-12 00:21 (323) Menggunakan interpolasi string di seluruh kode.
  • 2011-03-12 00:21 (321) Disorot$l .
  • 2011-03-12 01:07 (299) Menggunakan fungsi untuk bagian yang lebih berulang serta string format.
  • 2011-03-12 01:19 (284) Mengubah argumen ke fungsi sedikit. Hore untuk mode parsing perintah.
  • 2011-03-12 01:22 (266) Lebih banyak variabel untuk ekspresi berulang.
  • 2011-03-12 01:28 (246) Sekarang setiap baris dihasilkan oleh fungsi.
  • 2011-03-12 01:34 (236) Karena saya menggunakan karakter hanya dalam interpolasi string, saya dapat dengan aman mengabaikan %yang membuat angka dari angka.
  • 2011-03-12 01:34 (234) Sedikit dioptimalkan pembuatan indeks array dalam fungsi.
  • 2011-03-12 01:42 (215) Saya tidak perlu lagi $rdan $b. Dan $ajuga sudah usang. Apa adanya $l.
  • 2011-03-12 01:46 (207) Tidak perlu diatur $OFSjika saya hanya membutuhkannya sekali.
  • 2011-03-12 01:49 (202) Disorot $f.
  • 2011-03-12 01:57 (200) Tidak perlu lagi untuk format string. Interpolasi string berfungsi dengan baik.
  • 2011-03-12 02:00 (198) Sedikit dioptimalkan menghasilkan baris individu (memesan kembali pipa dan indeks array).
  • 2011-03-12 02:09 (192) Tidak perlu -joinkarena kita benar-benar dapat menggunakan ruang tambahan untuk efek yang baik.
Joey
sumber
5

Haskell, 243 karakter

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

Tidak terlalu pintar. Saya yakin itu bisa dipersingkat entah bagaimana ...


  • Sunting: (246 -> 243) menerima saran @ FUZxxl untuk menggunakan interaksi
MtnViewMark
sumber
Bagaimana kalau menggunakaninteract
FUZxxl
Baris pertama dapat disingkat menjadi z x|x=" (__) "|0<1=" || ".
FUZxxl
Baris pertama alternatif Anda hanya lebih pendek karena Anda menjatuhkan dua spasi yang diperlukan!
MtnViewMark
Ups! Anda tentu saja benar.
FUZxxl
4

Delphi, 348

Versi ini membangun string untuk menulis sekali saja; Digit ditangani oleh fungsi terpisah yang bekerja melalui digit modulo m >= valuekonstruk (dinegasikan jika nilai <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

Percobaan pertama :

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.

Ini menggunakan 3 array; satu untuk 7 string yang dapat dilihat, satu untuk garis output dan satu untuk memetakan 7 string menjadi 11 kolom (10 digit dan 1 kolom awal).

PatrickvL
sumber
3

GolfScript, 139 karakter

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*

Belum banyak bermain golf, tapi cocok dengan tweet (hanya dengan ASCII). Coba di sini .

Howard
sumber
2

J, 225

Lulus dua tes yang diberikan, harus bekerja hingga setidaknya beberapa ratus digit.

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

Pertama: Ya, ya, penggalian kuburan. Kedua: Itu sangat memalukan. Baiklah. Saya belum memutuskan apakah akan bermain golf lebih jauh atau meringkuk dalam posisi janin dan menangis. (Atau keduanya!)

Berikut sedikit penjelasan sebagai pengganti program yang lebih pendek:

  • c adalah tabel sel kosong 2x6, sel manik untuk rendering.
  • f merender baris '=' dengan empat karakter luar sebagai argumen kiri.
  • d merender baris sempoa dengan menerjemahkan 0/1 matriks ke dalam sel-sel manik yang diisi dengan ||
  • g mengambil digit dan mengkompilasi baris karakter secara vertikal menggunakan f untuk baris 'pemformatan' dan d untuk baris sempoa.
  • Baris terakhir mendapat input, terbagi menjadi karakter dan mengubahnya menjadi angka, diumpankan ke g dan kemudian dicetak.
Jesse Millikan
sumber
2

C, 277 274 karakter

Anda tahu, menurut saya kita tidak punya cukup solusi di sini yang benar-benar memanfaatkan prepro C. Sebagian karena #defineitu sebenarnya memakan sedikit ruang. Tapi tetap saja, ada begitu banyak potensi. Saya merasa perlu untuk mengatasi kekurangan ini.

#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,\\)}

Itu lebih baik.

kotak roti
sumber
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]]

Contoh

w[6302715408]

sempoa

DavidC
sumber
Selamat atas 10k! :-D
Gagang Pintu
@ Doorknob. Terima kasih! Selamat untukmu juga!
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")}

Versi pertama, hanya sedikit bermain golf sejauh ini.

schnaader
sumber
1

Scala (489 karakter)

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 _=>" ||"})}}}

Usaha yang jelek sekali.

Gareth
sumber
1

Sclipting , 77 karakter

Bounty mengacu pada tweet , dan Twitter menghitung karakter (bukan byte). :)

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

Saya sebenarnya menulis ini tahun lalu (ketika tantangan ini diposting), tetapi saya tidak pernah mempostingnya karena saya menemukan Sclipting setelah tantangan ini pertama kali diposting. Jika Anda merasa ini membuatnya tidak memenuhi syarat, saya mengerti.

Penjelasan

꿓뤽꿓뤽①長復 | 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"
Timwi
sumber
Terima kasih atas jawaban Anda yang menarik. Saya setuju bahwa yang terbaik adalah tetap berpegang pada aturan bahwa hanya bahasa yang diterbitkan sebelum pertanyaan yang diajukan yang memenuhi syarat. Saya tidak percaya Anda akan sengaja merancang bahasa Anda untuk memenangkan tantangan ini, tetapi pada saat yang sama saya tidak berpikir itu adil pada penjawab lainnya, dan kami tidak ingin membuka pintu air untuk bahasa yang baru ditemukan pada bahasa lama pertanyaan karena kita tahu apa yang akan terjadi ...
gnibbler
@gnibbler: Tentu, saya baik-baik saja dengan itu. Saya pikir aturan ini penting.
Timwi
1

Python, 309 301 288 karakter

Versi ringkas:

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]

Hapus versi:

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

Perhatikan bahwa untuk pemadatan, variabel diubah namanya menjadi satu huruf, dan pemahaman daftar diubah menjadi generator yang tidak memerlukan tanda kurung tambahan.

Nayuki
sumber