強盗:正規表現を破る-ヘビを作る


20

これが強盗のスレッドです。警官のスレッドはここにあります


スネークマトリックスは、次のパターンに従う正方マトリックスです。

3行3列:

1  2  3
6  5  4
7  8  9

および4行4列:

1  2  3  4
8  7  6  5
9  10 11 12
16 15 14 13

あなたの仕事は、入力を受け取り、nそのような行列を、警官のポストと同じ言語で、警官の正規表現に一致するコードで作成することです。コードの出力形式は、警官のコードの出力形式と一致する必要があります。

Copの投稿の下にコメントを残して、クラックしたことを示してください。

受賞基準:

勝者は、ほとんどの提出をクラックしたユーザーになります。同点の場合、複数の勝者が存在します。

回答:


10

ゼリー、9バイト、@ Dennisの答えを破る

²sµUFḤ$¦G

オンラインでお試しください!

今は正しいはずです。むしろ自分がやっていることを再考する必要がありました。

説明

この問題の最も難しい部分は、内部の偶数インデックスのリストを取得することです¦(特定のインデックスで操作を適用します)。プログラム全体への入力を第2オペランドのデフォルトとして使用するほとんどの操作とは異なり、¦最後に見た値をデフォルトとして使用します(概念的には、左オペランドと右オペランドではなく、 2つの値を取ります)。

ただし、1から入力の半分までのすべての整数を含む数字のリストがあり、その時点ですでに現在の値になっていることがわかります。そのため、すべての偶数インデックスを含む偶数のリストが得られます(他の偶数もありますが、それらは気にしません)。µ構文解析のあいまいさを回避するためだけに1つを費やして、9文字以内で入力することも可能です。

²sµUFḤ$¦G
 s         Split
²          {the list of numbers from 1 to} the square of {the input}
  µ        into a number of pieces equal to {the input};
   U       then reverse
       ¦   the elements at indexes
    F      obtained by flattening the split list
      $    and
     Ḥ     doubling each element in the flattened list;
        G  finally, format it into a grid.         

ええと、その方法¦は毎回私を殺します。昨日これを試しましたが、むしろではなく、うまくいかないUと決めました。
ジョナサンアラン

いいですね、私はそれをほとんど持っていましたが、他のすべての要素を選択することにも行き詰まりました。F素晴らしいアイデアでした
-ETHproductions

私の元のコードはこれとほとんど同じです。のJ代わりに使用しましたF
デニス

@デニスああ、J...試してみましLRたが、11バイト未満で取得できませんでした
-ETHproductions

9

05AB1E、エミグナ

05AB1Eを使用したのはこれが初めてでした。少し助けを借りて手に入れました。それは楽しかった。:)

UXFXLNX*+N2BSR1k_iR}ˆ

オンラインで試す

説明:

U                       Assign input to X
 XF                     For N in range(0,X):
   XL                   Push list [1 .. X]
     NX*+               Add N*X to each element of the list
         N2BSR1k_       Super clever way to get N%2:
                            not bool(reversed(str(bin(N))).index('1')) (N%2 is odd)
                 iR}    if N%2 is odd, then reverse the list
                    ˆ   Add row to global array
                        Implicit print

私は実際にこのようなプログラムを自分で見つけましたが、出力形式は異なります:

UXFXLNX*+N2BSR1k_iR}=

オンラインで試す

[1, 2, 3, 4]
[8, 7, 6, 5]
[9, 10, 11, 12]
[16, 15, 14, 13]

過去2回の試行の編集履歴を参照してください。


良くやった!元のソリューションとかなり似ています。
エミグナ

5
not bool(reversed(str(bin(N))).index('1'))...誰もがN%2手術をするのを見た中で、これが最もばかげた方法だと思います。
スティーウィグリフィン

3
@StewieGriffin人生にレモンは与えられるが水や砂糖は与えられないときは、生のまま食べるだけです。:D
mbomb007

6

Python 2、デニス

これは楽しいトークンゴルフの問題です。

while ord>eval:1;int,eval=int<1and(int,eval+1)or(-input(),1);i=int;ord=i*i;print'%*s'%(-i,(eval+~i+~-eval%-i*~1,eval)[eval/i&1])+'\nt'[:-1<eval%int],

正規表現の検証


5

オーム、ニック・クリフォード

オームを初めて試したとき。
私は再び使用することを楽しみにしている本当に素晴らしい言語:)

²@┼σ▓_^è?R

説明

²             # square input
 @            # range [1 ... input^2]
  ┼σ          # split in input sized chunks
    ▓         # perform the following block on each element of the array
     _        # current element
      ^è?     # if index is odd
         R    # reverse

配列とintの追加として機能しなかった私の最初の試みは不可能です。

@┼MDR┼+;W

正規表現と一致しなかった私の2回目の試み:

²@┼σ▓_^MR

あなたは私がやったようにそれをやった!よくやった!
ニッククリフォード

5

05AB1E、エミグナ(2回目の提出)

05AB1Eを初めて使用します。

VYLUYFYXDˆ+RU

オンラインでお試しください!| 正規表現の検証

説明

VYLUYFYXDˆ+RU  # Implicit input
V              # Save input to Y
 YL            # Push [1 .. Y]
   U           # Save list to X
    YF         # Repeat Y times:
      YX       # Push Y, then X
        Dˆ     # Add X into the global array (could've used X here instead)
          +    # Push X + Y
           R   # Reverse top of stack
            U  # Save updated list to X
               # Implicit loop end
               # Implicit global array print if stack is empty

良くやった!あなたは意図した解決策を得た:)
エミグナ

@Emignaありがとう!スタックが空の場合にグローバル配列が出力されることを認識できる、ここにある他のソリューション(あなたのものを含む)がなければ、私はそれを得なかったでしょう!それがなかったら、私はそれを理解していなかったでしょう。私は)、スタックで正しい結果を得るための唯一の方法だと思って終わったトリックをやろうとしました。
バリューインク

)英数字以外の文字を2つしか使用できない場合、それを行うのはかなり不可能です。ここで注意が必要なのは、2つのワイルドカードのみを使用し、それらを連続させるようにプログラムを構成することでした。他の解決策がないとおそらく少し難しくなりますが、いくつかの不可解な問題があるはずです。)
エミニャ

@Emigna私が知りたいの^\w*..$は、可能かどうかです。
mbomb007

@ mbomb007:そうは思いません。この戦術では、次の反復のために追加の結果を保存する必要があり、この意味でスタックを使用することはできませんUV必要が後に来ます。最後に2つのワイルドカードだけでそれを行う別の方法も考えられません。ただし、3つのワイルドカードを使用して実行できます。
エミグナ

5

CJamリン

esmpmpmeimtmemqmememqicelic
esmpmpmeimememqmlmtmemoc
esmpmpmeimememqmtmtmtmtmeic
esmpmpmeimememqmtmtmtmtmeic
esmpmpmeimeiscic
esmpmpmeimemeimfsic
esmpmpmeisciscimqmtmemeic
esmpmpmeiscimlmqmqmemeic
esmpmpmeimemomqmqmemeic
esmpmpmeisciscimfsimqic
esmpmpmeimeiscic
esmpmpmeisciscimfsimqic
esmpmpmeimemomqmemqmemtmemoc
esmpmpmeiscic
esmpmpmeimemomeimqmeic
esmpmpmeimemeimqmlmtmeic
esmpmpmeimtmtmqmemtmtmeic
esmpmpmeimemomqmqmtmeic
esmpmpmeimemqmqmemeic
esmpmpmeiscimlmqmqmemeic
esmpmpmeiscimqmtmtmtmqmemeic
esmpmpmeimeimemtmqmemeic
esmpmpmeimeiscimlmlmtmlmtic
esmpmpmeimemeimqmlmtmeic
~~

すべての改行は表面的な目的のためであり、プログラムに影響を与えることなく削除できます。

オンラインでお試しください!

説明

Lynn {|}が許可されたキャラクターのリストから削除した後、私は何か新しいことを試みなければなりませんでした。それでも、任意の文字列を構築し、コードとして評価することができます。

まず、スタックに値を取得する必要があります。最初に何かをポップせずに(そして入力を読み取らずに)何かをプッシュする唯一の利用可能なビルトインはeseaetです。これらのすべてから何らかの方法で開始できると確信していますがes、現在のタイムスタンプをプッシュする方法を使用しました。私はその実際の値について仮定をしたくなかったので、私はその素数性をテストしますmp(与える01私が持っていることを確認するために、再度テスト、その値の素数を)し、0スタックに。A 1はより便利なので、で計算exp(0)me、で整数に変換しiます。したがって、すべての数字は次で始まります:

esmpmpmei

これで、次のような単項算術演算子を使用できます。

i    int(x) (floor for positive numbers, ceiling for negative)
me   exp(x)
ml   ln(x)
mq   sqrt(x)
mo   round(x)
mt   tan(x)

いくつかのビルトインを組み合わせて、以下のより複雑な機能を実現することもできますx

sci     Extract first digit of x and add 48 (convert to string, convert
        to character, convert to integer).
ceui    Convert to character, convert to upper case, convert to integer.
celi    Convert to character, convert to lower case, convert to integer.
mfsi    Get a sorted list of prime factors of x and concatenate them into 
        a new number.
mfseei  Get a sorted list of prime factors, interleave it with 1,2,3,..., and
        concatenate the result into a new number.

これらを使用して、0 <= x < 128から10未満の手順で(および他の多くの)の任意の数を取得できます1。これらのコマンドの非常に小さなサブセットでも十分であると確信しています。これらのスニペットをすべて判別するために、小さなMathematicaプログラムを作成しました(読みにくい、申し訳ありません):

codes = SortBy[
  Select[Nest[Select[DeleteDuplicatesBy[SortBy[Join @@ (Through[{
               List,
               If[1 <= # < 50, {Exp@#, #2 <> "me"}, Nothing] &,
               If[# >= 1, {Log@#, #2 <> "ml"}, Nothing] &,
               If[# > 1, {Sqrt@#, #2 <> "mq"}, Nothing] &,
               {If[# > 0, Floor@#, Ceiling@#], #2 <> "i"} &,
               {Floor[# + 1/2], #2 <> "mo"} &,
               {Tan@#, #2 <> "mt"} &,               
               If[NumberQ@# && # >= 0, {First@
                   ToCharacterCode@ToString@#, #2 <> "sci"}, 
                 Nothing] &,
               If[IntegerQ@# && 
                  32 < # < 65536, {First@
                   ToCharacterCode@
                    ToUpperCase@FromCharacterCode@#, #2 <> "ceui"}, 
                 Nothing] &,
               If[IntegerQ@# && 
                  32 < # < 65536, {First@
                   ToCharacterCode@
                    ToLowerCase@FromCharacterCode@#, #2 <> "celi"}, 
                 Nothing] &,
               If[IntegerQ@# && # > 0, ## & @@ {
                   {FromDigits[
                    "" <> (ToString /@ (f = 
                    Join @@ Table @@@ FactorInteger@#))], #2 <> 
                    "mfsi"},
                   {FromDigits[
                    "" <> (ToString /@ 
                    MapIndexed[## & @@ {#2[[1]] - 1, #} &, f])], #2 <>
                     "mfeesi"}
                   }, Nothing] &
               }@##] &) @@@ #, StringLength@*Last], 
       First], #[[1]] < 1000000 &] &, {{1, "esmpmpmei"}}, 9], 
   IntegerQ@# && 0 <= # < 128 &@*First], First]

それにより、文字コードの任意のリストをプッシュするだけで、c後でそれらをそれぞれ文字に変換できます。実行するコード全体をプッシュしたら、95])をプッシュします。その1つを評価し~て他のすべてを文字列にラップし、その文字列をで評価します~

プログラムの最後に実行される実際のコードは、次のとおりです。

ri__2#,:)/2/[1W]f.%:~<p

以前の解決策を見る説明を。


4

Python 3、TukkaX

申し訳ありませんが、使用した正規表現は簡単にするのが簡単でした。いいえ0#または?問題ない!

サンプルの出力を誤って解釈したかもしれませんが、45個の予備の文字が残っているため、微調整するのはかなり簡単です。

n=int(input())
print(str(n)+":")
x=1-1
exec("print([*range(1+x*n,1+n*-~x)][::(1,-1)[x%2]]);x+=1;"*n)
"no-op:a_string_that_doesnt_actually_matter"

いいね!:D参考:あなたがそれを解決することに興味があるなら、私はPythonで別のものを作成します;)それはもう少し長くなりますが、美しさは無亀裂にあります。
-Yytsi

4

R、MickyT

lets_make_a_snake<-function(n)`for`(i,1:n,cat(i*n+1-`if`(i%%2,n:1,1:n),"\n"))

テストケース:

> lets_make_a_snake(4)
1 2 3 4 
8 7 6 5 
9 10 11 12 
16 15 14 13 
> lets_make_a_snake(7)
1 2 3 4 5 6 7 
14 13 12 11 10 9 8 
15 16 17 18 19 20 21 
28 27 26 25 24 23 22 
29 30 31 32 33 34 35 
42 41 40 39 38 37 36 
43 44 45 46 47 48 49 

そして正規表現の確認: https //regex101.com/r/OB8ZIM/1

私も持っていた:

invisible(sapply(1:(n=scan()),function(i)cat(i*n+1-`if`(i%%2,n:1,1:n),"\n")))

これは、同じ出力を提供し、同じ正規表現に一致します。


6
lets_make_a_snakeP:それは意図した溶液を用いた場合...私は驚かれると思い
Stewieグリフィン

@plannapusすばらしい仕事。最初のものは基本的には ` for`と ` if` を使用して意図していたものですが、私のものよりもはるかに良いゴルフです。
MickyT


4

バッシュ、@ Marcos M

sort -n <(seq 1 $((n * n)) | xargs -n$n | sed -n 'p;n'; seq $((n * n)) 1 | xargs -n$n | sort -n | sed -n 'n;p')

プリティファイド:

sort -n <(               # feed the stdout of this subshell into stdin for `sort -n`
    seq 1 $((n * n)) |   #   generate 1 2 3 ... n²
        xargs -n$n |     #     add line break every n numbers
        sed -n 'p;n';    #     print only odd lines
    seq $((n * n)) 1 |   #   generate n² ... 3 2 1
        xargs -n$n |     #     add line break every n numbers
        sort -n |        #     reverse all lines (keeping each row decreasing)
        sed -n 'n;p'     #     print only even lines
)

サブコマンドの最初の部分はを生成し1 2 3 49 10 11 122番目の部分はを生成8 7 6 516 15 14 13ます。アウターsort -nはそれらを適切に混ぜ合わせて蛇パターンを形成します。

/superuser//a/101760のトリックを使用して、奇数行と偶数行を印刷しました。本当に楽しいマルコス、ありがとう。


非常に良い解決策
ミッチェルスペクター


3

Python 3、@ TuukkaX

n=int(input());j=0;exec("print([(j-+i%n-n++2*n-0,j+i%n+1)[1&int(i/n)//1^(0x1)//1]*(2*(i%n)*0+2222222//2222222)for i in range(j,j+n)]);j+=n;"*n)

警官の正規表現を少し分析すると、固定テンプレートが表示されます。

________________________"___________i%n____2*n-____i%n__________i/n)//1_____)//1___2*(i%n)____^^^^^^^^^^^^^^^^for i in range(j,____])______"*n)

where _はを除く任意の文字で[ '"#]^はのいずれかです[int()2/]

"*n)最後に明確に示しているeval("..."*n)か、exec("..."*n)我々だけを確認する必要がありますので、起こっているの"..."j番目の行を出力します。

for i in range(j,どんなことなく、リスト内包をほのめかし、文字列の末尾に近すぎますif。したがってi%n、これらを使用してi番目の列を作成する必要があり2*nます。

n = int(input())
j=0
exec("""print([
    (
        j - +i%n - n ++ 2*n - 0,    # equivalent to (n + j - i%n) for the decreasing rows
        j + i%n + 1                 # equivalent to (j + i%n + 1 == i + 1) for the increasing rows
    )[1 & int(i/n)//1 ^ (0x1)//1]   # int(i/n)   ->    get row number 0, 1, 2, 3, ...; 
                                    # 1 & int(i/n)//1    ->    0 for increasing rows, 1 for decreasing rows, 
                                    # 1 & int(i/n)//1 ^ (0x1)//1    ->   flip 0 and 1
    * (2*(i%n)*0+2222222//2222222)  # multiply by the constant 1.
    for i in range(j,j+n)
]); j+=n; "*n)

いいね!まあ、ほぼ一週間生き残った:D私は元のコードを投稿します。
-Yytsi

3

dcミッチェルスペクター

これは警官と強盗の挑戦への私の最初のエントリーでした、そして、私は多くの楽しみを持っていました。一致させる必要がある正規表現は単純でした^[^# !]{59}$。これにより、基本的に私の3つのキャラクターを使わずにゴルフの仕事になりました。最初は60バイトを下回ることが困難でしたが、最終的にはクラックしました。

?sN0[AP]sP[ddlN~_2*lN+1-r2%*+1+n32P1+dlN%0=PdlNd*>L]dsLxqqq

オンラインでお試しください!

説明:

私のコードはN 2で 1つのループを使用します回の反復で、ゼロベースのカウンター(1D)を維持し、対応する行列の行と列(r、c)座標に基づいて印刷する必要のある数を計算します。

N = 4の場合の意味の例

 0  1  2  3            (0,0) (0,1) (0,2) (0,3)             1  2  3  4
 4  5  6  7     ->     (1,0) (1,1) (1,2) (1,3)     ->      8  7  6  5
 8  9 10 11            (2,0) (2,1) (2,2) (2,3)             9 10 11 12
12 13 14 15            (3,0) (3,1) (3,2) (3,3)            16 15 14 13

複雑に見えますが、中間ステップは役立ちます。さらに、最初から2つのループを使用してみましたが、正規表現の文字数制限を超えてしまいました。各反復での数値生成(ゼロベース):

  • r % 2 = 0(通常の行)の場合、n = (r * N) + c = counter
  • if r % 2 = 1(逆行)、n = ((r + 1) * N) - c - 1 = counter + N - (2 * c) - 1

または、1ベースの番号付けとして一度に: n = counter + ((N - (2 * c) - 1) * (r % 2)); n++

?sN0             # read input, save as N, initialize iteration counter
[AP]sP           # macro 'P' that prints a newline (ASCII code 10 = A)
[                # start loop
    ddlN~        # push N, calculate row and column coordinates:
                 #r = int(counter / N), c = counter % N, '~' calculates both
    _2*lN+1-     # c is on top, so this does: N - (2 * c) - 1
    r2%*+        # now r is on top, do: (r % 2) * (previous result) + counter
    1+n32P       # do: n++, print space (ASCII code 32)
    1+           # increment counter
    dlN%0=P      # call macro 'P' every Nth printed number
    dlNd*>L      # if: N * N > counter, repeat loop
]dsLx            # this saves the loop to macro 'L', then executes it
qqq              # my script was shorter, so I added a bunch of quit commands to
                 #fit the regex limit. Use of comments ('#') was prohibited.

@MitchellSpectorこれが私の説明です。ご覧のとおり、どちらも文字通り同じアルゴリズムを使用しています。コマンドを使用し~て行インデックスと列インデックスを一度に計算するだけです。しかし、私の以前の試みの1つは、あなたがしたようにそれらを別々に計算しました。偉大な心は同じように考える?:)
seshoumara

1
はい、それは本当に同じアルゴリズムです。~コードを短くするためのあなたの使用が好きです。
ミッチェルスペクター

私はあなたがマクロの最後でループテストで平方根のトリックを使用する場合は1バイトで、それを短縮することができると思います:?sN0[AP]sP[ddlN~_2*lN+1-r2%*+1+n32P1+dlN%0=PdvlN>L]dsLx tio.run/nexus/...
ミッチェルスペクター

@MitchellSpectorそのとおりです。説明を読んだときに気付きましたが、代わりにチャットルームでコメントしました。
seshoumara

はい、私は今それを見る-私は今朝チャットルームを見ていなかった。
ミッチェルスペクター

3

PowerShell、ConnorLSW

クラック

$mySnakeIndex=1;$seq=1..$args[0];$seq|%{$rowNum=$seq|%{($mySnakeIndex++)};if(!($_%2)){[array]::Reverse($rowNum)};$rowNum-join" "}

私はこの問題のより小さな解決策から始め、正規表現が一致するように変数名を埋め込みました。コロンの使用法を見つけることは、頭を包むのが最も難しい部分だったと思います。

$a=1..$args[0];$i=1;$a|%{$r=$a|%{($i++)};if(!($_%2)){[array]::Reverse($r)};$r-join" "}

説明

# Initialize a counter that starts at one.
$mySnakeIndex=1
# Save the integer array from 1 to the input value. 
$seq=1..$args[0]
# For each row of the output...
$seq|%{
    # Build the integer array for this row sequentially
    $rowNum=$seq|%{
        # Increase the integer index while sending it down the pipeline
        ($mySnakeIndex++)}
        # Check if this is and odd row. If so reverse the integer array.
        if(!($_%2)){[array]::Reverse($rowNum)}
        # Take this row and join all the numbers with spaces.
        $rowNum-join" "

ニースは、私が使用$scriptパッドにそれを変数といくつかの本当に厄介なループを、[array]::Reverse()正しいけれどもだった、おめでとう-私はあなたにも、長さのうち、必要かもしれないと思う$i$MySnakeIndexいえ。
colsw

@ConnorLSW私は強盗にエラーがあったことを知っているので、夜寝ることができないことを知っています。私はそれを修正しました。
マット

3

CJam、 リン

このようなもの:

ri
{s}seu~~ci{zs}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c{z}seu~~{w}seu~~sc~c{w}seu~~z{w}seu~~sc~c~

{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c
{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c
{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c
{s}seu~~c{a}seu~~|
{s}seu~~c{c}seu~~|
{t}seu~~sc{a}seu~~|
{s}seu~~c{a}seu~~|{w}seu~~z{w}seu~~sc~c
{s}seu~~sc{fb}seu~~||
{s}seu~~sc{i}seu~~|
{s}seu~~sc{fb}seu~~||
{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c{z}seu~~{w}seu~~sc~c{w}seu~~z{w}seu~~sc~c
{a}seu~~scs
{w}seu~~
{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{z}seu~~{w}seu~~sc~c
{fb}s{b}s{w}seu~~sc~
{s}seu~~sc{ee}seu~~||
{s}seu~~sc{z}seu~~|{w}seu~~{w}seu~~sc~{w}seu~~{w}seu~~sc~
{t}seu~~sc{a}seu~~|
{~}s{}s{w}seu~~sc~
{t}seu~~sc{c}seu~~|

{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{z}seu~~{w}seu~~sc~c~
s~
p

すべての空白は... "読みやすさ" ...であり、Lynnの正規表現に準拠するために省略できます。

オンラインでお試しください!

説明

正規表現では、次のもののみを使用して問題を解決する必要があります。

  • 小文字。
  • {}、ブロックの作成に使用できます。
  • |、主にビット単位のORに使用されます。
  • ~、「eval」およびビット単位のNOT(「ダンプ配列」でも使用しません)。

を持っているので~、任意の文字列を作成できれば、任意のコードを実行できます。ただし、最初はそれを行う方法が明らかではありません。

パズルの最初のピースは、ブロックがコードの未評価のビットであり、で文字列に変換できることsです。だから{abc}s私たちに与え"{abc}"ます。次に、euこれらの文字列を大文字に変換するために使用できます。

{abc}seu  e# gives "{ABC}"

これの利点は、大文字が事前に初期化された変数であるため、そのような文字列を作成し、それを2回評価することで(文字列をブロックに戻して1回、そのブロックを実行します)。すべての文字を取得することはできません。xたとえば、一部のコマンドは有効なコマンドではないためです(したがって、CJamはそれらを含むブロックの解析を拒否します)。f別のコマンドを続ける必要があるため、そのまま使用することはできませんがfb、2つの値を使用してからORすることができます。同様に、のee代わりに使用できますe。それによって、我々は数字を得ることができ0-13、と10します19。これ-1は、文字列("-1"(その後、文字に)'-)そして、それを評価すると、減算または差を設定できます。私が言ったように、X(for 1)を取得することはできませんが、-1withの絶対値を取得することはできますz

またs、スペースを含む文字列を取得し、cそれをスペース文字に変換するために使用できます。

{s}seu~~c

これは便利です。なぜなら、そこからさまざまな数字でスペースをORすることで、より低いASCII範囲で多くの便利なコマンドを取得できるからです。コードポイント48より上の文字の一部を取得するには、'0代わりにその文字をベースとして使用します。

{t}seu~~si

これは'+、次のスニペットから(追加と文字列の連結)を取得できるため、任意の文字列を構築するには既に十分です。

{s}seu~~c{b}seu~~|

そして、リテラルがある1ので、スペース文字をプッシュし、必要な値までインクリメントしてから、それらをすべて連結することができますが、それは少し退屈で、コードは巨大になります。

代わりに、それらを生成[]て評価しました。そのため、間に挿入するすべての文字が自動的に文字列にラップされます。これが次の2行です。

{s}seu~~ci{zs}seu~~c{a}seu~~|~{w}seu~~z{w}seu~~sc~c{z}seu~~{w}seu~~sc~c{w}seu~~z{w}seu~~sc~c~

...

{s}seu~~ci{z}seu~~{s}seu~~c{a}seu~~|~{z}seu~~{w}seu~~sc~c~

そして最後に、生成する文字列で必要にfなり~ます。これらはすでに有効な文字ですが、文字列リテラルや文字リテラルはないため、これらも生成する必要があり、スペースから大きなコードポイントを構築するのは少し面倒です。代わりに、ここでは集合の減算を使用しましたが、2つのブロックを減算しています(を取り除くため{}):

{fb}s{b}s{w}seu~~sc~
...
{~}s{}s{w}seu~~sc~

これでほとんどすべてです。私たちは評価し[ます。我々は、我々が持っているいくつかの組み込み定数から各種の演算によって得られたすべての文字を、押して|-(evalを経由して)及び+(evalを経由して)。私たちは評価し]ます。ある時点で文字列または数字をリストに追加したため、全体を文字列にフラット化しました。で任意の文字列を評価します~

これらri...pは実際の最終プログラムの一部ですが、エンコードを必要としないため抽出しました。

最後に、これは実際に実行しているプログラムです。

ri___*,:)/2/[1-1]f.%:~<p

ri      e# Read input and convert to integer.
__      e# Make two copies.
_*      e# Square the last copy.
,       e# Turn into range [0 1 ... n^2-1].
:)      e# Increment each to get [1 2 ... n^2].
/       e# Split into chunks of length n, creating a square.
2/      e# Split into pairs of lines.
[1-1]   e# Push [1 -1].
f.%     e# Use this to reverse the second line in each pair. If n was odd,
        e# this will pair a -1 with the last line.
:~      e# Flatten the pairs back into the square.
<       e# Truncate to n lines to get rid of that extraneous -1 for odd inputs.
p       e# Pretty-print.

3

tinylisp@DLosc

(v(c(h(q(d)))(c(h(q(f)))(q((c(q(n))(q((g(v(h(q(n))))(s(v(h(q(n))))(v(h(q(1)))))())))))))))(v(c(h(q(d)))(c(h(q(mod)))(q((c(c(h(q(x)))(q(y)))(q((i(l(v(h(q(x))))(v(h(q(y)))))x(mod(s(v(h(q(x))))(v(h(q(y)))))y))))))))))(v(c(h(q(d)))(c(h(q(range)))(q((c(c(h(q(x)))(c(h(q(y)))(c(h(q(z)))(q(w)))))(q((i(l(times(v(h(q(z))))(v(h(q(x))))(v(h(q(0)))))(times(v(h(q(z))))(v(h(q(y))))(v(h(q(0))))))(range(v(h(q(x))))(s(v(h(q(y))))(v(h(q(z)))))z(c(s(v(h(q(y))))(v(h(q(z)))))w))w)))))))))(v(c(h(q(d)))(c(h(q(times)))(q((c(c(h(q(x)))(c(h(q(y)))(q(acc))))(q((i(l(v(h(q(x))))(v(h(q(0)))))(times(s(v(h(q(0))))(v(h(q(x)))))(s(v(h(q(0))))(v(h(q(y)))))acc)(i(e(v(h(q(x))))(v(h(q(0)))))acc(times(s(v(h(q(x))))(v(h(q(1)))))y(a(v(h(q(y))))(v(h(q(acc))))))))))))))))(v(c(h(q(d)))(c(h(q(g)))(q((c(c(h(q(n)))(c(h(q(w)))(q(r))))(q((i(l(v(h(q(w))))(v(h(q(0)))))r(g(v(h(q(n))))(s(v(h(q(w))))(v(h(q(1)))))(c(i(e(v(h(q(0))))(mod(v(h(q(w))))(v(h(q(2))))))(range(a(v(h(q(1))))(times(v(h(q(w))))(v(h(q(n))))(v(h(q(0))))))(a(a(v(h(q(1))))(times(v(h(q(w))))(v(h(q(n))))(v(h(q(0))))))n)1())(range(a(times(v(h(q(w))))(v(h(q(n))))(v(h(q(0)))))n)(times(v(h(q(w))))(v(h(q(n))))(v(h(q(0)))))(s(v(h(q(0))))(v(h(q(1)))))()))r)))))))))))

オンラインでお試しください!

これはf、答えを返す関数を定義します。また、stdoutに定義した関数の名前も出力しますが、少なくともコードゴルフでは[出力ストリームを選択することが許可されている]ので、それは問題ではないと思います。大したことなら、それらを印刷しないように微調整できると思います。どうやってやったの?私はかなり標準的なものから始めました:

(d f (q ((n)
  (g n (s n 1) ()))))

(d mod (q((x y)
  (i (l x y) x
    (mod (s x y) y)))))

(d range (q((x y z w)
  (i (l (times z x 0) (times z y 0))
    (range x (s y z) z (c (s y z) w))
    w))))

(d times (q ((x y acc)
  (i (l x 0) (times (s 0 x) (s 0 y) acc)
  (i (e x 0) acc
    (times (s x 1) y (a y acc)))))))

(d g (q ((n w r)
  (i (l w 0) r
    (g n (s w 1)
       (c (i (e 0 (mod w 2))
             (range (a 1 (times w n 0)) (a (a 1 (times w n 0)) n) 1 ())
             (range (a (times w n 0) n) (times w n 0) (s 0 1) ()))
          r))))))

次に、次のような関数定義を変換できることに気付きました。

(d mod (q ((x y) (body))))

になる

(v(c(h(q(d)))(c(h(q(mod)))(q((c(c(h(q(x)))(q(y)))(q((body)))))))))

そして、次のような関数呼び出し:

(a x y)

になる

(a(v(h(q(x))))y)

registerに保存されたこの再帰的なVimマクロを使用qして、2番目のマクロを実行しました(にjkマップしました<Esc>f s(v(h(q(jkea))))jk@q

これらの2つの変換は、すべてのスペースを削除するのに十分でした。


うまくできました!私の元のコードは非常に似ていますが、ヘルパーマクロを書いて、書くのが少し楽になるようにしました。定義されたシンボルの印刷を回避する方法についてのあなたの考えについて興味があります。共有したい場合は、tinylispチャットルームに行きます
DLosc

@DLosc完了、私はそこに投稿しました。
ブライアンマックラッチン

2

スウィフト、@ジェームズウェブスター

{n in for j in 0..<n{print((1...n).map{j%2==0 ?$0+j*n:j*n+n+1-$0})}} as(CShort)->()

検証:https : //regex101.com/r/7ukrM0/1


私はこれで「式は未使用の関数に解決」を取得しますが、受け入れられる答えを作るものすべてに不慣れです。例えば、 `let a = <code>;です。a(CShort(4)); 不要に実行するために必要ですか?
ジェームズウェブスター

@JamesWebster「コード」はかなりあいまいなので、正確なルールについてはわかりません。以下のためのコードゴルフ提出は、プログラムまたは機能することができ、私はちょうどここに無名関数を提供して、。入力引数を他にどのように受け取りますか?
ケニー

私のオリジナルは関数の本体だったので、私のものも有効かどうかわかりません!それで、「確かに、これでいい」と言って、賛成するつもりです。:)
ジェームズウェブスター

@JamesWebster全体をとして呼び出すことができ(…)(4)、整数リテラルをCShortにキャストする必要はありません。
ケニー

うん!私はそれを考えたことがなかったでしょう。
ジェームズウェブスター

2

PHP、@JörgHülsermann

<?=(function($n,$snake){foreach(array_chunk(range(1,$n*$n),$n)as$i=>$a){if($i%2)$a=array_reverse($a);echo"\n",join('',array_map(function($e){return(sprintf("%3d",$e));},$a));}})($argv[1],'-=-=-=-=-=-=-=-=-=-=-=-=-=-o~')?>

221バイトは長すぎるため(ヘビ)、空白の不足は簡単に回避できます。

プリティファイド:

<?=
(
    function($n, $snake) {
        foreach (array_chunk(range(1, $n*$n), $n) as $i => $a) {
            if($i % 2)
                $a = array_reverse($a);
            echo "\n", join('', array_map(function($e) {
                return (sprintf("%3d", $e));
            }, $a));
        }
    }
)($argv[1], '-=-=-=-=-=-=-=-=-=-=-=-=-=-o~')
?>

素敵なバリアント。私のせいは、機能について考えて、出力を1つだけにすることではなかった
ヨルグヒュルサーマン


2

12バイトのJellyが@JonathanAllan の2番目の答えを解読する

²sµ;@/€FḤ$¦G

オンラインでお試しください!

説明

これは他の答えとほとんど同じですです。2つの変更を加えました。

最初に、U( "reverse each element")をṚ€( "reverse" "each element")に変更しました。禁止されているので、それだけでは役に立ちません。

それから、( "reverse")を;@//"fold by" ;"concatenating" @"元のリストと逆の順序で")に変更しました。これにより、禁止されているすべてのキャラクターが回避され、有効なソリューションが提供されます。

次のステップは、アトムに加えて、配列操作クイックの禁止を開始することだと思います。


ええと、私は私が禁止されている必要があります知っていた...
ジョナサン・アラン

あなたも面で書くことができ/ます。これは、このソリューションよりもかなり冗長です。

ええ、できたかもしれません;@\ṫ0が、正規表現は長くなっています。
ジョナサンアラン

2

ゼリー、長さ13、@ジョナサンアラン

1r-*Nm@"s@²$G

オンラインでお試しください!

使い方

1r-*Nm@"s@²$G  Main link. Argument: n

1r             Range 1; yield [1, ..., n].
 -*            Yield [(-1)**1, ..., (-1)**n].
   N           Negate each unit.
           $   Combine the two links to the left into a chain.
          ²    Yield n².
        s@     Split [1, ..., n²] into chunks of length n.
     m@"       Take the lists to the right modulo the units to the left, 1 being
               normal order and -1 being reversed.

ああ待って、何を逃したm
ジョナサンアラン


2

Scala、@ Soapy

def g(n:Int) = {
    var vec = Vector.fill(0)(Vector.fill(0)(1))
    for (p <- 1 to n) {
        var vec2 = Vector.fill(0)(1)
        for (q <- (p-1)*n+1 to p*n) {
            vec2 = vec2 ++ Vector(q)
        }
        if (p%2==1) vec = vec ++ Vector(vec2)
        else vec = vec ++ Vector(vec2.reverse)

    }
    println(vec)
}

しばらくScalaに触れていないので、再訪するのは楽しかったです。残念ながら、このソリューションはScalaのクールな機能の多くを逃しています。

ここで試してみてください

正規表現の確認


2

QBasic(QB64)、@ DLosc

.は一致しない\nため\r(U + 000A、LF)、ここでの改行は(U + 000D、CR)であることに注意してください。

INPUT N:ZERO=N-N:ONE=N/N:FOR I=ZERO TO N-ONE:FOR J=ONE TO N:IF ZERO=I MOD(ONE+ONE)THEN PRINT I*N+J;ELSE PRINT I*N+N-J+ONE;REM
NEXT:PRINT:NEXT

確認:

>>> re.match('^([A-Z]+.)+$', 'INPUT N:ZERO=N-N:ONE=N/N:FOR I=ZERO TO N-ONE:FOR J=ONE TO N:IF ZERO=I MOD(ONE+ONE)THEN PRINT I*N+J;ELSE PRINT I*N+N-J+ONE;REM\rNEXT:PRINT:NEXT')
<_sre.SRE_Match object; span=(0, 141), match='INPUT N:ZERO=N-N:ONE=N/N:FOR I=ZERO TO N-ONE:FOR >

主な困難は、後に単語を挿入する方法;です。ありがたいことに、QB64はCRを改行として扱いますが、Pythonの正規表現は改行を扱いませんREM\r。許可されている5つの正規表現フレーバーのうち、

したがって、このクラックはJavaScriptに言及しない限り問題ありません... ...


QB64で動作するため、これを受け入れます。ただし、archive.orgのQBasic(エミュレーションではなく実際のQBasicだと思います)は、REMステートメント区切り文字なしのステートメントの直後に文句を言うとも言います。元のソリューションではコメントを使用しませんでした。すぐに投稿する別のバリ​​エーションがあります。:D
DLosc



1

C、@ Yimin Rong

main(int c,char**p){int n=atoi(*++p),i=n-n,t,o=c;for(--o;i<n;++i)for(t=o;t<=n;++t)printf("%-*d%c",n-o,i%c?i*n+n+o-t:i*n+t,t%n?' ':'\n');}

プログラムに数字を含めることはできませんが、次の方法で数字を取得できます。

  1. c、一般に「argc」として知られ、常に2です。
  2. +そして-利用できるのでn-n、で0を作成し、で1を作成できますo=c;--o

マイナーな問題、警官のバージョンはタブで区切られていましたが、スペースは揃えられていましたが、大したことはありませんでした。

1

ルビー、@ Value Ink

->n{(1..n).map{|r|x=(r*n-n+1..r*n).to_a;if(r.modulo(2)==1)then(x)else(x.reverse)end}}#1-2-3-4-5-6--

[(-=Z-~]* 「好きなものは何でも書くことができます:)」


ああ、私はそれをしなかったことを台無しにした
バリューインク

1

tinylisp、@ DLosc

非常に簡単なソリューションであり、まったく最適化されていません:)

(d p(q((m n)(s m(s(s 1 1)n)))))(d j(q((f g)(i(l f g)(c f(j(p f 1) g))()))))(d r(q((f g)(i(l f g)(c(s g 1)(r f(s g 1)))()))))(d k(q((m o f g n)(i(l n g)()(c(m f(p f n))(k o m(p f n)(p g 1) n))))))(d f(q((n)(k j r 1 1 n))))

として呼び出します(disp (f 4))

  • (p m n) 減算を使用してm + nを計算します s(m + n == m-((1-1)-n))
  • (j f g) 生成する (f f+1 f+2 ... g-1)
  • (r f g) 生成する (g-1 g-2 g-3 ... f)
  • (k m o f g n)スネークマトリックスの1つの行を生成し、n行が作成されるまで、次の行のために自分自身を反らせます。引数m、/でo置き換えられ、増加または減少する行を生成します。引数、jrfgどの行にいるかを知るためのインデックスを実行しています。
  • (f n)(k j r 1 1 n)生成を開始するために呼び出します。

よくできました。((f 4)ちなみに、やることdispはもっと慣用的です
DLosc

1

PHP、@ Ionut Botizan

現時点では、元のソリューションを解読することはできません。

n <= 15をサポート

getoptを使用するのは初めてです。入力としてオプションを使用するのは最善のアイデアではないかもしれません。

このようなコマンドラインから開始します

php hack.php -a=4

オリジナルの正規表現

レベル1:

^<[^'"\d{vV;<$]+$

文字の非常に素晴らしい組み合わせ。警官のスレッドに自由に投票してください。

次のような関数をブロックします-strrev-array_reverse-get_defined_vars

https://regex101.com/r/5rGTnw/2

レベル2:

^<[^'"\d{v;<$_~|&A-Z]+$

https://regex101.com/r/XtVl9G/1

溶液

 <?php
    error_reporting(~E_NOTICE)&
    define(A,a.chr(E_COMPILE_ERROR-E_NOTICE+E_WARNING))
    &define(B,getopt(A,[])[a])&print_r(array_chunk(
    array_slice(
    array_merge(
    range(E_ERROR,B)
    ,range(E_WARNING*B,E_ERROR+B)
    ,range(E_WARNING*B+E_ERROR,(E_WARNING+E_ERROR)*B)
    ,range(E_PARSE*B,+E_ERROR+(E_WARNING+E_ERROR)*B)
    ,range(E_PARSE*B+E_ERROR,(E_PARSE+E_ERROR)*B)
    ,range((E_PARSE+E_WARNING)*B,+E_ERROR+(E_PARSE+E_ERROR)*B)
    ,range((E_PARSE+E_WARNING)*B+E_ERROR,(E_NOTICE-E_ERROR)*B)
    ,range(E_NOTICE*B,+E_ERROR+(E_NOTICE-E_ERROR)*B)
    ,range(E_NOTICE*B+E_ERROR,(E_NOTICE+E_ERROR)*B)
    ,range((E_NOTICE+E_WARNING)*B,E_ERROR+(E_NOTICE+E_ERROR)*B)
    ,range((E_NOTICE+E_WARNING)*B+E_ERROR,(E_NOTICE+E_WARNING+E_ERROR)*B)
    ,range((E_NOTICE+E_PARSE)*B,E_ERROR+(E_NOTICE+E_WARNING+E_ERROR)*B)
    ,range((E_NOTICE+E_PARSE)*B+E_ERROR,(E_NOTICE+E_PARSE+E_ERROR)*B)
    ,range((E_CORE_ERROR-E_WARNING)*B,E_ERROR+(E_NOTICE+E_PARSE+E_ERROR)*B)
    ,range((E_CORE_ERROR-E_WARNING)*B+E_ERROR,(E_CORE_ERROR-E_ERROR)*B)
    )
    ,B-B,B*B
    ),B)
    )
    ?>

レベル2:

<?php
define(aa,a.chr(ord(strtoupper(a))-ord(h)+ord(a)))and
define(bb,getopt(aa,[])[a])and
define(us,chr(ord(a)-true-true))and
(prin.t.(us).r)(
(arra.y.(us).chunk)(
(arra.y.(us).slice)(
(arra.y.(us).merge)(
range((ord(b)-ord(a)),bb)
,range((ord(c)-ord(a))*bb,(ord(b)-ord(a))+bb)
,range((ord(c)-ord(a))*bb+(ord(b)-ord(a)),((ord(c)-ord(a))+(ord(b)-ord(a)))*bb)
,range((ord(e)-ord(a))*bb,+(ord(b)-ord(a))+((ord(c)-ord(a))+(ord(b)-ord(a)))*bb)
,range((ord(e)-ord(a))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(c)-ord(a)))*bb,+(ord(b)-ord(a))+((ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(c)-ord(a)))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))-(ord(b)-ord(a)))*bb)
,range((ord(e)-ord(a))*bb,+(ord(b)-ord(a))+((ord(e)-ord(a))-(ord(b)-ord(a)))*bb)
,range((ord(e)-ord(a))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(c)-ord(a)))*bb,(ord(b)-ord(a))+((ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(c)-ord(a)))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))+(ord(c)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(e)-ord(a)))*bb,(ord(b)-ord(a))+((ord(e)-ord(a))+(ord(c)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(e)-ord(a))+(ord(e)-ord(a)))*bb+(ord(b)-ord(a)),((ord(e)-ord(a))+(ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(q)-ord(a))-(ord(c)-ord(a)))*bb,(ord(b)-ord(a))+((ord(e)-ord(a))+(ord(e)-ord(a))+(ord(b)-ord(a)))*bb)
,range(((ord(q)-ord(a))-(ord(c)-ord(a)))*bb+(ord(b)-ord(a)),((ord(q)-ord(a))-(ord(b)-ord(a)))*bb)
)
,bb-bb,bb*bb
),bb)
)
?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.