수 안판 주판 그리기


32

단일 정수를 입력으로 사용하고 Suanpan 주판을 인쇄하는 가장 짧은 프로그램 작성

테스트 케이스

입력:

314159

산출:

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

입력:

6302715408

산출:

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

명령 줄에 번호를 줄 수 있습니까?
Joey

입력 길이에 대한 제한이 있습니까?
Joey

golf.shinh.org/p.rb? 와 유사 합니까? Soroban + 누가 골프를 더 잘하는지 에 대한 아이디어가 필요한 사람이 있다면 수정되었습니다.
Nabb

1
따라서 맨 위 줄과 맨 아래 줄은 항상 완전히 채워져 있습니까? 그들은 왜 그런 여분의 주판을 발명 했습니까? :)
Timwi

@Timwi, 같은 주판을 16 진수로 사용할 수 있습니다. 십진수에 사용될 때 여분의 행은 곱셈과 나눗셈을 수행 할 때 주로 사용됩니다
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 made this':-)라고 말할 수있는 문자가 남아있는 트윗에 들어갑니다.

편집 : 3 문자 절약은 Jesse Millikan의 답변 2 6$' || (__)'에서 빌린 것입니다.

추가 편집 : 내가 보지 못한 양쪽에 공백을 추가하여 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|]) 주판의 바닥 부분을 0과 1로 표현합니다.

   ((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) 주판의 상단 부분을 0과 1로 표현합니다.

   |:@(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[\' || (__)'){~ 0과 1은 이제 비드 또는 1이 없음을 나타내는 문자열을 선택하는 데 사용됩니다.

   ([:,.(_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

@Howard 11 개의 문자로 고정되었습니다. 부끄러움, 나는 100 이하로 떨어질 가능성이 있다고 생각했다. :-(
Gareth

잘 하셨어요. @Howard가 따라 잡기 위해해야 ​​할 일이 많이있는 것
같습니다

바운티가 3 일 남았습니다. 이 기간 동안이 항목을 허용 된 것으로 표시했습니다.
gnibbler

14

루비 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이보다 1 바이트 짧음 $&.to_i)이 주판은 실제로 16 진수로 작동합니다 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

펄 (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) 3 \n초를 실제 개행 문자로 변경했습니다 . 내가 이전에 생각하지 않았다 믿을 수 없어!

1
이것은 단지 ... 굉장합니다!
german_guy

8

윈도우 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) 코드 전체에서 문자열 보간 사용.
  • 2011-03-12 00:21 (321) 인라인 $l.
  • 2011-03-12 01:07 (299) 보다 반복적 인 부분과 형식 문자열에 대한 기능을 사용했습니다.
  • 2011-03-12 01:19 (284) 인수를 함수로 약간 변경했습니다. 명령 구문 분석 모드를위한 Hooray
  • 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 1시 42분 (215) 나는 더 이상 필요 $r하고 $b. 그리고 $a또한 사용되지 않습니다. 있는 그대로 $l.
  • 2011-03-12 01:46 (207)$OFS 한 번만 필요한 경우 설정할 필요가 없습니다 .
  • 2011-03-12 01:49 (202) 인라인 $f.
  • 2011-03-12 01:57 (200) 더 이상 형식 문자열이 필요하지 않습니다. 문자열 보간은 잘 작동합니다.
  • 2011-03-12 02:00 (198) 개별 행 생성을 약간 최적화했습니다 (파이프 라인 및 배열 인덱스 순서 변경).
  • 2011-03-12 02:09 (192)-join 실제로 추가 공간을 사용하여 효과를 볼 수 있으므로 필요하지 않습니다 .

5

하스켈, 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

델파이, 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.

델파이, 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는 4 개의 외부 문자를 왼쪽 인수로하여 '='행을 렌더링합니다.
  • d는 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

매스 매 티카 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

잘림 , 77 자

현상금은 트윗을 참조 하고 트위터는 문자 (바이트 아님)를 계산 합니다 . :)

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

나는 실제로 몇 년 전에 (이 도전이 게시되었을 때) 작성했지만이 도전이 처음 게시 된 후 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.