昇順/降順の数字のアーチを印刷します


28

この数字のパターンを説明するには、「アーチ」が最善の方法だと思いました。

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

正式に定義された各行は、1〜の数字9-n(n-1)*2スペース、および9-n1〜(数字nは現在の行)の数字で構成されます。

あなたの仕事は、可能な限り短いコードを使用して、以下の制限に従って上記のパターンを印刷する小さなスクリプト/プログラムを書くことです。

  1. パターン全体をハードコーディングすることはできません。パターンの1行のみをハードコーディングできます。
  2. プログラムは、各行の最後に改行(\nまたはの任意の組み合わせ\r)を印刷する必要があります。

位置についてよーいどん!


1
追加の小さなトリックは、上の行で利用できるようになる123456787654321、それが等しくなるよう11111111^2 ;-)
Egor Skriptunoffを

3
@EgorSkriptunoff 11111111^2 == 123465787654321 != 1234567887654321(繰り返されることに注意8
ボブ

これは、ソートのの逆である印刷このダイヤモンド
ピーター・テイラー

6
カーテンのように見えます。
ボラティリティ

回答:




9

APL(18)

k,⌽k←↑↑∘(1↓⎕D)¨⌽⍳8

説明:

  • 1↓⎕D:数字の文字列( "0123456789")から最初の要素を引いたもの
  • ↑∘(1↓⎕D)¨⌽⍳8:最初の[8..1]文字( '12345678'、 '1234567' ...)を選択します
  • :マトリックスとしてのフォーマット(未使用の文字を空白で埋める)
  • k,⌽k←:に保存しk、ディスプレイのk後に垂直ミラーリングが続くk

4

Ruby:61 50文字

s="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}

サンプル実行:

bash-4.2$ ruby -e 's="87654321";s.chars{|c|puts s.reverse+s;s[c]=" "}'
1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

4

Befunge-3 x 18 = 54

最後に使ってから長すぎるので、何かをする必要があると感じました。この問題は、言語に最も適していると感じました。

文字ごとに約8アクション(印刷スタイルが異なる)を行う印刷ループのため、非常に遅くなります。

80v >#v"12345678"<
>5 *^ >,#$:_$:1-:v
^2< 0p0+7\*48\_@#<


3

C、83文字

main(a,b,n){
    for(a=12345678,n=1e8,b=n-a-1;a;a/=10)
        printf("%-8d%8d\n",a,b),
        b%=n/=10;
}

3

Python 2、75 62

Volatilityの答えに勝るものはありませんが、Pythonの可変文字列(bytearray)を使用した別のアプローチがあります。

s=bytearray('1234567887654321')
for i in range(8):s[8-i:8+i]=i*'  ';print s

編集

を使用して、より短いバージョンを見つけましたstr.replace

s='1234567887654321'
for c in s[8:]:print s;s=s.replace(c,' ')

3

Perl、41

プラス-Eスイッチ。コマンドラインの合計文字数:50

少なくともperl5バージョン10が必要です。

perl -E'say@!=1..8-$_,$"x(2*$_),reverse@!for-0..7'

標準の外観-Eはプログラムへの1バイトの追加であるため、これは42だと思います。
ティムテック14年

3

Mathematica 92 85 67 54 51

方法#1:(54文字)row#、col#、および左右の端からの距離を使用して配列を作成します。

Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]

方法#2:(67文字)常に短縮する範囲を埋めます。

Print@@@Table[Join[k = PadRight[Range@i, 8, " "], Reverse@k], {i, 8, 1, -1}];

方法#3:(85文字)配列の各行を選択的に埋めます。

8個のスペース文字のリストから始めます。位置1と16を「1」に置き換えます。位置2および15などで「2」を置き換えます。

p = 0; q = 16;
Print @@@Reverse@Rest@NestList[ReplacePart[#, {++p -> p, q-- -> p}]&,Array[" "&,q], 8];

方法#4:(86文字)配列の各行を選択的に空にします。

p=8;q=9;
Print@@@NestList[ReplacePart[#,{p---> " ",q++-> " "}]&,Join[k=Range@8,Reverse@k],7];

方法#5:文字列(92文字)を使用する

p=8;s="12345678";
Print[#,StringReverse@#]&/@NestList[StringReplace[#,ToString@p-- ->  " "]&,s,7];

その新しいものは滑らかです!できればもう一度+1します。:-)ところで、あなたがドロップすることができ()、そして置き換える#1#Grid@Array[If[#2<9,#2,17-#2]/.x_/;x+#>9:>" "&,{8,16}]
Mr.Wizard

ヒントをありがとう。はい、Arrayイテレータを追加しなくても素敵なテーブルを作成できる場合があります。
DavidC

3

PHP、68

(HamZaの回答に触発された)

for($n=8;$n;$r[]=$n--)echo str_replace($r," ","1234567887654321\n");

PHPのstr_replaceは、検索用の配列と置換用の文字列を受け入れることができるという事実で動作し、配列内のすべての項目を指定された文字列で置換します。各反復の後、現在の番号が検索配列に追加され、次のループから削除されます。

動作中のコードの例:http : //ideone.com/9wVr0X


hehe nice +1
ハムザ

しかし、真ん中に正しい数のスペースを入れているようには見えない
ネイサンヘイフィールド

@nathanhayfield:どうして?最初のライン等、第2を有し、0スペースを有し、次いで、4、6、8
氏ラマ

私はそれを実行しない場合はwritecodeonline.com/php
ネイサンはヘイフィールド

これは、出力が<pre>タグでラップされていないためです。HTMLテキストとして解釈される場合、スペースは折りたたまれ、改行は無視されますが、ソースを確認すると、そうでない場合に表示されます。
ラマ氏

3

マーベラス 165

@0
08
>0
LN
--
@0
:LN
}0}0}0}0
..SAPSSD0A
{0
:PS
}0
~~09
..//
<<@0
\\>0
&0//
--@1
@020
&0/\&0
@1
:SA
@0
}0
>0!!
--00@1
@0++//
+O/\@1
+O
:SD
}0@0
\\>0\/
--/\+O
@0..+O

擬似コード:

MB():
    for x in 8..1:
        LN(x)
LN(x):
    SA(x)
    PS(x)
    SD(x)
    print "\n"
PS(x):
    print " "*(8-x)*2
SA(x):
    for n in 1..x:
        print n
SD(x):
    for n in x..1:
        print n

2

Python 2.x- 73 65 63 61文字

c=1;s='87654321'
while c<9:print s[::-1]+s;s=' '*c+s[c:];c+=1

2

PHP、76

for($i=9;$i>1;){$r[]=$i--;echo str_replace($r,' ','1234567887654321')."\r";}

2

K、28

-1_a,'|:'a:8$'{-1_x}\,/$1+!8

k)-1_a,'|:'a:8$'{-1_x}\,/$1+!8
"1234567887654321"
"1234567  7654321"
"123456    654321"
"12345      54321"
"1234        4321"
"123          321"
"12            21"
"1              1"

36に一般化できます。 {-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x}

k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 5
"1234554321"
"1234  4321"
"123    321"
"12      21"
"1        1"
q)k){-1_a,'|:'a:(#*m)$'m:{-1_x}\,/$1+!x} 15
"123456789101112131415514131211101987654321"
"12345678910111213141  14131211101987654321"
"1234567891011121314    4131211101987654321"
"123456789101112131      131211101987654321"
"12345678910111213        31211101987654321"
"1234567891011121          1211101987654321"
"123456789101112            211101987654321"
"12345678910111              11101987654321"
"1234567891011                1101987654321"
"123456789101                  101987654321"
"12345678910                    01987654321"
"1234567891                      1987654321"
"123456789                        987654321"
"12345678                          87654321"
"1234567                            7654321"
"123456                              654321"
"12345                                54321"
"1234                                  4321"
"123                                    321"
"12                                      21"
"1                                        1"

2

Javascript、67文字

steveworleyの答えに触発されました(できればコメントします):

コードスニペット

a='1234567887654321\n',b='',c=10;while(--c)b+=a=a.split(c).join(' ')
<a href="#" onclick="javascript:document.getElementById('output').innerHTML = b;">Display</a>
<pre id="output">...</pre>

最後の改行の存在は規則に従います。

更新:括弧(演算子の優先順位)を削除して2文字を削減し、不要なスペースを削除して1文字を削減

コードのセグメントのハードコーディングを解除して短縮または簡略化しようとしてさまざまな方法を試しても、以下に記載する「このカウントが重要だと思う」ルールを適用するまで、長さは同じままだったので、私を驚かせているように見えました。

(印刷がChromeコンソールで実行されたときに戻ってくるものとしてカウントされる場合)


他の答えのようには見えません。数字は右の列に揃えられていません。
AL

@AL consonle btwから出力される内容を読む場合、アラートは必要ありません。
Sophiα2329

右側の列を揃えるには、結合の文字列引数に2ではなく1つのスペースが必要です。2つのスペースを使用すると、クロムベースのブラウザアラートに正しく配置されます。
Qwertiy 14年

あなたの投稿を更新し(編集は受け入れられるべきです)、結果をJSアラートなしでスニペットに表示しました。この場合、必要なスペースは1つだけです。
AL

2

Brainfuck:542バイト

-[----->+<]>--.+.+.+.+.+.+.+..-.-.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.+.+.+[-->+<]>++++..----[->++<]>-.-.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.+.[-->+<]>+++++....-----[->++<]>.-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.+.--[--->++<]>--......-----[->++<]>-.-.-.-.-.>++++++++++.[->+++++
<]>-.+.+.+.-[--->++<]>--........++[-->+++<]>+.-.-.-.>++++++++++.[->+++++
<]>-.+.+.[--->++<]>--..........++[-->+++<]>.-.-.>++++++++++.[->+++++
<]>-.+.--[--->++<]>............[-->+++<]>++.-.>++++++++++.[->+++++
<]>-.-[--->++<]>..............[-->+++<]>+.

1

Mathematica、59

61自分のアイデアを使用:

Grid[Clip[#~Join~Reverse@#&@Range@8,{1,9-#},{," "}]&~Array~8]

または59、デビッドの答えから借りる:

Grid@Array[Join[k=PadRight[Range[9-#],8," "],Reverse@k]&,8]

あなたのエントリーに触発され、グリッドを使用して4文字を保存しました。
DavidC


1

ハスケル、84

誰かが改善するための出発点:

mapM_ putStrLn[let l=take(8-i)"12345678"++replicate i ' 'in l++reverse l|i<-[0..7]]

最も可能性の高い部分は、l++reverse lポイントを自由にして、- letステートメントを取り除くことですがap、インポートが必要であることがわかりました。


1

PostScript:105文字

PSでは文字列処理は簡単ではありませんが、比較的単純なコードを作成できます。

0 1 7{(1234567887654321)dup
8 3 index sub(              )0 6 -1 roll 2 mul getinterval putinterval =}for

120文字のやや長いバージョンですが、2行目の先頭の8を1〜9の範囲の任意の数字に置き換えることで、異なる数のアーチを生成できます。

/D{dup}def/R{repeat}def/P{=print}def
8 D -1 1{1 1 index{D P 1 add}R pop 2 copy sub{(  )P}R D{D P 1 sub}R pop()=}for pop

PostScriptが大好きなのは私だけではないことを知ってうれしいです。
AJMansfield


1

K 20

{x,'|:'x:|x$,\$1+!x}    

q)k){x,'|:'x:|x$,\$1+!x}8    
"1234567887654321"    
"1234567  7654321"    
"123456    654321"    
"12345      54321"    
"1234        4321"      
"123          321"    
"12            21"    
"1              1"    

1

TSQL、148

編集:マナトワークの提案で148まで下げ、ORDER BYに調整します。

読みやすい:

WITH t AS(
    SELECT 1n, CAST(1 AS VARCHAR(MAX)) o
 UNION ALL
    SELECT n+1,o+CHAR(n+49)
    FROM t
    WHERE n<8
)
SELECT o  + SPACE(16-2*n) + REVERSE(o)
FROM t
ORDER BY 1 DESC

ゴルフ:

WITH t AS(SELECT 1n,CAST(1AS VARCHAR(MAX))o UNION ALL SELECT 1+n,o+CHAR(n+49)FROM t WHERE n<8)SELECT o+SPACE(16-2*n)+REVERSE(o)FROM t ORDER BY 1DESC

出力:

1234567887654321
1234567  7654321
123456    654321
12345      54321
1234        4321
123          321
12            21
1              1

1
良いですね。しかし、153文字をカウントした形式で投稿してください。とにかく、1文字列の代わりに数値を使用して、'1'すぐにcastそれを入力することで2文字を節約できますvarchar。これにより、149文字が得られますwith t as(select 1n,cast(1as varchar(max))o union all select n+1,o+char(n+49)from t where n<8)select o+space(16-2*n)+reverse(o)from t order by o desc
マナトワーク

@manatwork:153の数字を再現できませんでした。ただし、提案を適用しました。ありがとう!
快適

1

ハスケル、79

r n x|x>n=' '|True=x
t="87654321"
main=mapM(putStrLn.(`map`("12345678"++t)).r)t

これは、文字> nを' 'で置換することで機能します。文字nは、「87654321」(置換を実行する文字列の末尾)から取得されます。


1

PHP:61文字(または\ nを実際のASCII改行で置き換える場合は60文字)

(GigaWattとHamZaの回答に触発された)

for($n=9;$n;$r[$n--]=" ")echo strtr("1234567887654321\n",$r);

http://ideone.com/FV1NXu


1

PowerShell:38

ゴルフコード

8..1|%{-join(1..$_+"  "*(8-$_)+$_..1)}

ウォークスルー

8..1|%{... }8から1の整数をForEach-Objectループにパイプします。
-join(... )ネストされたコードの出力を、区切り文字のない単一の文字列に結合します。
1..$_ループ内の1から現在の整数までの整数を出力します。
+" "*(8-$_)8と現在の整数の差を掛けたダブルスペースを出力に追加します。
+$_..1現在の整数から1までの整数を出力に追加します。


1

ラムダ付きのJavaScript、147

(s="12345678")[r="replace"](/./g,i=>s[r](RegExp(".{"+(i-1)+"}$"),Array(i*2-1).join(" ")))[r](/\d{1,8} */g,m=>m+(Array(m%10+1).join(m%10+1)-m)+"\n")

Firefoxで確認できます。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.