Suanpan abaküsü çizin


32

Giriş olarak tek bir tam sayı alan ve bir Suanpan abaküsünü çıkaran en kısa programı yazın.

testcases

Giriş:

314159

Çıktı:

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

Giriş:

6302715408

Çıktı:

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

Numara komut satırında verilebilir mi?
Joey

Giriş uzunluğu ile ilgili herhangi bir kısıtlama var mı?
Joey

Golf.shinh.org/p.rb?Soroban+Fix ile benzer, eğer birileri daha fazla golf oynaması konusunda bazı fikirlere ihtiyaç duyarsa .
Nabb

1
Yani üst sıra ve alt sıra her zaman tamamen doldurulur mu? Neden bu kadar gereksiz bir abaküs icat ettiler? :)
Timwi

@Timwi, aynı abaküs hexidecimal için kullanılabilir. Ondalık kullanıldığında, fazladan satırlar çoğunlukla çarpma ve bölme işlemlerinde kullanılır
gnibbler 14:11

Yanıtlar:


14

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

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

Klavyeden girdi alır. Örnek:

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

Buradaki ana numara, J'nin boks karakterini kullandığı karakterleri yeniden tanımlayarak kötüye kullanılmasıdır. Bu bir kullanan küresel parametreyi - 9!:7- Bunu yapmak için. Daha fazla golf oynamak için yer olabilir, ancak dürüst olmak gerekirse , bu sorudaki son girişimi telafi edecek bir iş bulmaya memnun oldum .

'Gaz yaptı' diyecek kadar karakter bırakılmış bir tweet'e uyuyor :-).

Düzenleme: tasarrufların 3 karakter ödünç kaynaklanmaktadır 2 6$' || (__)'gelen Jesse Millikan'ın cevap.

Diğer düzenleme: Fark etmemiş olduğum her iki tarafa da fazladan boşluk ekleyerek 11 karakter kaybettim.

Açıklama:

Kod üç ana bölümden oluşmaktadır:

1) Kurulum

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

Bu iki bölümden oluşuyor.
9!:7'\=/<=>/=\|='J'nin kutuları görüntülemek için kullanacağı karakterleri yeniden tanımlar. J'nin boksu normalde şöyle görünür:

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

ancak yeniden tanımladıktan sonra şöyle görünür:

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

(s=:[,.~,.)Bir fiili tanımlar birkaç kez sonra kullanacağım. Bu, onu ilan etmek için en iyi yer olduğu ortaya çıkıyor. Solda bir karakter alır ve sağda bir karakter dizisi alır ve diziyi karakter arasında sandviçler. Örneğin:

   3 5$'abcdefghijklmno'
abcde
fghij
klmno

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

Final [, kurulumu bir sonraki bölümden ayırmaya yarar.

2) Girdi ve Temsil

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

".,.1!:1[1 girişi klavyeden alır ve ayrı basamaklara ayırır:

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

((i.5)</5|]) abaküsün alt kısmının sıfırlarını ve bir temsilini yaratır:

   ((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) bir sıfırlar ve abaküsün üst kısmının temsilini oluşturur:

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

Bu iki bölüm aşağıdakiler kullanılarak birlikte kutulanmıştır ;:

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

Daha sonra, kutular, abaküsün temelini oluşturmak üzere birbiri üzerine yerleştirilir:

   ,.(|:@(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) Çıktı

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

&.>sırayla her iki kutuda da aşağıdakilerin çalışacağı anlamına gelir.
(,-.)bu, girişi olumsuz etkileyecek ve orijinalin sonuna ekleyecek bir kancadır:

   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

Bu gerçekten temsilin bir parçası, ancak golf amacıyla bu bölümde olması daha iyi. Önceki girişe uygulanır:

   (,-.)&.>,.(|:@(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[\' || (__)'){~ Sıfırlar ve olanlar şimdi bir boncuk veya yokluğunu temsil eden bir dize seçmek için kullanılır:

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

Ama şimdi, Howard'ın bana işaret ettiği gibi, boncukların her iki tarafında da kısa bir boşluk var. Bu nedenle, önceden tanımlanmış sfiili, her bir kutunun içeriğini iki boşluk sütunu arasında sandviçlemek için kullanırız :

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

Bunu yaptıktan sonra, geriye kalan tek şey ":bunu iki dize arasında sandviç yapabilmemiz için kullanarak bir dizgeye dönüştürmektir |:

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

Çıktınızda “yanlış” bir şey olduğunu hissettim ancak ekranın sol ve sağında boş bir sütun atlarsınız (üçüncü ve üçüncü sonuncu sütun).
Howard

@Howard Woah, iyi nokta. Bunu farketmedim. Tamir etmeye bir göz atacağım.
Gareth,

@Howard 11 karakter pahasına düzeltildi. Utanç, 100'ün altına inme şansım olabileceğini düşündüm. :-(
Gareth

İyi iş. @Howard'ın yetişmek için yapacak çok işi var gibi görünüyor
gnibbler

Ödülün 3 günü kaldı. Bunu ortalama bir süre için kabul edildi olarak işaretledim.
gnibbler

14

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

Giriş olduğunu varsayar olmayan bir yeni satır sonlandırıldı.

Eğlenceli gerçek: Giriş hanelerini sayılara dönüştürdüğümden ( $&.hexbir bayttan daha kısa $&.to_i), bu abaküs aslında onaltılık rakamlarla çalışıyor e:

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

Çünkü 0xf, üst yarıda sihirli bir şekilde üçüncü bir boncuk belirir.

Komut dosyası çağrısı sırasında ek bayraklara izin verilirken, bu 152 bayta (149 bayt kodu + 3 bayt ek başlatma bayrağı) kısaltılabilir:

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

İle koş ruby -n suanpan.rb.


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

açıklama

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

Düzenlemeler

  • (154 → 151) Üç \nsaniye, gerçek satırsonu karakterlerine değiştirildi. Bunu daha önce düşünmediğime inanamıyorum!

1
Bu sadece ... Harika!
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\|"

Tarihçe:

  • 2011-03-11 23:54 (340) İlk deneme.
  • 2011-03-12 00:21 (323) Kod boyunca dize enterpolasyonu kullanma.
  • 2011-03-12 00:21 (321) Çizgisel$l .
  • 2011-03-12 01:07 (299) Daha tekrarlanan parçalar için bir işlev ve bir biçim dizesi için kullanılır.
  • 2011-03-12 01:19 (284) Fonksiyondaki argümanları hafifçe değiştirdi. Komut ayrıştırma modu için yaşasın.
  • 2011-03-12 01:22 (266) Tekrarlayan ifadeler için daha fazla değişken.
  • 2011-03-12 01:28 (246) Şimdi her satır işlev tarafından üretiliyor.
  • 2011-03-12 01:34 (236) Karakterleri sadece string interpolasyonunda %kullandığımdan, rakamlardan rakam yapan güvenli bir şekilde görmezden gelebilirim .
  • 2011-03-12 01:34 (234) İşlevde dizi dizini oluşturmayı biraz optimize etti.
  • 2011-03-12 01:42 (215) Artık ihtiyacım yok $rve $b. Ve $aaynı zamanda modası geçmiş. Olduğu gibi $l.
  • 2011-03-12 01:46 (207)$OFS Sadece bir kere ihtiyacım olursa ayarlamaya gerek yok.
  • 2011-03-12 01:49 (202) Satır içi $f.
  • 2011-03-12 01:57 (200) Artık biçim dizgisine gerek yok. Dize enterpolasyonu gayet iyi çalışıyor.
  • 2011-03-12 02:00 (198) Ayrı sıraları oluşturmak için hafifçe optimize edildi (boru hattı ve dizi indeksini yeniden sipariş etme).
  • 2011-03-12 02:09 (192)-join İyi bir etki yaratmak için ek boşluğu kullanabildiğimiz için buna gerek yok .

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

Özellikle akıllıca değil. Eminim bir şekilde kısaltılabilir ...


  • Düzenleme: (246 -> 243) @ FUZxxl'in etkileşimi kullanma önerisini aldı

Kullanmaya ne dersinizinteract
FUZxxl

İlk satır için kısa olabilir z x|x=" (__) "|0<1=" || ".
FUZxxl

Alternatif ilk satırınız sadece daha kısa çünkü gerekli olan iki boşluğu bıraktınız!
MtnViewMark

Hata! Elbette haklısın.
FUZxxl

4

Delphi, 348

Bu sürüm sadece bir kez yazmak için bir dize oluşturur; Rakamlar, bir digit modulo m >= valueyapı üzerinden çalışan ayrı bir işlev tarafından ele alınır (değer <0 ise olumsuzlanır).

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

İlk girişim :

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.

Bu 3 dizi kullanır; bunlardan biri ayırt edilebilecek 7 dize, biri çıktı çizgileri diğeri de 7 dize 11 sütuna eşleşecek (10 hane ve 1 ilk sütun).


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*

Henüz çok golf oynadım, ancak (yalnızca ASCII ile) tweet'le uyuyor. Burada dene .


2

J, 225

Verilen iki testten geçer, en az birkaç yüz haneye kadar çalışmalıdır.

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

İlk kapalı: Evet, evet, mezar kazıyor. İkincisi: Utanç verici derecede uzun. Oh iyi. Daha ileri golf oynamaya ya da cenin pozisyonunda kıvrılma ve ağlama kararına henüz karar vermedim. (Ya da her ikisi de!)

İşte kısa bir program yerine biraz açıklama:

  • c, 2x6 boş hücre tablosu, işlem için boncuk hücredir.
  • f, argüman olarak dört dış karakterden oluşan bir '=' satırı oluşturur.
  • d, 0/1 matrisleri || ile doldurulmuş boncuk hücrelerine dönüştürerek bir abaküs sırasını verir.
  • g, rakamları alır ve 'satırları biçimlendirmek için' f ve abaküs satırları için d kullanarak karakter satırlarını dikey olarak derler.
  • Son satır girdi alır, karakterlere ayrılır ve bunları sayılara dönüştürür, g'ye beslenir ve sonra yazdırır.

2

C, 277 274 karakter

Biliyor musun, bana göre C önişlemcisinden gerçekten faydalanacak yeterli çözümümüz yok. Kısmen, çünkü bu #defineaslında oldukça fazla yer kaplıyor. Ama yine de çok fazla potansiyel var. Bu eksikliği gidermek zorunda olduğumu hissediyorum.

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

Bu daha iyi.


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]]

Örnek

w[6302715408]

abaküs


10k için tebrikler! :-D
Doorknob

@Doorknob. Teşekkürler! Sana da tebrikler!
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")}

İlk versiyon, şimdiye kadar sadece biraz golf.


1

Ölçek (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 _=>" ||"})}}}

Gerçekten çok berbat bir girişim.


1

Sclipting , 77 karakter

Ödül, tweet'leri ifade eder ve Twitter karakterleri sayar (baytları değil). :)

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

Aslında bunu yıllar önce yazdım (bu zorluk yayınlandığında), ama asla göndermedim, çünkü bu meydan okuma ilk yayınlandıktan sonra Sclipting'i icat ettim. Bunun uygun olmadığını düşünüyorsan, anlıyorum.

açıklama

꿓뤽꿓뤽①長復 | 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"

İlginç cevabınız için teşekkürler. Kurallara uymanın en iyisi, sadece sorulan sorudan önce yayınlanan dillerin uygun olması gerektiğidir. Bu meydan okumayı kazanmak için dilinizi bilerek tasarladığınızı sanmıyorum, ama aynı zamanda diğer cevaplayıcılar için de adil olduğunu düşünmüyorum ve eskiden yeni icat edilmiş diller için taşkınları açmak istemiyoruz. ne olacağını bildiğimizden beri sorulan sorular ...
gnibbler

@gnibbler: Tabii, bununla iyiyim. Bence bu kural önemli bir kural.
Timwi

1

Python, 309 301 288 karakter

Kompakt versiyon:

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]

Versiyonu temizle:

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

Kompaktlaştırma için değişkenlerin tek bir harfle yeniden adlandırıldığını ve liste kavramalarının ekstra parantez gerektirmeyen jeneratörlerle değiştirildiğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.