対角屈曲


9

プログラマーである私たちがフレックスするのを見るのはあまり面白くありません。今日はそれを変えます!この課題では、ヘキサフレクサゴンを字形に変えます。

ビデオ紹介については、FlexagonsでVihartsビデオをご覧ください

flexagonは、上と下以外の面を表示するために曲げることができる形状です。6つの面を持つhexahexaflexagonを作成しています。紙の片からヘキサヘキサフレクサゴンを折り畳む方法については、下の画像を参照してください。

hexahexaflexagon構造

Aストリップの両側を示しています。2つの白い三角形が接着されます。これはあなたがそれを変える方法です:

フレクサゴンを曲げる

以下は、考えられる状態とそれらの関係の図です。

図v6

色付きの円は、最初の画像と同じ番号の6つの三角形を表しています。それぞれの円には2つの色があります。下の色は背面(フレクサゴンをひっくり返す場所を確認するとわかります)を最もよく表しており、この課題で考慮する必要はありません。

それを曲げる4種類の方法がありますが、我々はこれらを呼び出す:背景に灰色の円はあなたが任意の状態であなたのflexagonを曲げることができますどのように表現しLeftRightUpDown。実際にこれらの方向に曲がることはありません。重要な点は、いくつかは互いに反対であることです。
あなたが中央にある場合は、使用することができますLeftし、Right他の中央のものに行くことに。センターから抜け出すには、Upとを使いますDown。中央にいないと使えないLeftまたはRight

Left/Down = clockwise
Right/Up  = anti-clockwise

チャレンジ

入力としてフレクサゴンの18の前面と18の背面、つまり一連の左、右、上、下のフレックスにあるものを入力として受け取り、フレックス後に8つの表示面を返す関数またはプログラムを作成します。

複雑な計算例:

flex "hexaflexaperplexia" 
     "flexagationdevices" 
     [Right, Right, Left]

Divide a strip of paper into 18 triangles:
1/2\3/1\2/3\1/2\3/1\2/3\1/2\3/1\2/3   Front
4/4\5/5\6/6\4/4\5/5\6/6\4/4\5/5\6/6   Back

Write "hexaflexaperplexia" on the front of the paper strip:
1/2\3/1\2/3\1/2\3/1\2/3\1/2\3/1\2/3

hexaflexaperplexia
123123123123123123
h  a  e  p  p  x     Face 1, Initially the front face
 e  f  x  e  l  i    Face 2, Initially the back face
  x  l  a  r  e  a   Face 3, Initially hidden


Write "flexagationdevices" on the back of the paperstrip:
4/4\5/5\6/6\4/4\5/5\6/6\4/4\5/5\6/6

flexagationdevices
445566445566445566
fl    at    ev       Face 4, up from 3
  ex    io    ic     Face 5, up from 2
    ag    nd    es   Face 6, up from 1


Flex it [Right, Right, Left]
  The initial visible face is 1: "haeppx"
  flexing Right ..
  The current visible face is 2: "efxeli"
  flexing Right ..
  The current visible face is 3: "xlarea"
  flexing Left ..
  The current visible face is 2: "efxeli"
  flexed [Right, Right, Left]!

outputting "efxeli"

実装例:http : //jdoodle.com/a/18A

入力と予想される出力:

> hexaflexaperplexia flexagationdevices RRL
= efxeli

> loremipsumdolorsit hexaflexamexicania RUU
= riuort

> abcdefghijklmnopqr stuvwxyz1234567890 UL
= I can't flex that way :(

> abcdefghijklmnopqr stuvwxyz1234567890 RRRRLLUDDUUUULDD
= uv1278

ルール

  • 合理的な方法で入力を取り、出力を返すことができます
  • 入力が不可能な場合は、通常の出力とは異なる方法でそれを示す必要があります
  • 標準の抜け穴が適用されます
  • これですCodegolf。バイト単位の最短コードが優先されます。

回答:


2

Haskell(Lambdabot)、270 234バイト

(!)=((map(snd<$>).groupBy((.fst).(==).fst).sortOn fst).).zip.cycle
o n(a,b)|n>1||b<1=(mod(a+[-1,1,0,0]!!n)3,mod(b+[0,0,-1,1]!!n)3)
(x&y)d|(g,h)<-foldl(flip(.))id(o<$>d)(0,0)=([0,1,2]!x++[3,3,4,4,5,5]!y)!!([0,5,1,1,4,2,2,3,0]!!(3*g+h))

使用法:

> (&) "hexaflexaperplexia" "flexagationdevices" [1,3]
"exioic"

[0、1、2、3] = [左、右、上、下]

たくさんのバイトをありがとう@Damien!


1
の用途は|b/=0=[]!!1何ですか?ポイントフリースタイルでいくつかの関数を書き換える数バイトを保存できます。- \(a,_)(b,_)->a==b> (.fst).(==).fst(!)=(q.).zip.cycle
Damien

@Damien |b/=0=[]!!1は、不可能なフレックスを実行しようとすると例外をスローします
BlackCap

1
わかりました。o n(a,b)|n>1||b<1=(z$a+[-1,1,0,0]!!n,z$b+[0,0,-1,1]!!n)これで非網羅的なパターンの例外がスローされるので、簡略化できます
Damien
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.