回転した回数を出力する長方形プログラムを作成する


63

タイトルはそれをすべて言います。あなたの目標は、回転および再実行して、行われた90°Counter-Clockwise(CCW)回転の数を出力できる、文字のw×h長方形を形成するプログラムを作成することです。

たとえば、3×2プログラムの場合

abc
def

問題を解決し、最初は0を出力し、90°CCWの連続回転

cf    fed    da
be    cba    eb
ad           fc

それぞれ1、2、3を出力します。

コメントを使用すると、ほとんどの言語でこれが簡単なタスクになります。たとえば、Rubyでは、7×7の長方形で実行できます。

###p###
### ###
###1###
p 0#2 p
###3###
### ###
###p###

課題は、コメントなしでこれを行うことです。

得点

スコアはw * h(長方形の面積)です。改行は除外されます。言い換えれば、コードゴルフ、改行はカウントされません。

Rubyの例のスコアは49です(もちろん、コメントがあるため無効です)。

ノート

  • コードは実際には長方形で、行末に欠落文字がない必要があります。
  • 必要に応じて、0 1 2 3の代わりに他の有効な「mod 90°」値を出力できます。したがって、0の代わりに8、3の代わりに-1が適切です。
  • 出力はコンソールまたはファイルに送られます。
  • 標準の抜け穴が適用されます。

これが私の最初の質問であり、本当に何人かの人々の興味を引くことを願っています。楽しい!


1
コメントとは何かをより具体的に言うと、コメントは未評価のコードですか?未解析コード?
isaacg 14

つまり、言語の従来の「コメント文字」は、4つのローテーションバージョンのいずれにも表示されないということです。したがって、C ++の場合、2つのスラッシュが隣り合って表示されることはありませんが、1つを単独で使用できます。/ *でも同様です。それが明らかになることを願っています。
カルビンの趣味14

コメント文字を持たない言語はどうですか?
isaacg 14

echo 0;exit;ebashのようなコードは許可されますか?
jimmy23013 14

コメントする方法がない場合は、心配する必要はありません。@ user23013そのbashは大丈夫です。
カルビンの趣味14

回答:


43

APL(1x3 = 3)

5!3

このソリューションでは、正しいmod 4の出力が機能するという追加のルールを使用します。

APLでは、から要素x!yを選択する方法の数で、一般にまたはとして知られています。各回転が正しい答えを与えることを確認しましょう。xybinom(y,x)choose(y,x)

0回転

5!3

3から5つの要素を選択する方法はないため、0が取得され、自動的に印刷されます。

1 CCW回転

3
!
5

APLは各行を喜んで評価し、number 3、operator !、そしてnumberを取得し、5これらの最後の(5)のみを出力します。これは1 mod 4です。

2 CCW回転

3!5

これはbinom(5,3)、つまり(5*4*3*2*1)/(3*2*1)/(2*1) = 10、2 mod 4です。

3 CCW回転

5
!
3

前と同じように、最後に評価された値のみ3がプリンターです。

私は実際にはAPLを知らないので、説明に誤りがある場合は教えてください。私はこのサイトの最初の言語として試行錯誤でそれを見つけました:

  1. 式の結果を自動的に印刷します
  2. 複数行の式がある場合、最後の式のみを出力します
  3. ライン上に単独で立っているオペレーターには問題ありません
  4. 演算子を中置します
  5. 非対称(aRb!= bRa)で、さまざまな数値を返すのに十分な柔軟性を備えた単一文字の算術バイナリ演算子を備えています。

(5)については、APL ダイアディック関数のリストを下っていきました。私の最初の候補演算は/CとPython 2の整数除算でしたが、APL除算÷は浮動小数点数を与えます。べき乗は魅力的ですが、同じパリティaa^b持っているのに失敗しますが、連続回転によって取得されます(ただしb=0、ただしを除くb^a=0)。<give 01180度離れたようなブール演算子は機能しません。最後に、二項演算子を見つけ、!その結果が得られるまで数字を試しました。

2x2よりも小さなソリューションが存在するという自信を持っているQuincunxに感謝します。


6
男、非難解な言語を使用して勝つ答えを見るのは素晴らしいことです。
スチュアートP.ベントレー14

私のルールではこれが最短であるため、これを回答として受け入れましたが、Venteroの回答(codegolf.stackexchange.com/a/33162/26997)を非常に名誉な言及にしたいと思います。それは問題の真の本質に従います。
カルバンの趣味14

また、Jで指定したとおりの形式で機能します。
ɐɔıʇǝɥʇuʎs

実際、APLは90°回転で3と5の両方を印刷しませんか?
FUZxxl

@FUZxxlこれはngn / aplでのみ機能すると思います。
アダム

40

ルビー、7×9(63)

 30;p  
0||p=p 
0|0;p;p
;p;p|p;
p=p ||0
;p   p;
2||p =p
 00;1  
     p 

他のソリューションよりも少し長くなりますが、少なくともこのソリューションは暗黙的な印刷やルールの乱用に依存しません。4つのローテーションすべてについて、完全なコードが解析され、一部の短絡以外はすべて実行されます。驚くべきことに、コードにはまったく対称性がありません

この解決策はp、同じ名前の変数が既に定義されている場合でも、関数を呼び出すことができるという事実に依存しています。たとえば、変数を引数としてp p関数pを呼び出すようなものですp(したがって、の値を出力しますp)。

コードで使用されるいくつかの一般的な式の説明:

  • p:上記のように、これは関数呼び出しまたは変数のいずれかです。変数が定義されpていない場合、これは引数なしで関数を呼び出し、何もせずに戻りますnil
  • p p:変数を出力しますp
  • p|xp関数がの場合、これはと同じnil|xで、の値に応じてtrue / falseを返しますxpが整数の場合、ビット単位のorです。いずれにしても、このステートメントには副作用はありません。
  • p=p||x:(p||=x条件付き割り当て)と実質的に同じで、構文的に有効であり、逆になったときに何もしないという利点があります。

対称バージョン(9×10 = 90)

    p    

  0 * 0  
  00100  
  0||2* p
p *0||0  
  00300  
  0 * 0  

    p    

これは私が思いつくことができる最短の対称的な解決策です(印刷する数字を無視する場合はC 2)。

テストスクリプト

上記のコードを検証するためのテストスクリプトを次に示します(#空白が削除されず、実行前に削除されるように行末に追加されています)。

rotate=->s{s.split($/).map{|i|i.chars.reverse}.transpose.map(&:join).join($/)}

s=<<EOD.gsub(?#,"")
 30;p  #
0||p=p #
0|0;p;p#
;p;p|p;#
p=p ||0#
;p   p;#
2||p =p#
 00;1  #
     p #
EOD


puts ">>> 0°"
eval s
puts ">>> 90°"
eval rotate[s]
puts ">>> 180°"
eval rotate[rotate[s]]
puts ">>> 270°"
eval rotate[rotate[rotate[s]]]

10
これは、最短ではないかもしれないが、これはまさに私が探していた難読化輝きのようなものです:D
カルバンの趣味

1
@ Calvin'sHobbiesこれは、「あなたのコードは本当に行末に欠けている文字がない長方形でなければならない」という制限に適合していますか?
ジョシュアテイラー14

@JoshuaTaylor長方形で、いくつかの行はスペースで埋められています(これは、私が知る限り、文字です)。それが何らかの理由で制限を満たしていないならば、私はパッドもできた代わりに、セミコロンで行...
Ventero

@Ventero確かにこの合法性を願っています。質問の意味を理解しようとしています。
ジョシュアテイラー14

1
@Venteroのスペース(またはコメントや改行以外の実際のスペース)でのパディングは問題ありません。
カルビンの趣味14

33

GolfScript、4(2x2)

43
12

(mod 4)を印刷43120ます。回転は3241(1 mod 4)、2134(2 mod 4)、および1423(3 mod 4)を印刷します。

プロンプト:

必要に応じて、0 1 2 3の代わりに他の有効な「mod 90°」値を出力できます。したがって、0の代わりに8、3の代わりに-1が適切です。

実際には、これが機能する多くの数値セットがあります。このPythonプログラムでこれらを見つけました。

def f(a,b,c,d):
    return int("%i%i%i%i"%(a,b,c,d))
for a in range(10):
    for b in range(10):
        for c in range(10):
            for d in range(10):
                candidate = f(a,b,c,d) % 4 == 0
                candidate &= f(b,d,a,c) % 4 == 1
                candidate &= f(d,c,b,a) % 4 == 2
                candidate &= f(c,a,d,b) % 4 == 3
                if candidate:
                    print("%i, %i, %i, %i"%(a,b,c,d))

プログラムは0s(おそらく機能しない)を出力しますが、有効なソリューションは次の形式です。

ab
cd

ここでa∈{4,8}b∈{3,7}c∈{1,5,9}d∈{2,6}。IE (a,b,c,d)∈{4,8}×{3,7}×{1,5,9}×{2,6}は24のソリューションです。


7
非常に賢い。私は正直、余分なルールは無害だと思った。
カルビンの趣味14

4
@Everybodyこれは最小のプログラムではないことに注意してください。2x1が可能であり、可能な限り最小です。だから仕事に取り掛かる!
ジャスティン14

1
@isaacgYour score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
地下

2
@Quincunxそれでは投稿してください!
tomsmeding

1
ここの言語が評価した最後の数字を単に出力すると仮定すると、どのに対しても1 * n(1つの数字)のソリューションが存在するとは思わないn。これは、整数のパリティが右端の桁のパリティに等しいが、90度離れた回転は異なるパリティを生成する必要があるためです。したがって、2*2このアプローチの最小値です。
xnor 14

30

Python-23 x 23 = 529

OK、この質問にはすでに勝者がいますが、まだPythonソリューションはありません。だから私はそれについて考えた-重い!-そしてprint、他の方向のいずれかから解析されたときにエラーを生成することなく、任意の方向でかさばるコマンドを動作させる方法を見つけました。

ブレークスルーは次の行でした。

'"\'';forward_code;"';backward_code;""\'"''

forward_codeが実行されている間、はbackward_code文字列の一部であるため、印刷されません。これは、逆読みする場合のまったく逆の方法です。

したがって、さらに2つの方向と組み合わせて、すべての引用符が正しく一致するように微調整すると、次の解決策になります。

''"''""''"''"''"'"''""'
"  ""                 "
"  \\                 "
'"\'';print 1;"'""\'"''
'"\''"';3 tnirp;""\'"''
"  ;""                "
"  p'                 "
'  r;                 '
'  i2                 '
"  n                  "
"  tt                 "
'   n                 '
'  4i                 '
"  ;r     .-=<>=-.    "
' \"p    /__----__\   '
"  ';'  |/ (')(') \|  "
"  ""    \   __   /   "
'  ""    .`--__--`.   '
"  \\   /    :|    \  "
'  ''  (_)   :|   (_) '
'  ""    |___:|____|  '
"  ''    |_________|  "
''"''""''"''"''"'"''""'

編集:私はそのすべての空白を処理する方法を見つけました。;)


p=print現在非常に多くの空白があるので、ファイルに入れる方法はありますか?(もちろんPython 3)
isaacg 14

@isaacg:そうは思いません。定義p=printも長くなります。さらに重要なのpは、コードをローテーションした後は再利用できないことです!
ファルコ14

あなたは正しいと思います。ただし、2つ悪いです。
isaacg 14

12
ノミネート:Best Use of Whitespace Award。
primo 14

24

ベーシック、64

勝つことはできませんが、ここではとにかくです。(Chipmunk Basicでテスト済み)

?0:END:?
:::::::1
D:::::::
N::::::E
E::::::N
:::::::D
3:::::::
?:DNE:2?

注:?PRINT、BASICのさまざまな方言の略記です。コードには多くの構文エラーがありますがEND、最初の行のステートメントにより、インタープリターがそれらを見ることができなくなります。


1
実際、スコアはそれぞれ64と16です。改行はカウントされません。また、答えを分けてみませんか?
ジャスティン14

ああ、そのビットを見逃した。彼らが共同の最後の場所を占めていなかったなら、私は答えを分けていただろう。それ以外の点はあまり意味がないようです:-)
きしむossifrage 14

あなたはもう長続きしません:-)
ジャスティン14

素敵なラウンド数のキャラクターを獲得するためのボーナスポイントを提供します。実際の+1は、創造的な使用のためENDです:)
CompuChip

21

Pyth、9文字(3x3)

0 1

3 2

pythでは、スペースが先行しない限り、すべてがデフォルトで印刷されます。最初の行の後の行はユーザー入力用であり、このプログラムでは評価されません。

9文字を取得する別の方法:

"0"
3 1
"2"

Pyth 1.0.5、4文字

最近のpythの変更により2桁の数字の生成が困難になりました(元に戻すことを検討している変更)が、Pythの古いバージョンでは2桁の数字が簡単に生成され、暗黙の印刷と最初の行以外のすべての行無視され、次の解決策が得られます。

32
41

32、21、14、43を印刷します。


まあ、それはただの楽しみです。+1
seequ 14

シャック、そう簡単ではないことを望んでいた。中央の行に3つの文字がありませんが、ここでの自動書式設定によるものと推測しています。
カルビンの趣味14

@ Calvin'sHobbiesすみません、わかりました。それは私の末尾のスペースをむちゃにしました。
isaacg 14

@Quincunxああ、私は得点のその部分を見逃した。修正していただきありがとうございます。
isaacg 14

18

Befunge、16歳

0.@1
@@@.
.@@@
3@.2

説明:から数字09スタックに対応する番号を押して、.スタックから値をポップし、整数としてそれを印刷し、@プログラムを終了します。

ここでテスト済み)


これは反時計回りに回転した回数を出力しませんか?
seequ 14

@TheRareはい。します。それがすべきことです。
ジャスティン14

1
私は完全に盲目なようです。そのため、+ 1があります。
seequ 14

楽しもう!!! いつまでも私の好きな言語は永遠に永遠です!
ステフェン

16

ピート、49

Pietプログラム

私は黄色と赤の色を使用し、それをほぼ対称にしようとすることだけを指摘しました。回転すると、0、1、2、または3が印刷されます。Pietでプログラムを終了するのは難しく、残念ながら画像の約半分のスペースを占有します。


1
仕事に適したツールのようです。
ロバートフレイザー

O_o、このプログラミング言語について知りたくて泣きました!ちょうど今。綺麗な。いろいろな意味で!ありがとうございました!
ステフェン

15

GNU dc、6(3x2)

これは「mod 90°」ルール緩和を必要としない最短の答えだと思います。

3z1
0p2

出力012または3各回転について。

02および3回転については、pスタックにプッシュされた最後の数値リテラルを単にポップして印刷します。用1回転、zスタックにプッシュ現在のスタック深さ(1)、次いで、pポップ及び印刷を。


1
311 / 0p2も動作しますか?
ニール14

@ニールはい、良いものです。ただし、ゴルフのスコアには影響しません:)
デジタルトラウマ

改行はカウントされませんが、スラッシュはカウントされるため、ゴルフスコアには影響しますが、マイナスになります。
M.ヘルツカンプ

@ M.Herzkamp私の想定では、ニールはを意味し311\n0p2\nは改行文字です。そうでなければ、dcのコンテキスト内では無意味になります。
デジタル外傷

10

GolfScript、9(3x3)

0}1
} }
3}2

ルールの乱用の並べ替え。}一致がない場合、プログラムを終了するために起こる{、スタックの内容は、プログラム終了時に印刷されています。


改行を文字として数えることを忘れないでください。
isaacg 14

2
@isaacgYour score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
地下

それ}が不均衡になる可能性があることは知りませんでした。ナイストリック。
ピーターテイラー14

9

JavaScript、4

03
12

このプログラム(またはこのプログラムのローテーション)をjavaScriptコンソールで実行すると、最後の行のみが評価され、コンソールにエコーされます。

そう:

12 modulo 4 == 0
01 modulo 4 == 1
30 modulo 4 == 2
23 modulo 4 == 3

同様に機能する同様の2x2プログラムはすべて次のとおりです。

03
12

03
16

03
52

03
56

03
92

03
96

07
12

07
16

07
52

07
56

07
92

07
96

43
12

43
16

43
52

43
56

43
92

43
96

47
12

47
16

47
52

47
56

47
92

47
96

83
12

83
16

83
52

83
56

83
92

83
96

87
12

87
16

87
52

87
56

87
92

87
96

言い換えれば、

ab
cd

ここで、aは[0,4,8]に、bは[3,7]に、cは[1,5,9]に、dは[2,6]にあります


8

CJam / GolfScript-3 * 3

2;3
;7;
1;0

セミコロンは前の番号をポップするため、右下隅のみが印刷されます。


6

アフイ、8

바몽희뷸
뷷희몽반

Aheuiには1をスタックにプッシュする文字がないため、0、5、2、および3を印刷することにしました。

説明:바とは、それぞれ0と2をスタックにプッシュし、カーソルを1文字右に移動します。뷸とは、それぞれ5と3をスタックにプッシュし、カーソルを2文字下に移動します。stackスタック内の数字をポップして印刷し、カーソルを1文字上に移動します。programプログラムを終了します。


5

JavaScript

(ブラウザコンソール、シェル、または別のREPLに入力されたため、結果が出力されます)

1+2
-3-
4+5

式、重要でない改行、および結果の自動印刷を備えた他の言語で動作するはずです。


2
私はこの背後にあるアイデアが好きですが、常に1(mod 4)を印刷しませんか?
zennehoy

2
より単純なバリエーションがあります'2,3\n,0,\n1,0'
キーン14

回転すると異なる結果が得られます。@コリー、それは賢いです!私も、カンマ演算子のない言語で作業することに慣れています。
lrn 14

@lrnはい、異なる結果が得られますが、それは要件ではありません。プログラムは、印刷しなければならない0(MOD 4)回転していない、及び1、2または3(MOD 4)倍...のそれぞれの数回転したとき
zennehoy

元のポスターの2番目のメモでは、異なるバージョンであれば、回転したバージョンの値を使用できます。
lrn 14

5

MATLAB /オクターブ- 144 100

ゴルフ:10 x 10 = 100

....d.....
....i.....
....s.....
... p2 ...
disp  1...
...3  psid
... 4p ...
.....s....
.....i....
.....d....

代替ソリューション:15 x 15 = 225

.......d.......
.......i.......
.......s.......
...    p    ...
...         ...
...    4    ...
...    .    ...
disp 1...3 psid
...    .    ...
...    2    ...
...         ...
...    p    ...
.......s.......
.......i.......
.......d.......

垂直および水平演算子「disp」が文字「p」を共有する場合、最初のソリューションをサイズ8x8に縮小できますか? ...d.... ...i.... ...s2... disp 1.. ..3 psid ...4s... ....i... ....d...
AMK 14

@AMK:残念ながら、これにより、行に構文エラーが発生します..3 psid。改行を示し、残りの文字を無視するには、各行の先頭に少なくとも3つのドットが必要です。
ファルコ14

5

Perl 5x7(35)

1+p+t+1
-print+
1+i+i+1
+tnirp+
1+t+p+1

パーティーに少し遅れました。-どの番号が印刷されるかは、孤独な人によって決まります。


4

JavaScript、3

2
1
4

動作します...ベース7。

ベース9バージョン:

2
7
0

説明

デバッグコンソールなどから対話的に実行すると、最後のステートメント/式の値が出力されます。

4 7 = 4 100(MOD 4
412 7 = 205 101(MOD 4
2 7 = 2 102(MOD 4
214 7 = 109 103(MOD 4

同様のソリューションは、任意の奇数ベースで見つけることができます。


これにはフラグが付けられましたが、質問または回答が理解できないため、スキップする必要がありました。downvotersが彼らのdownvotesを説明するコメントを残せばいいでしょう。
レインボルト14

@Rusher彼らはベース7ビットを理解していなかったと思う。
プリモ14

3

Befunge、12(6x2)

Befungeの2次元の性質を最大限に活用し、2つの方向でコードパスを垂直に実行することで、既存のBefungeの答えをわずかに改善することに成功しました。

0.@.1v
v3.@.2

オンラインで試してください:開始0回転1回転2回転3


2

マーベラス、7 * 14 = 98

.. \/ \/ .. ..
.. 31 \\ 32 \/
\/ \\ \/ \\ \/
\/ 30 \\ 33 ..
.. .. \/ \/ ..

回転したときに各セルがそのまま残ることを期待していますか?
スパー

2

Argh!/ Aargh!(4 * 4 = 16)

仕事に適切なツールを使用することについてはどうでしたか?コメントはありません(一般的な言語で)。

プログラムのファミリー全体(J:((|.@:|:) ^: (i. 4)) >'hpqh';'q01p';'p32q';'hqph'またはで生成((|.@:|:) ^: (i. 4)) 4 4 $ 'hpqhq01pp32qhqph'

hpqh
q01p
p32q
hqph

一度回転:

hpqh
q12p
p03q
hqph

2回回転:

hpqh
q23p
p10q
hqph

3回回転:

hpqh
q30p
p21q
hqph

これを説明するには、「インデントされた」バージョンを見るのが最善かもしれません(すべてのローテーションでも機能します)。

hhpq h
  0  h
q   1p
p3   q
h  2  
h qphh

このバージョンは、プログラムが4つの個別の部分で構成されていることを示しています。各部分はそれぞれの回転に対応しています。

  • h -制御フローを左に設定

  • p -その下のデータ/コードラスターのアイテムを印刷する

  • q -プログラムを終了します


2

フローター -9×5 = 45

ここに画像の説明を入力してください

コンソールに4、1、2、または3を印刷します。

「ブラック」は有効な命令(NOP)であり、構文的であることに注意してください。それなしでは、開始位置を見つけることができません。したがって、長方形内のすべての位置が占有されます。


1

要素、2x3 = 6

1*
`2
3 

これは、3x3の単純なソリューションよりも改善されています。3x3のソリューションでは、`両側に数字が表示されます。上記の0の場合*は、3を何も乗算せずに0を取得するために使用されるため、最も興味深いものです。それ以外は、それほど複雑ではありません。

スペースが気まずい場合は、を除く他のほとんどの文字に置き換えることができます[]{}`_

参考までに、他の3つのローテーションを次に示します。

case 1
*2 
1`3

case 2
 3
2`
*1

case 3
3`1
 2*

0

チップ、(2x5)10

b~
+a
~t
e*
 f

*すべての隣接要素をアクティブにします:北、東、南、西(ソース)
~、西からアクティブにされていない場合、東の隣(NOT-gate)をアクティブにします(ここではアクティブになりません)
t現在のバイトを出力した後、実行を終了します出力セットの
aビット0x01
b設定しますビット0x02出力は、
eビットセット0x10の出力は、
fビットセット0x20の出力を
+、任意の隣人によって活性化された場合に活性化する他のすべての隣人(ワイヤ)

チップには、-wフラグ(入力なしで実行できるようにする)、または実行するための入力が必要です。

プリント012、または3ASCIIインチ コードポイントがあれば0x00することが0x03望まれ、削除eおよびfその後のギャップを埋めるためにスペースを移動します。


0

Japt、3 * 1 = 3バイト

5zB

オンラインで試してください:そのまま1回2回3回回転します。

それぞれ0、5、2、11を出力します。

変数Bは値11を保持し、Number.z(other)フロア分割です(誰もが明らかに:pを探しました)。複数行コードの場合、最後の行が出力に渡されますが、これは単に定数です。


2 * 2 = 4バイト

2J
1T

オンラインで試してください:そのまま1回2回3回回転します。

それぞれ0、21、2、-1を出力します。

T0をJ保持し、-1 を保持します。

秘Theは、2つのリテラルまたは変数を並べて配置すると、コンマが挿入され、出力が最後のものになるということです。

2 * 2 JSソリューションはJaptでも機能します。

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