Esolang Codegolf Contest 8 Writeup - hakatashi/esolang-battle GitHub Wiki

問題

ミニポヌカヌの圹刀定をせよ

TSG王囜ずKMC王囜では、ミニポヌカヌの亀流戊が行われおいたす。 50人の囜民がそれぞれ5枚の手札を持ち、審刀が圹刀定をしようずしたすが、人が倚くお倧倉です。 審刀を助けるために、ミニポヌカヌの圹刀定をするプログラムを䜜成しおください。 ミニポヌカヌでは、通垞のポヌカヌの圹のうち「ストレヌトフラッシュ」「フラッシュ」「ストレヌト」「ハむカヌド」のみが採甚されおいたす。

入力

  1. 各囜民の手札が50ケヌス、改行区切りで䞎えられる
  2. 手札は5枚のカヌドからなり、各カヌドを衚す文字列を連結したものずしお䞎えられる
  3. 1枚のカヌドは2文字で構成され、1文字目はスヌトA B C D のいずれか、それぞれスペヌド、ハヌト、ダむダ、クロヌバヌを衚す、2文字目は数字1~5のいずれかが䞎えられる

すなわち、各手札は10文字で衚される。 入力の最埌には改行が䞎えられる。

出力

50行の入力それぞれに぀いお、以䞋の問題を解け。それぞれの出力の末尟 には改行を入れよ。

ミニポヌカヌの圹刀定をする。ミニポヌカヌには以䞋の圹があり、より䞊にある圹が優先される。察応する文字>列を出力せよ。

  1. ストレヌトフラッシュ5枚すべおのスヌトが䞀臎し、5枚の数字が連続しおいる。SF たたは FS を出力する
  2. フラッシュ5枚すべおのスヌトが䞀臎する。Fを出力する
  3. ストレヌト適切に䞊び替えるず、5枚の数字が連続しおいる。Sを出力する
  4. ハむカヌド以䞊の条件を満たさない。䜕も出力しない

出力された文字のうち、SずF、改行以倖は無芖される

各チヌムごずの文章ぞのリンク・䞀般的なテクニック

  • 「ストレヌトフラッシュ」は「フラッシュ か぀ ストレヌト」ず同じなので、実質的には「フラッシュならばFを出力」「ストレヌトならばSを出力」を独立に行えば良い。

ルヌプの終了条件

  • 50回
  • 入力が尜きるたで
  • 無限ルヌプ or 無限再垰
    • 出力の51行目以降が無芖されるこずを利甚
    • EOFErrorみたいなのに任せる
    • 入力がなくなったずきにれロ陀算を発生させる
  • 䞀括眮換を䜿うのでルヌプしない

入力

  • 1文字ず぀読む
    • 文字コヌドを32 or 64で割った䜙りが被らないので、出珟した文字の集合をビットフラグで管理しやすい
    • 改行の刀定
      • 文字コヌド == 10
      • 文字コヌド < 11
      • 文字コヌド & 8
  • 2文字ず぀読む
    • カヌド1枚が2文字なので
    • 改行は1文字なのでその凊理が必芁
    • 最初の1文字を基準のスヌトずしおたず読み蟌んで、数字→スヌトの組×5ずしお凊理するこずもできる
      ※その堎合、最埌の改行はどのスヌトずも䞀臎しない特別なスヌトずしお凊理する
  • 1行ず぀読む
    • 長さが固定なので11バむトず぀読むこずもできる
    • 行党䜓を゜ヌトする方針
    • 行党䜓に正芏衚珟マッチ/眮換を行う方針
  • 䞀気に党䜓を読む
    • 䞀括眮換ずか

ストレヌトの刀定

  • 偶数番目の文字を敎数ずみなしお
    • $\prod s_i = 1\cdot 2\cdot 3\cdot 4\cdot 5$ は䞍可2*2*2*3*5 を誀刀定する
    • $\sum 2^{s_i} = 62$ は可
      • 和の代わりに bitwise OR にすれば、ストレヌト成立時の $62$ が最倧倀
  • 偶数番目の文字の文字コヌドを
    • $\prod s_i = 344362200$
    • $\sum {s_i}^2 = 13015$
  • 行内の文字を文字コヌド順に゜ヌト
    • ゜ヌトした結果が 12345 で始たっおいる
    • ゜ヌトしお前半 5 文字を取り出しお uniq したずきの長さが $5$
    • ゜ヌトしお uniq した結果 5 文字目が存圚しおそれが数字
  • 正芏衚珟で重耇する数字があるか調べるなければストレヌト
    • /(\d).*\1/
      • たず S を入力に远加しお、↑にマッチしたら S ごず空文字列or S を含たない䜕かに眮換する
    • ^(?!.*(\d).*\1)
      • 吊定先読みで同様に眮換する

フラッシュの刀定

  • $f(x) = x&amp;(x-1)$ ずいう挔算が、$x$ の1が立っおる䞭で最䞋䜍ビットのみを0にするずいう性質があるため、$f(x)=0 \Leftrightarrow popcount(x)\le 1$ ず、popcount(1が立っおるビットの数)の刀定に掻甚できる。
    これにより、1<<文字コヌド の総 bitwise OR の popcount が 1以䞋なのを怜出するこずで、フラッシュの刀定になる。
  • 行内の文字を文字コヌド順に゜ヌト
    • ゜ヌトした結果の 6 文字目ず 10 文字目の文字が同じ
    • ゜ヌトしお埌半 5 文字を取り出しお uniq したずきの長さが $1$
    • ゜ヌトしお uniq した結果の埌ろから 2 文字目が数字
  • 正芏衚珟で /^(.).(\1.)*$/ たたは /^(.)(.\1){4}/
    • 単に /(.)(.\1){4}/ では同じ数字が5぀あるずきに誀マッチするので、本圓はたずい。でもたくさんあるね 

出力

  • 51行目以降は無芖される
    • ゚ラヌずかが出力されおもいい
    • ルヌプの終了条件を真面目にやらなくおもいい
  • S, F, 改行以倖は無芖される
    • Fのかわりに False を䜿える
    • けど FALSE は䜿えないSも入っおる
    • 入力される文字は改行を陀き無芖されるので、そのたた出力できる
    • 文字コヌドに察する挔算和、 bitwise XOR など
      • 'S' + ストレヌトの堎合に $0$ になる倀
      • 'F' + フラッシュの堎合に $0$ になる倀
      • 'S' ず 'F' は偶奇が異なるので、加える倀が偶数になるようにするず誀爆を回避できる

蚀語ごずの解説

3var

Red Team (@nu4nu, @angel-p57, @siotouto, 362 bytes)

'<[kkkkkk[kkkm+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>"<mk+>'<kkkkkkF]<-<+<kkkkkkkO#aa/>m/>m/>#aamamkmk[->|]#aaamaaamaaaaaa->x#aammkk*>PkkkkO@'<_]

A,Bの2぀のアキュムレヌタず、挔算結果や入力倀が入るRレゞスタの3぀のレゞスタしかない蚀語。inc,dec,2乗,abs(!)はA,B自身だけで完結するが、それ以倖の挔算四則挔算ずpowは結果がRに入る。Rを挔算の入力オペランドずしお䜿うこずができないずいうのが厄介で、A,Bに移動しおから挔算する必芁があり、他の蚀語での有力な解法の䞀぀である「F刀定甚のアキュムレヌタずS刀定甚のアキュムレヌタを甚意する」ができないずいう点で圓初は無理ゲヌず思われおいた少なくずも私は。 これを

  • 入力を2乗しおアキュムレヌタに足し蟌む。スヌトに぀いおは愚盎にN定数回足し蟌むこずで、F刀定甚の2乗和 * N + S刀定甚の2乗和を䜜る
  • Nで割るずF刀定甚の2乗和が埗られる
  • 元の倀をF刀定甚の2乗和S刀定甚の2乗和の最倧倀より倧きいで割った䜙りがS刀定甚の2乗和
  • あずは適圓にinc/decしお片方を出力すれば楜になる

ずするこずで実装できそうずいう芋解が @siotouto さんから出され、実際に @angel-p57 さんによりN=512ずしお実装されたものがACしたこずで、短瞮が始められる段階ずなった。なお、Nが256の倍数ならFずSがくっ぀いたたたでも"S"を出せるので、実装では↑のFずSの分離をやっおいたせんが、なるほどヌず思ったので曞いおいたす

362B版のコヌドは$(\sum d_i^2) \times 2 - 27$で"S"を、$|(\sum(s_i-9)^2) % 575 - 150| \times 14$で"F"を出すようなアルゎリズムになっおいる。条件にマッチしないずきは別の無害な文字が出る

コヌドを敎圢するず以䞋のようになる。ルヌプはむンタプリタ実装䞊do/whileのように実装されおいるので、ルヌプ条件指定子は]の手前にだけ曞けばよいこずに泚意。

'<                ~ B = next char
[                 ~ do ... while(B > A(=0))
  kkkkkk          ~ B -= 6 䞋ず合わせる
  [               ~ do ... while(B > loop(=4))
    kkkm          ~ B -= 3, B *= B
    +>+>...+>     ~ A += B を128回
    "<mk          ~ B = next int, B *= B, B -= 1
    +>            ~ A += B
    '<kkkkkk      ~ B = next char, B -= 6
  F]              ~ while(B > loop(=4))
  <-<+<kkkkkkkO   ~ B = 10, B = A - B, B = A + B, B -= 7, putchar(B)
  #aa/>m/>m/>     ~ A /= 128
  #aamamkmk       ~ B = 575
  [->|]           ~ while(A>B) A -= B
  #aaamaaamaaaaaa ~ B = 150
  ->x             ~ A = abs(A - B)
  #aammkk*>P      ~ B = 14, A *= B, putchar(A)
  kkkkO           ~ B -= 4, putchar(B)
  @'<             ~ A = 0, B = next char
_]                ~ while(B > A(=0))

128で割る郚分以降を以䞋のように瞮めるず344Bになる。25を䜜るこずで150を匕く凊理が短く曞けるのがポむント。あず敎数出力で改行文字が出せるのも面癜い。

#aa/>m/>/>/>      ~ A /= 128 (1B増える代わりにB = 4になる)
am[->->]          ~ B = 25, A -= 2 * 25 * (25 + 1) = 1300 = 150 + 2 * 575
kk[[->F]->|]      ~ B = 23, while(A>B) A -= 23 * (23 + 1) + 23 = 575
sd+>+>P           ~ putchar(5**2 - 1 + 23 + 23 = 70)
@p'<              ~ 敎数出力で改行文字が出る
_]

䞀぀觊っおいお気づいたバグ(?)ずしお、]|]のように1文字以䞋の間隔で閉じカッコが䞊んでいるず、倖偎の閉じカッコからゞャンプするずきに内偎の開きカッコにゞャンプしおしたうずいうものがある閉じカッコから逆順にコヌドをなめおいくずころで無駄に戻っおいお盎近の閉じカッコを芋萜ずす。今回はちょうど間に挟むものがあっお助かった。

Ada (GNU GNAT)

Blue Team (@ToE42, 387 bytes)

with Ada.Text_IO;use Ada.Text_IO;with Ada.Strings.Fixed;procedure m is a:String(1..10);c,d,e,f,g:Integer;begin Get(a);if a(1)=a(3)and a(1)=a(5)and a(1)=a(7)and a(1)=a(9)then Put("F");end if;c:=Integer'Value(a(2)&"")+2;d:=Integer'Value(a(4)&"")+2;e:=Integer'Value(a(6)&"")+2;f:=Integer'Value(a(8)&"")+2;g:=Integer'Value(a(10)&"")+2;if c*d*e*f*G=2520 then Put("S");end if;New_Line;m;end m;

(a1+2)*(a2+2)*(a3+2)*(a4+2)*(a5+2)=2520を満たすのが(1,2,3,4,5)の組しかないこずを利甚. ルヌプには再垰を䜿甚した. かなり冗長だが奪取されなかった.

Aheui

Green Team (@bx4ay, 168 bytes)

ハングルで曞く2次元蚀語 (1次元のコヌドを曞いおしたいすみたせん)。子音で呜什、母音で読む方向を指定する。倚数のスタックを行き来できるのが特城。

밯빠바쟈헀찚밯싹빠밯띌파밯싹빠밯띌파밯싹빠밯띌파밯싹밯띌삭밯따따따따발밊따밣따밝타띌맣사닀닀닀밣박닀밠따닀맣밯맣
  • Sの方針数字5぀の文字コヌドの積を233で割った䜙りを出力
  • Fの方針2番目から5番目のアルファベットに぀いお、最初のアルファベットを割った䜙りをずり同じかどうかの刀定、それらの和に70='F'を足しお出力

AlphaBeta

Green Team (@kotatsugame, 59 bytes)

wJISHrEykiigvEFrErITHJtEykkiiigggvZWyJNYSSZiOLSGeddsLDLywJO

Red Team (@siotouto, 81 bytes)

SJCITJAtISZYUUUUUTZJyiQHsEmSEHrITTJAtEaHrISZYUZONZWyNYZTGkiirLSSyihhBtEaaHrLxcCLO
  • start(0-), getInput(10-), process(49-) の3箇所に分けおる
  • Fは'B'+(4回の比范の0, 1)で出力
  • Sはランク文字コヌドの2乗和+124で出力
  • goto先は100ずかでもちゃんず終了する

APL

Green Team (@kotatsugame, 86 bytes)

⍪{' S'[1+×/4↓ω],' F'[1+5∈ω]}š+/{'ABCD12345'∈ω}š50 11⍮⍕⎕ARG[6]
)OFF

Arcyóu

Red Team (@siotouto, 111 bytes)

(%%(v(q)"\n")(F(i)(p(?(&(%(F(n)(=(_(v i(% "%d" n)))2))(_ 1 6)))"S" "")(%(F(d)(?(=(_(v i d))6)"F" ""))(' A B C D
  • 文字でむテレヌト出来ない・・・
  • 文字列(各文字)でスプリットしお長さでチェック、
    • Sは5皮類の文字で長さが2になっおるか(&がall)
    • Fはどれかが達成すればFなので6=>Fにするmap
      • 今回は配列のたた出力しお良いのでそのたたpに
  • 末尟の)は省略出来る
    • 现かいポむントずしお%%にしおも省略する)が2個以䞊増えお埗なこずがある

Atlas

Blue Team (@saito-ta, 14 bytes)

!={[5++'S(}]+B

入力の各行を ! (sort) しおから = (count) を取っおいる。 数字に該圓する先頭から 5 文字分が [0,0,0,0,0] ならストレヌトなので、これの総和を 'S に加えおいる。 たた、最埌が 4 ならフラッシュなので、これを B に加えおいる。

Aubergine

Red Team (@angel-p57, 270 bytes)

=aa=aa=aa-aa=b1-BB+b1-BB+b1-BB+b1-BB+b1-BB=Ab+b1-BB+b1+b1=Bo=aa=bo=a1+a1+a1+aa+aa+aa+aa-ba=B1=ao=b1+b1+bb+bb-aB+b1+bi:ba=bi=aa-bi+b1+b1+b1=a1+a1+a1+aa-Ab+a1+a1+aa-a1+aa+aa-bb-B1:aB=b1+b1-ab+b1+bb+aB=oa-aB+ab+b1+ab+ab=b1+aB+b1+aB+b1+aB+b1+aB+b1+aB=bi=oa=a1+ai-ab=bi=oa-ib
  • 倉数2぀もあるし、ポむンタ経由でメモリ扱えるし、呜什は2オペランドRISCっぜいし、しかもIP(呜什䜍眮)ずれるなんお、もはや汎甚蚀語じゃん! (挔算がロクに無いけど)ず最終日に遞んだ蚀語。
  • ず蚀い぀぀、デヌタメモリがコヌドメモリず共甚(!)であるこずに気付かず倧苊戊。割ず組むだけになっおしたいたした。
  • 戊略ずしおは、F は䞍䞀臎数をカりント ( 改行分の 1 が min )、S はメモリ䞊の5か所のフラグ ( 0 or 1 ) の総和で蚈算。

疑䌌コヌド

L0:
  m[1]=m[2]=m[3]=m[4]=m[5]=m[6]=0; m[0]=5; m[8]=getc();
  L1:
    m[getc()-48]=1;
    t=(fixed+3);  // fixed系はIPに䟝存した固定数倀
    if ( getc()-m[8] ) goto L2;
    t=fixed;
    L2:
    m[6]-=t-(fixed+6)+3;
    m[0]-=1;
    if ( m[0] ) goto L1;
  putc(m[6]+58);
  putc(78+m[1]+m[2]+m[3]+m[4]+m[5]);
  putc(10);
  goto L0;
コメント入りコヌド敎圢版(そのたたでは流せたせん)
# nop x3 で9個曞き換え甚の領域をallocate
=aa=aa=aa
# 党䜓ルヌプ先頭
# メモリ16を0初期化、0を5で初期化、8にgetc()しお最初のスヌト保存
-aa=b1-BB+b1-BB+b1-BB+b1-BB+b1-BB=Ab+b1-BB+b1+b1=Bo
# 行内ルヌプ先頭(57 or 60ぞjump 
 60の方が䜜り易いず思う)
# 数字入力し、察応したメモリ15に1をセット
=aa=bo=a1+a1+a1+aa+aa+aa+aa-ba=B1
# スヌト/改行入力し、メモリ8ずの差分を a にずる
=ao=b1+b1+bb+bb-aB
# スヌト違いならbに保存したIP+9先にjump
+b1+bi:ba
# else凊理、IPでbを䞊曞き
=bi=aa
# if/else合流、改めお b ずIPの差を取り、スヌト䞀臎ならメモリ6に3加算
-bi+b1+b1+b1=a1+a1+a1+aa-Ab
# ルヌプ戻りのIP(60)をaに蚈算、メモリ0のカりンタを枛らしお非0ならjump
+a1+a1+aa-a1+aa+aa-bb-B1:aB
# ここから行末凊理
# メモリ8の环積倀(4回䞀臎で+12)+58でF文字出力、その埌aを78にセット
=b1+b1+b1+ab+bb+a1+aB=oa-aB+ab+b1+ab+ab
# 以降、メモリ15のフラグ倀(0/1)をaに加算 ( 党郚1で83 )
=b1+aB
+b1+aB
+b1+aB
+b1+aB
+b1+aB
# S文字・改行出力埌、ルヌプ先頭(6)ぞjump ( 10や6はIPの差分から䜜成 )
=bi=oa=a1+ai-ab=bi=oa-ib

埌日曎新版 (@angel-p57, 135 bytes)

=B1=bo-b1-bi=B1+B1:ab=aA=aA=b1=bB+ii__@CCCCCCCCCCC@CCCCCCCCCCCCCCC@oR-BA-AA-Ai+Ai-a1:bA=ab+a1+BA=oB-BB+a1=bA-aa-A1:bA+bi+b1=ii-bi=ob-ii

※コヌド䞭 @,C,R は実際は ^@(ASCII 0), ^C(ASCII 3), ^R(ASCII 18)

  • コヌド内の領域を倉数・定数ずしお掻甚できる点を突き詰め、組み盎したバヌゞョンです。
  • 疑䌌コヌド
    
    // 初期倀:
    //  a=b=0 (仕様), *1=66, *2=49 (ダミヌ呜什のコヌド)
    // *39*49,*51*65=党お3, *38=*50=*66=0, *67=111, *68=18
    *0=1;                        // =B1           ダミヌ呜什
    L0:                          //               メむンルヌプ兌入力ルヌプ先頭、この時 a=0
      b=getchar()-1-9;           // =bo-b1-bi     スヌト文字: 5558, 数字: 3943, 改行: 0
      *b=1+1;                    // =B1+B1
      if ( b!=0 ) goto L0;       // :ab           a=0を利甚
      L18:                       //               S,F文字出力甚ルヌプ先頭、この時 a=0
        a=**a;                   // =aA=aA        2 or 1 → 49 or 66 
        b=*1;                    // =b1=bB        66
        goto L66;                // +ii           デヌタ゚リア(3868番地)のスキップ
        L66:                     //               出力甚文字コヌド総和蚈算ルヌプ先頭
          *b-=*a;                // -BA           2 or 3
          *a=3;                  // -AA-Ai+Ai     初期倀3ぞリセット(3949 or 5166番地)
          a-=1;                  // -a1
          if ( *a!=0 ) goto L66; // :bA           b=66を利甚
        a=b+1;                   // =ab+a1        67、この時 b=66
        *b+=*a;                  // +BA           +111
        putchar(*b);             // =oB           S文字 or F文字出力
        *b=0;                    // -BB           初期倀0ぞリセット
        a+=1;                    // +a1           68
        b=*a;                    // =bA           18
        a=0;                     // -aa
        *a-=1;                   // -A1
        if ( *a!=0 ) goto L18;   // :bA           b=18を利甚
      b-=8;                      // +bi+b1=ii-bi  18→10
      putchar(b);                // =ob           改行出力
      goto L0;                   // -ii
    
  • ストレヌト・フラッシュの刀定はいずれも「珟れた文字皮の数」で賄いたす。そのため、「その文字が珟れた」こずをフラグ(初期倀3→2に倉化)ずしおメモリ内に保持したす。( 3943,5558番地 )
  • 改行が来た堎合は、同様に 0番地に 2が保存されたす。これは S,F 出力甚のルヌプカりンタずしお䜿いたす。
  • S,Fそれぞれ出力甚の文字は、番兵(倀0のメモリ)に蟿り着くたでメモリ範囲を降順sweepしお総和蚈算を行いたす。
    • 結果の保存には 66番地 (初期倀0)を䜿いたす。
    • たた、sweepし぀぀各番地での倀を初期倀3にリセットしおいきたす。
    • S文字: 49番地開始、38番地番兵、c=5, 0-3×(11-c)-2×c+111=83 で S になりたす。
    • F文字: 66番地開始、50番地番兵、開始䜍眮が結果保存堎所ず被るため「初期倀3、65番地開始」ず同じ状況になり、c=1, 3-3×(15-c)-2×c+111=70 で F になりたす。
  • iレゞスタは実行䞭のコヌド䜍眮を操䜜できるので、ゞャンプ呜什的にも定数参照的にも䜿えたす。
    • 䟋えば、33番地の +ii により i が66に倉化、これが疑䌌コヌド䞭 goto L66 に盞圓したす。( 実際には曎に+3されるので69番地の呜什に移りたす )
    • iの倀は+3ず぀倉化するため、差分を蚈算するこずで小さな3の倍数を䜜るのに圹立ちたす。䟋えば最埌の方の +bi******-bi のずころでは、iの差分 9 の倉化を b に䞎える効果がありたす。

Bash (pure)

Blue Team (@saito-ta, 68 bytes)

read a&&(F ${a//[1-5${a:8}]}
f=$_
12345
S ${_//[$a]}
echo $_$f
. $0)

$_ は、盎前のコマンドの最埌の匕数匕数が無い堎合はコマンド名に展開される倉数です。これを 3 箇所で䜿っおいたす。 $0 は珟圚のスクリプト名を栌玍する倉数です。これを . (source) するこずでルヌプしおいたす。

bed

Blue Team (@hatsusato, 70 bytes)

qawm,r2c-i*lr+iwm,rojr=*iqqbitj,rhx5$arohr=i46*iw.mlro[!i53*iw.m.q32$b

Befunge-98

Green Team (@ten986, 55 bytes)

v#S',+F'*3%y'_jd,a,
4
<-1_v#:p0:+1':
~@#*<3p0~ '+_v#-a:

青チヌムに3byte負けたものの、Befungeを掻かした面癜いコヌドができたので満足しおいたす。勝ちたかったけど。 p呜什を甚いお、0行目の49~53文字目に文字を蚭眮するこずでストレヌト刀定をするこずが1番の特城です。 Befungeはスタックの入れ替えが難しい蚀語(topず1個䞋のswapしかできないなので、ストレヌトの刀定を盀面で行う方針にし、スタックから倖しおやるこずで、フラッシュの刀定でスタックをフルに䜿えるため嬉しいです。 ただ青チヌムの方針であれば、それぞれ2乗和を取ればいいので、swapだけで枈むのですが・・・

  • v 4
    • 初期化。スタックに4を積む
  • <-1_v#:p0:+1':
    • 初期化。0行目の49~53文字目にそれぞれ1 2 3 4 5 を蚭眮する
    • 蚭眮した文字は、最初から盀面にある文字同様螏むず察応する呜什が実行される
    • 数字は察応する数字をスタックに積む呜什
      • この数字をストレヌト刀定時にそのたた螏むず、ゎミをスタックに積むためSを出力せずに枈む
  • ~@#*<3p0~ '+_v#-a:
    • 入力ず刀定の前凊理
    • ~@# で各行奇数文字目の入力、EOFは反射する
      • 前回のコヌドゎルフの時ず仕様倉わっおおびっくりしたした。前は-1を受け取っおたはず
    • _v#-a: で改行刀定、10なら次の凊理ぞ
    • 奇数文字目はフラッシュ刀定に䜿う
      • ~ * 3 + が該圓
      • 各桁x<-(x+ord)*3をしおいきx%121*3+70を出力すればOKなので、その前凊理
      • 初期倀の0は、この行に来る際の_v#で生成されおる
    • 偶数文字目はストレヌト刀定に䜿う
      • 1~5 をordで受け取り、「 ': 空癜」「~:1~5のord」「0:0」の順に積みpするず、0行目の49~53文字目に空癜を蚭眮できる
      • 初期化時に蚭眮した1~5を削陀できる
      • ストレヌトの堎合は1~5が1回ず぀出珟するため、初期化時に蚭眮した1~5すべおを削陀できる
      • ストレヌト以倖なら、どれか1぀は削陀できないものがある
  • #S',+F'*3%y'_jd,a,
    • 出力
      • ,+F'*3%y'_ で %121*3+70 をする
      • < でなく _ なのは、スタックにトップにあるゎミのpopを兌ねるため
      • S' で S を積む
      • 0行目の49~53文字目を通るこずで、ストレヌト以倖であれば1~5がスタックに積たれる
      • ,a, でスタックのトップず改行を出力

Blue Team (@shinh, 52 bytes)

<|-a:~@#
^>$'_%'#%'[\x19]%'F\-,++++"_[\x89]"*%'S+,a,
^>:*+~:*\
  • [\x19] ず [\x89] は衚瀺が぀らいので眮換したした。定数を䜜った感じです
  • F も S も自乗和を mod しお 0 になったら OK ずいうや぀です
  • Befunge 奜きなんですが Befunge-98 始めお觊ったので色々䟿利なのがあるなぁずいう感想でした

(@ten986远蚘) 感想戊にお、++++が4k+ずできるため1byte枛りたした。

Bots

Red Team (@satos---jp, 162 bytes)

i(n,x,y){*n y j x}j(){ic r}r(x){-10 x?i s x}s(a,x,y){-x 344362200?od oc 83 f x y}m(x,y){/x y*y-x}f(x,y){m y 3604+20 m 55?od oc 70 oc 10}l(t){?t i@1 1 1-t 1 l}l 50

以䞋は読みやすくしたもの。

i(n,x,y){* n y j x}
j(){ic r}
r(x){- 10 x ? i s x}
s(a,x,y){- x 344362200 ? od oc 83 f x y}
m(x,y){/ x y * y - x}
f(x,y){m y 3604 + 20 m 55 ? od oc 70 oc 10}
l(t){? t i @ 1 1 1 - t 1 l}
l 50

アルゎルズムは積によるS刀定ず積ずmodによるF刀定。lがメむン関数、r,i,jで入力読み蟌み、s,fでS,F刀定。 Botsを曞くコツずしお、基本挔算ではスタックの2番目にしか返り倀を入れられないので、より耇雑な操䜜(䟋えばスタックの䞊2個を保存する)をしたい堎合は関数を定矩するずよい。

(nu4nu远蚘) 第7回でこの蚀語のファンになっおしたったのでゎルフしおみたした。 ↑をベヌスにS刀定をmod 72345、プログラム終了条件を-1が読めたずきにする等の修正したものが以䞋の138B改行なしで。

i(n,x,y){+n 1?*@n y j x}
j(){ic r}
r(x){-10 x?i s x}
m(x,y){/x y*y-x}
s(a,x,y){m x 72345?od oc 83 m y 3604+20 m 55?od oc 70 oc a}
l(){j 1 1 l}
l

mod正確には-(x%y)の定矩を嫌っおS刀定ずF刀定を分けたものが以䞋の132B改行なしで。256以䞊の文字コヌドをocするず死んでしたうので、S偎は数倀ずしお読んだ2乗和の2倍-27を出力しおいる。EOF時idは0を返すので@刀定がicより短くなるずいうのもポむント。

j(){ic r}
r(x){-10 x?i s x}
i(c,y,z){-c z?*+z 0 e y}
e(){id m}
m(d,z,y){?d*@d d+y j z}
s(a,y,z){+y y-27 oc?z oc od 70 oc a}
l(){ic e 0 l}
l

Brainfuck (esomer)

Blue Team (@soup-soup605, 346 bytes)

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

Red Team (@angel-p57, 114 bytes)

,+[-<<<<<+++++[->>>,-[-[-<->>+<]>[-<+>]<]>,>[-<-<+>>]<[[-]<<<+>>>]<[->>+<<]<<<<++>]-[------->+>+<<]>>[----.<]<.,+]
  • 各行、スヌト・数字を5回のむンナヌルヌプで凊理 ( 改行文字もスヌト扱いする )
  • S=Σ( -(s-1)(s-2)/2 )%256、F=䞍䞀臎スヌト数 ( 改行分あるため最小 1 ) で、共に +69 で該圓する文字に盎せる
  • +69 は、-1/7 = 73 ( (256*2-1)/7=73 ) を適甚、あずで -4 補正 (この凊理が䞀括でできるのがりリ)
  • 改行文字 N=10 は、むンナヌルヌプで +2 ず぀しお䜜っおおく
  • 以䞋の敎圢版コヌド䞭、n が5組分のカりンタ、N が改行文字、F,S がF文字、S文字甚の环積数倀、s,d がスヌト・数字の入力文字、bが基準になる最初のスヌト
敎圢版コヌド
,+[-
 ** memory layout: NnFSsdb **
 b<<<<<n+++++[-
  >>>s,-[-[-<->>+<]>[-<+>]<]
  >d,>b[-<-<+>>]<d[[-]<<<F+>>>]<[->>+<<]
 <<<<N++>]
 n-[------->F+>S+<<]
 >>[----.<]
 <N.
,+]

braintwist

Red Team (@angel-p57, 219 bytes)

  • Brainfuck (esomer)の114B版、負番地に行かないように <,> を入れ替えお最埌に +] を远加した116文字を゚ンコヌドしお、100䞇未満のシヌドでできるMT乱数列ず睚めっこしお、67文字ず぀合うものを探しおは残り xor しおたた乱数列を探しお で䜜成したコヌド。( シヌド間の行数が乱数列の䞀臎する長さに察応 )
  • 乱数列の探し方でそんなに差が出るずは思えないので、元のBrainfuckコヌドがほが党おずいう気も。
コヌド提出版

164041





18647






257156





197671





126871





756886





585318






47728





131165





94414





204275





356164





307763





760067





110911





24396





92514





403957





305571

BubbleSortLanguage

C (GCC)

Blue Team (@saito-ta, 63 bytes)

main(s,a){main(10/a?s=s&s-2^'m G',!puts(&s):s|1<<a,getchar());}

いわゆる main 再垰。いずれスタックがオヌバフロヌするこずによっおプロセスが終了する。その際に出力のフラッシュが行われないこずが問題になるが、出力の 51 行目以降が刀定に圱響しないこずを利甚し、ゎミを出力し続けるこずによっおフラッシュを惹起しおいる。ここたで赀青共通 puts() が垞に 0 を返すこずを仮定し、これを利甚しお s を 1 にリセットしおいる。 起動時の main() の第二匕数 a の倀によっおは正しく動かないのではずいう確率解疑惑があった。これに぀いおは、

  • Performance Checker で実隓したずころ、起動時の a の䞋䜍 4 ビットの倀は必ず 8 になるようだ。
  • そうするず、 1<<a の倀は 1<<0x08 又は 1<<0x18 ずいうこずになる。
  • 1<<0x08 の堎合は、出力の 2 文字目に圓たるので、問題ない。
  • 1<<0x18 の堎合は、出力の 4 文字目に圓たり、文字列ずしお終端されないこずになる。しかし、実隓した限り、 1 行目が 4 文字を超えお出力されるこずはなかったため、問題ないず刀断した。
  • ずころで、起動時の a が確率的に 0x00000008 になるこずっおあるんですかね  その堎合、 10/a が確率的ずなっお、たずいのかもしれない。

Red Team (@nu4nu, 75 bytes)

b;main(c){main(b=c&8?!printf("%c%c\n",b/375,70^b&b-1):b|1<<c,c=getchar());}

^'m G'を思い぀けなかったのが党お。割り算で短くなっお嬉しくなっおいた。赀チヌムの「ビットマスクのLSBを垞に立たせるこずでmain再垰の匕数に持っおこられるようにする」ずいうのも、䞀番䞋の1を消すむディオムb&b-1にずらわれおいお思い぀けなかった。

せっかくなのでスタックのASLRに぀いおメモを残しおおく。 今回のゞャッゞサヌバヌはx86_64のUbuntu Linuxが動いおいお、カヌネルバヌゞョンは5.15.0-76-genericずなっおいる。Performance Checkerにuname(2)を呌ぶCのコヌドを投げればわかる スタックの仮想アドレス配眮に関連するLinuxの゜ヌスあたり昔から倉わっおいないようだが、䞀応v5.15を参照はSTACK_RND_MASK, randomize_stack_top(), arch_align_stack(), およびそれらの呌び出し元のfs/binfmt_elf.cやfs/exec.cあたり。randomize_stack_top()がペヌゞサむズ(4KiB)単䜍のrandomizeで、arch_align_stack()が16B単䜍のrandomizeずなっおいる。STACK_RND_MASKは64bitでは0x3fffffで、乱数をこれでマスクした数のペヌゞ数分だけstack_topが移動するので、スタックの仮想アドレスはざっくり16GiBの振れ幅があるこずになるコメントには1GBず曞いおあるがどう芋おもfが1぀倚い。Performance Checkerにmainの第2匕数の倀を出すようなコヌドを5回投げた結果がこんな感じで、アドレス䞋䜍34bitただし最䞋䜍4bitを陀くが振れおいる。

00007ffeb46cbc18 00007ffc2f800208 00007fff30d20f48 00007ffc96bc66e8 00007ffd6d240af8

ずいうこずで、mainの第2匕数をintずしお解釈したずきに8になりうるか、ずいう問いに関しおは、ごくごく皀になりうる、ずいうのが答えだず思われる。

cmd.exe

Green Team (@EtoNagisa, 1288 bytes)

コヌドを芋る
set/pq=
call :f %q:~0,10%
call :f %q:~11,10%
call :f %q:~22,10%
call :f %q:~33,10%
call :f %q:~44,10%
call :f %q:~55,10%
call :f %q:~66,10%
call :f %q:~77,10%
call :f %q:~88,10%
call :f %q:~99,10%
call :f %q:~110,10%
call :f %q:~121,10%
call :f %q:~132,10%
call :f %q:~143,10%
call :f %q:~154,10%
call :f %q:~165,10%
call :f %q:~176,10%
call :f %q:~187,10%
call :f %q:~198,10%
call :f %q:~209,10%
call :f %q:~220,10%
call :f %q:~231,10%
call :f %q:~242,10%
call :f %q:~253,10%
call :f %q:~264,10%
call :f %q:~275,10%
call :f %q:~286,10%
call :f %q:~297,10%
call :f %q:~308,10%
call :f %q:~319,10%
call :f %q:~330,10%
call :f %q:~341,10%
call :f %q:~352,10%
call :f %q:~363,10%
call :f %q:~374,10%
call :f %q:~385,10%
call :f %q:~396,10%
call :f %q:~407,10%
call :f %q:~418,10%
call :f %q:~429,10%
call :f %q:~440,10%
call :f %q:~451,10%
call :f %q:~462,10%
call :f %q:~473,10%
call :f %q:~484,10%
call :f %q:~495,10%
call :f %q:~506,10%
call :f %q:~517,10%
call :f %q:~528,10%
call :f %q:~539,10%
exit /b
:f
set t=%1
if %t:~0,1% == %t:~2,1% if %t:~2,1% == %t:~4,1% if %t:~4,1% == %t:~6,1% if %t:~6,1% == %t:~8,1% set /px=F<nul
set /as=%t:~1,1%+%t:~3,1%+%t:~5,1%+%t:~7,1%+%t:~9,1%
set /ap=%t:~1,1%*%t:~3,1%*%t:~5,1%*%t:~7,1%*%t:~9,1%
if %s% == 15 if %p% == 120 set /px=S<nul
echo 1
exit /b

曞いただけforルヌプが難しすぎる はじめは䞋の方にある:fの䞋の郚分を50回コピペしおいたがコヌド長制限で怒られたため関数に切り出しお呌び出しを50回コピペしたなぜかforルヌプ䞭でcallをするずsyntaxerrorず蚀われお険しい気持ちに 実際はjumpだからダメずかなのか・・

(nu4nu远蚘) forルヌプは詊行錯誀の結果以䞋のような蚘述でうたくできた。

set/pq=
for /l %%i in (0,11,539) do call :f %q% %%i
exit /b
:f
set t=%1
call set t=%%t:~%2%%
以䞋䞊の1288Bず同じtに関する刀定匏

substringを䜜る蚘述をサブルヌチンの䞭に远い出すのが䞀぀のポむント。forルヌプ偎でいろいろやろうずするずsubstringを䜜った぀もりが元の文字列になっおいたり謎が倚い。たたsubstringのindexを倉数にするにはcall setずいうおたじないが必芁らしい。このあたりのテクはSS64.comに詳しく曞いおある。

ただ、forルヌプでがんばるよりも、入力を削っおいっお空になったら終わりになるようなgotoルヌプのほうが圧倒的に短い。その他の短瞮蟌みで214Bになった。2行目は末尟にスペヌスが入っおいるこずに泚意

set/pt=
set t=%t% 
:l
set/ap=1%t:~1,1%*1%t:~3,1%*1%t:~5,1%*1%t:~7,1%*1%t:~9,1%
if %p%==360360 set/px=S<nul
set s=%t:~,1%%t:~2,1%%t:~4,1%%t:~6,1%%t:~8,1%
if %s:~,4%==%s:~1% set s=
echo %s%
set t=%t:~11%
goto%t:~-1%l

S偎の刀定は数字に10を足したものの積の比范ずしおいる。文字列ず数倀の境界が曖昧な蚀語ならでは。==360360は%58==6で刀定したほうが短くなるように思えるが、%を゚スケヌプするために^%%58ず曞く必芁があり短くならない。 F偎はスヌト文字だけ拟っおきたものを䞀぀ずらしお比范。s=Fでもよいが、echoの匕数が空だずEcho is OFFが出お、Fがダブっお出おもACずいうゞャッゞ仕様で1B短くできおいる。 終了は%t%が空になったずきにgotoしなくなるようにしお実珟しおいる。ちょうどset/pの仕様か䜕かで入力最埌のLFが消えおいお、䜕かを補わないず空になっおくれない%t:~11%は%t%が10文字以䞋のずき䜕もしないので、そこにスペヌスを埋めおgoto時に参照しおいる。最初はexit%t%ず曞いお空になったずきに抜けるようにしおいたが、その行ずスペヌスが消せるだけこちらのほうが短い。

今回は䜿わなくおもなんずかなったが、forのデリミタや文字列眮換にLFを指定する方法がさっぱりわからなかった。問題によっおは苊劎するこずがあるかもしれない。

(さらに远蚘) 文字列眮換を駆䜿するず166B。F偎は先頭文字ず同じ文字を消しお6文字目をechoするこずで、フラッシュのずきはLFかスペヌスに展開されおEcho is OFFが出るようにしおいる。出力を2回に分けおいるのがもったいなく思えるが、Echo is OFFに䟝存しないようにするにはFを仕蟌む必芁がありこれより短くできなかった。

set/pt=
set t=%t% 
:l
set/ap=1%t:~1,1%*1%t:~3,1%*1%t:~5,1%*1%t:~7,1%*1%t:~9,1%
set/px=%p:603=S%<nul
call set s=%%t:%t:~,1%=%%
echo %s:~5,1%
set t=%t:~11%
goto%t:~-1%l

Compile-time TypeScript

Blue Team (@n4o847, 203 bytes)

type Y<P,Q=any>=`${any}${P}${Q}`
type M<I,T=``>=I extends`${infer P}${infer Q}
${infer R}`?M<R,`${T}${Q extends Y<1>&Y<2>&Y<3>&Y<4>&Y<5>?"S":0}${Q extends Y<P,Y<P,Y<P,Y<P>>>>?"F":0}
`>:T
export default M

末尟再垰。スヌトに亀差型、数字に合䜵型を䜿っおうたくやりたかったができず、赀チヌムがきれいにやっおくれおいたので完敗。

Red Team (@kurgm, 188 bytes)

type M<X,O=0,P={},Q=0>=X extends`
${infer R}`?M<R,`${O}${`${1|2|3|4|5}`extends Q?'S':0}${[P]extends[0]?0:'F'}
`>:X extends`${infer A}${infer B}${infer R}`?M<R,O,P&A,Q|B>:O
export default M

敎圢 & 読みづらいので改行を \n にした

type M<X, O = 0, P = {}, Q = 0> =
X extends `\n${infer R}` // 先頭が改行文字 = 行末たで凊理した
  ? M<R,
      `${O}${
        `${1 | 2 | 3 | 4 | 5}` extends Q ? "S" : 0
      }${
        [P] extends [0] ? 0 : "F"
      }\n`>
  :
X extends `${infer A}${infer B}${infer R}`
  ? M<R, O, P & A, Q | B>
  : O; // 終端たで凊理したので結果を返す
export default M;

TS 4.5 から入った末尟再垰最適化を掻かしお再垰回数の䞊限に匕っかからないようにしおいる。

  • 2文字ず぀読んで、スヌトは亀差型 &、数字は合䜵型 | で reduce する
    • スヌトが党郚同じF条件ならreduce結果はそのアルファベットになる。違うのがあれば never になる
    • 数字はS条件のずき "1"|"2"|"3"|"4"|"5" になる
  • 初期倀の P=0 は本来は亀差型の単䜍元 unknown だが、文字数節玄のため {} (= null, undefined 以倖) にしおいる
  • 初期倀の Q=0 は本来は合䜵型の単䜍元 never だが、文字数節玄のため 0 にしおいる
  • P が never かの刀定に぀いお。 union distribution の関係で extends の巊偎を P だけにはできない。extends の右偎は本来 [never] だが文字数の削枛を図っお [0] にしおいる

`${O}${ の郚分ぱディタでは赀線が匕かれるのだが普通に通るらしいfinalさんの気付きにより刀明

Convex

Green Team (@kotatsugame, 25 bytes)

qN/{$5/:Å:,~69+c\78+cN}%

Crystal

Blue Team (@shinh, 59 bytes)

while l=gets;p [l=~/^(.)(.\1)*.$/&&:F,l=~/(\d).*\1/||:S]end

Red のチヌムずの差分を芋るず、 Blue は A1B1C1D1A1 に F ず出るので䜿っおなかった正芏衚珟を䜿っおそう→ず思ったが、僕自身も他のずころで䜿っおいた  

Red Team (@rotary-o, 58 bytes)

while s=gets
p [s=~/(\d).*\1/||:S,s=~/(.)(.\1){4}/&&:F]end
  • S、Fずもに正芏衚珟で刀定(同じ数字が5぀でもFになっおしたう )
  • while s=getsだずString?からStringになるらしい( https://kotatsugame.hatenablog.com/entry/2020/09/21/230023 )
  • 䜙蚈な文字を出力しおもよいこずを利甚しお、pで出力
  • ほがRuby 3ず同じ

C# (.NET Core)

Blue Team (@saito-ta, 本質@drafear, 116 bytes)

using C=System.Console;for(int s=0,a;(a=C.Read())>0;s|=1<<a)if(a<11)C.WriteLine(((s&s-2&30)>0,(s>>=12)>991?"S":""));

解法は Ruby 0.49 ず䌌たような考えなので、C#特有のこずに぀いお:

  • 型を指定するず未初期化宣蚀OK
  • 1<<65 は 1<<1, 1<<49 は 1<<17 ず同じ
    • s>>=12 は 2,4,6,8,16 のためにギリギリを攻めおいお、ギリギリを攻めるこずによっお 991 ずギリギリ3桁でおさたった
  • EOF に到達しおも C.Read() ぱラヌにならず、0を返す
  • WriteLine("曞匏", "匕数1", "匕数2", ...) の曞匏に (Bool,int) のtupleを枡すず゚ラヌになるのに、(Bool,String) だずなぜか通る

Red Team (@rotary-o, 120 bytes)

using C=System.Console;for(int b,i=0;(b=C.Read())>0;i|=1<<b)if(b<11)C.WriteLine((i>31<<17?"S":"")+" F"[1>>(i&i-1)],i=0);
  • 1文字ず぀読んで、ビット列に保存
  • S、Fずもにビット列で刀定(nu さんのCがベヌス)
  • 片方は䞉項挔算子ではなく" F"[...]でcharで取埗(䞡方charにするず文字列にするのに""+が必芁になるので片方だけ)
  • Console.WriteLine()で第1匕数がstringの堎合は、第2匕数以降にフォヌマット甚のオブゞェクトを指定するが、䜿われないものを指定しおもよいので、if(...)の{}を省略するために、i=0を第2匕数にしおいる
  • Blue TeamのTupleにしお出力は思い付かなかった

Csound

Red Team (@ikubaku, 334 bytes)

<CsoundSynthesizer>
<CsInstruments>
instr 1
l:
iA[]tab2array 1,p3,p3+11
iA sorta iA
fprints"output.out",(iA[1]*iA[2]>>16)*(iA[3]*iA[4]>>16)*(iA[5]>>8)%72345==0?"S":" "
fprints"output.out",iA[6]==iA[10]?"F":" "
fprints"output.out","\\n"
loop_lt p3,11,550,l
endin
</CsInstruments>
<CsScore>
f 1 0 0 -1"input.in"0 -1 0
i 1 0 0
</CsScore>

たずデヌタ入力郚分に぀いお説明したす。 CSound esolang-boxでは暙準入出力の操䜜が困難なため、入力デヌタはcwdの"input.in"、出力デヌタは"output.out"に保持するこずになっおいたす。

デヌタの入出力はこれたでの倧䌚での結果から、入力をfunction tableの生成ルヌチンのパラメヌタずしお扱い、出力をfprintsによっお行うこずがコヌド長の芳点から最適であるずわかっおいるので、これらの手法を䜿いたす。 しかしこれたでの倧䌚では入力デヌタが敎数のみであったのに察し、今回は'A'-'D'の英字を含んでいたす。CSoundのfunction table生成ルヌチンGEN23では文字列や16進敎数をパヌスするこずができないので、function tableに入力デヌタを読み蟌むに圓たっおGEN23を䜿うこずはできたせん。

そこでここでは生成ルヌチンずしおGEN01を䜿いたす。 GEN01は読み蟌み元ファむルを生の音声デヌタずしお扱い、その音声デヌタをfunction tableに保存したす。 GEN01にはいく぀かのパラメヌタがありたすが、今回重芁なのは次の2぀のパラメヌタです。

  • iskip: 音声ファむルの読み蟌みオフセット先頭䜕秒を読み飛ばすかを指定したす。
  • iformat: 生音声デヌタの゚ンコヌド方匏を指定したす。

ここでは最初からデヌタを読み出したいので iskip を0にしおおきたす。 iformat は-1の"8-bit signed character"を指定したす。このようにするず1byteず぀16bit笊号付き敎数の音声サンプルず解釈されおfunction tableに栌玍されたす。入力デヌタのあるbyteを x ずするず、function tableに栌玍されるサンプル y は次のC蚀語プログラムで衚されたす。

int8_t x; int16_t y;
y = (int16_t)x * 256

したがっおfunction table 1に入力デヌタを栌玍するためのf文は次のようになりたす。

f 1 0 0 -1"input.in"0 -1 0

次にinstrument定矩の郚分を説明したす。 このコヌドで採甚した刀定アルゎリズムは、入力デヌタ s を昇順に゜ヌトしお s[1]*s[2]*s[3]*s[4]*s[5] % 72345 == 0 ならストレヌト、 s[5]==s[9] ならフラッシュずする方法です。

たずfunction table 1を11サンプルず぀なぞるルヌプを曞きたす。 function tableのサンプルを特定のりィンドりを䜿っおなぞるには tab2array opcodeのオプション匕数 istart ず iend を䜿いたす。 それぞれ開始サンプルのむンデックスず終了サンプルのむンデックス+1を指定すればOKです。 こうするこずで返り倀の配列には指定した範囲のサンプルが栌玍されたす。 たたりィンドり䜍眮指定+ルヌプカりンタずしお䜙っおいたinstrumentのパラメヌタ p3 を䜿っおいたす。 CSoundのinstrument定矩内ではscoreからinstrumentに䞎えられるパラメヌタ pn をi型の倉数ずしおあ぀かうこずができたす。 これらを䜿うこずでグロヌバル倉数定矩のための文字数を皌ぐこずができたす。 function tableを特定のりィンドりで区切らずなぞる方法もありたすが、添字郚分が長くなるので採甚したせんでした。

sorta opcodeは配列を昇順に゜ヌトするopcodeです。元の入力デヌタに察しお䞋駄が぀いおいる+笊号付きであるずいう状態ですが、この時点でサンプルが負になるようなケヌスがないこずず、各デヌタに䞋駄が぀いおいおも゜ヌト結果には圱響がないこずからこの凊理だけで芁求を満たしたす。

その埌はデヌタに぀いおいる䞋駄ずオヌバヌフロヌに泚意しながら愚盎に刀定し、結果を出力したす。 刀定結果が停であった堎合もスペヌスを出力しおいるのは、fprintsで空癜文字を出力するような制埡パスがある堎合に起こる問題を回避するためです。以前出力した結果がくっ぀いおしたう堎合がある。凊理系のバグ

Cubix

Green Team (@kotatsugame, 74 bytes)

.o..>F...'.@^^!->i?>1&%S/?\..>Noivq^'p<;-p..^<>.*i>&%o^;S>&q;;^.>v^!'2;<i

GNU ed

Red Team (@angel-p57, 48 bytes)

,s/^\(.\)\(.\1\)*.$/&F
v/\([1-5]\).*\1/s/./S
wq

  • 党行察象のフラッシュ察象行 F 付䞎眮換、吊定マッチのアドレス指定での䞀文字 S 眮き換え、共に正芏衚珟系の蚀語ず共通ず思いたす。
  • 実は sed 45B の実装が把握できず最初は短瞮できおなかったのですが、rotary-o さんが実装を芋぀けられたため ed に適甚できたした。

Blue Team (@hatsusato, 48 bytes)

,s/^\(.\).\(\1.\)*$/&F
v/\([1-5]\).*\1/s/$/S
w
q

Egison

Green Team (@ten986, 368 bytes)

def v z:=match z as multiset char with
|#['1','2','3','4','5']->"S\n"
|_->"\n"
def w z:=match z as list char with
|[$s,#s,#s,#s,#s]->"F"
|_->""
def k z:=match z as list char with
|[$a,$b,$c,$d,$e,$f,$g,$h,$i,$j,_]->appendString(w[a,c,e,g,i])(v[b,d,f,h,j])
def i ():=io(readChar())
def main x:=let s:=[i(),i(),i(),i(),i(),i(),i(),i(),i(),i(),i()]in
do
write(k s)
main 1

Blue Team (@drafear, 151 bytes)

def u l:=length(unique(l))+69
def main n:=do
write(pack(map itoc((\l->[u(take 5 l)+9,u(drop 5 l),10])(sort(map ctoi(unpack(io(readLine()))))))))
main 1

Red Team (@satos---jp, 142 bytes)

def main x:=let s:=unique(unpack(io(readLine())))in
let d q c:=itoc(length(union s(unpack q))+c)in
do
print(pack[d"ABCD"74,d"12345"64])
main 1

uniqがあるので文字皮数を手軜に蚈算できS,F刀定ができる。Stringラむブラリは貧匱なのでpack/unpackによるstring<->list char倉換ずitoc/ctoiによるchar<->int倉換が䟿利。printを䜿うず勝手に改行しおくれる。

Element

Green Team (@EtoNagisa, 44 bytes)

50'[_5'[(,+.(2+"*']"12600=[S`]271%'![F`]\
`]

通垞のスタックず条件分岐に甚いるコントロヌルスタックずいう2぀のスタックをも぀蚀語 Sのほうは2を足した積が2520になればOKずいう方針 Fのほうはordを結合しお271で割り切ればOKずいう方針 入力の文字列の先頭から䞀文字ず぀切り取り結果を入力文字列の埌ろにくっ぀けおいくこずでスタック操䜜の回数を枛らせた コントロヌルスタックをうたく䜿うずrotateが枛らせるrotateは4byteかかるので高すぎる forルヌプはコントロヌルスタックの先頭を芋おその回数だけ繰り返すずいう仕様なのでルヌプの䞭に入ったあずはコントロヌルスタックの先頭は捚おおもいい今回はルヌプスタックの先頭を積を保存するために䜿っおいる

型がガバガバなのでいろいろなこずができるスタックから無を取り出しおも怒られないし無ず挔算をしおも倧䞈倫

Blue Team (@drafear, 58 bytes)

50'[_10'[(,2^4 0@+0 2@#]0 2@13015%83+,#`95%35%25%-70+,#``]

Emojicode

Red Team (@kurgm, 298 bytes)

🏁🍇🔁👍🍇🎶🆕🔡▶👂🏌❗❗➡🖍🆕s🊁s🍇a🔡b🔡➡🔢↩↔a b❗🍉❗↪🎌🆕🔡s🔀🔀❗🔀12345🔀❗🍇👄🔀S🔀❗🍉↪🐜s 5❗🙌🐜s 9❗🍇👄🔀F🔀❗🍉😀🔀🔀❗🍉🍉

敎圢

🏁 🍇
  🔁 👍 🍇
    🎶 🆕🔡▶👂🏌 ❗ ❗ ➡ 🖍🆕 s
    🊁 s 🍇 a🔡 b🔡 ➡🔢
     ↩ ↔ a b ❗
    🍉 ❗
    ↪ 🎌 🆕🔡 s 🔀🔀 ❗ 🔀12345🔀 ❗ 🍇
      👄 🔀S🔀 ❗
    🍉
    ↪ 🐜 s 5 ❗ 🙌 🐜 s 9 ❗ 🍇
      👄 🔀F🔀 ❗
    🍉
    😀 🔀🔀 ❗
  🍉
🍉

擬䌌コヌド

main {
    while true {
        let mut s := String.new_readline().toGraphemesArray();
        s.sort({|a: String, b: String| -> Int
            return a.compareTo(b);
        });
        if String.new(s, "").beginsWith("12345") {
            print("S");
        }
        if s.getAt(5) == s.getAt(9) {
            print("F");
        }
        println("");
    }
}

Emojicodeは構文ずかリファレンスがちゃんず敎備されおいる神蚀語です個人の感想

あたり狙われおいなかったっぜいのでゎルフはしおないです

  • 文字列から盎接むンデックスアクセスはできない。いったん曞蚘玠文字列の配列に倉換する必芁がある
  • 無限ルヌプにしおいるが、最埌は s.getAt(5) のずころで゚ラヌになる。゚ラヌ内容が stdout に出るけど51行目以降が無芖される仕様に救われる

emojifunge

Green Team (@ten986, 512 bytes)

コヌドを芋る
⬜🔀💕❕‵🙃ℹ🙃🔀🙃ℹ🙃🔀🙃ℹ🙃🔀🙃ℹ🙃🔀🙃ℹ🙃📥📀💕📥📏📀✖📥📀💕📥📏📀✖📥📀💕📥📏📀✖📥📀💕📥📏📀✖📥📀❕❕6⃣➕🔟✖🔡2⃣➕5⃣🏗2⃣➕5⃣🏗2⃣➕5⃣🏗2⃣➕5⃣🏗2⃣➕5⃣🏗✖✖✖✖4⃣7⃣9⃣🔟✖✖✖📏®➕🔡🔀🔡0⃣0⃣✎
⬜⬜⬜⬜🔚

盀面䞊争う必芁性が薄かったため、ゎルフしおいない。 第7回の方針をパクっお蚈算を蟻耄合わせたくらい。

Foobar and Foobaz and Barbaz, oh my!

(hiromi_miよりコメント) 蚀語機胜が䞍足し回答䞍胜ず刀断したした。差し替えたした

Fish (pure)

Blue Team (@nakario, 82 bytes)

set b string replace -r
$b 'S(.)(.\1){4}' 'F$0' S(read -z)|$b 'S(.*(\d).*\2)' '$1'

readの-zオプションを䜿うず区切りがnull文字になるので党入力を䞀気にずっおこれる。その呌び出し偎にSを぀けるず最初の行だけでなくすべおの行の頭にSが぀く。これはコマンド呌び出し結果 (read -z) が改行区切りで配列ずしお解釈され、配列は展開時に前埌の隣接する文字を䌎っお展開されるため。 replaceは-qオプションを付けない限り出力もしおくれるのでechoも䞍芁。 RedチヌムのXSLTの手法を取り入れるず77bytesたで瞮んだ。

set b string replace -r
$b '(.)(.\1){4}.*' 'F$0' (read -z)S|$b '(\d).*\1.*' x

Green Team (@kotatsugame, 91 bytes)

set f string match -r
while read s
echo ($f '(\d).*\1|S' "$s"S) ($f 'F(.)(.\1){4}' F$s)
end

F# (.NET Core)

Blue Team (@n4o847, 111 bytes)

let rec f t=let s=Set(stdin.ReadLine())in printfn"%A"("_S"[(s-t).Count/5],"_F"[(t-s).Count/3]);f t
f(set"ABCD")

F# においお string が char seq ずしお扱えるこずを利甚した集合挔算で、OCaml のように各文字コヌドを芋おいく圓初の方針よりも短くなった。

s を入力行の文字集合、t を set ['A'; 'B'; 'C'; 'D'] ずし、s - t (数字) が 5 皮類なら 'S'、t - s (スヌト) が 1 皮類なら 'F' を出力する。

C# 同様、タプルで出力するず少し短い。

Red Team (@sh-mug, 115 bytes)

let rec($)a b=let d=stdin.Read()-2 in d<0||d=8&&(printf"%c%c
"(char(a%41%26*5))(char(b%89+2));1$1)||b$a*d
let _=1$1

Go

Red Team (@rotary-o, 135 bytes)

package main
import."fmt"
func main(){for{s,i:="",0;Scan(&s)
for _,b:=range s{i|=2<<(b%32)}
Printf("%c%c\n",i>>16^47,i&(i-1%i)&60|70)}}
  • 1行ず぀凊理で、1文字ず぀ビット列に保存
  • S、Fずもにビット列で刀定(nu さんのCがベヌス)
  • 終了条件を曞かずに、%iでのれロ陀算䟋倖で終了
  • ビット挔算の優先順䜍が高いようなので括匧を぀けおいる
  • 初めお曞くのでよく分かっおいない(Javaから移怍しただけ)

Blue Team (@drafear, 140 bytes)

package main
import."fmt"
func main(){s:=0;for{a:=0;Scanf("%c",&a);if a==10{s>>=39;Printf(`%c%c
`,114-s%32,70-(s-32)&s>>9);}
s|=1<<(a-10);}}

golfish

Blue Team (@shinh, 57 bytes)

Green Team (@bx4ay, 50 bytes)

(実際はバむナリ)

01 c0 ed ec ff c0 c0 c0  01 c2 01 21 c3 01 12 c3
01 21 18 c3 01 12 c3 01  21 18 c3 01 12 c3 01 21
18 c2 01 12 df dd 11 d7  11 14 05 d7 da 12 10 05
01 05
  • Sの方針数字5぀の文字コヌドの積を233で割った䜙りを出力
  • Fの方針2番目から5番目のアルファベットに぀いお、最初のアルファベットず異なるものがあればG、そうでなければFを出力

GolfScript

Blue Team (@saito-ta, 22 bytes)

n%{$5/{.&,78+}/9-]n+}%

入力の行ごずに、゜ヌトしお、 5 文字ず぀に分けお、それぞれ、文字の皮類を数えお、それに 78 を足す。 埌のほうからはさらに 9 を匕く。するずあら䞍思議。

gs2

Blue Team (@saito-ta, 13 bytes)

゜ヌス

line-mode
sort
5
/
    group
    length
m2
"NE"
    +
z1

やっおいるこずは、すぐ䞊にある GolfScript (22) ずほずんど同じです。

Hanoi_Stack

Blue Team (@n4o847, 2812 bytes)

以前䜜った生成コヌド を䜿甚。ずりあえず通すこずが重芁なため、最初は 50 回のルヌプを愚盎に生成したら、バむト数制限に匕っかかった。むンタプリタにデバッグ機胜を぀けお確認し぀぀、倖偎のルヌプだけちゃんず曞いお提出。その埌赀チヌムに呚囲を取られ、アクセスできなくなった。

2 bytes 以䞊の挔算をしようずするず結果の䞊の方のバむトが倱われるずいうバグ がある。

Red Team (@satos---jp, 204 bytes)

最初に入力が反転しおstackに積たれるのでひっくり返す必芁がある。byte長が2以䞊の挔算がバグっおいるずいう噂を耳にしたが、1byte挔算で事足りるアルゎリズムを䜿った結果それには出くわさなかった。むンタプリタに珟圚のスタックず次の呜什を出力する機胜が欲しい。

Haskell

Green Team (@bx4ay, 76 bytes)

m@main=do f<-filter.flip notElem<$>getLine;print[f"12345S"!!0,f['A'..]!!4];m

main再垰で各行ごずに凊理を行った。

  • "12345S"ず各行の差集合をずっお0番目の芁玠を出力12345が党お含たれるずきSを出力
  • "ABCDEF..."ず各行の差集合をずっお4番目の芁玠を出力ABCDのうち1぀だけが含たれるずきFを出力

Blue Team (@n4o847, 78 bytes)

m@main=do h:x<-getLine;print$['S'|all(`elem`x)"12345"]:drop 3["F"|c<-x,c==h];m

ベヌスは shinh さんが曞いたものを瞮めた。緑チヌムず競い合っおいたが、結果完敗  。行を耇数回䜿う堎合ポむントフリヌにしづらく、do 蚘法でバむンドするのがなんだかんだ短い。

ImageMagick

Red Team (@Muratam, 278 bytes)

convert ( -size 1x1 -depth 8 gray:- ) ( -resize '541x1!' -fx 'sc=0;xa=u[i];xb=u[i+2];xc=u[i+4];xd=u[i+6];xe=u[i+8];rr=u[i];rr=i%11==1&&xa!=xb&&xb!=xc&&xc!=xd&&xd!=xe&&xa!=xc&&xa!=xd&&xa!=xe&&xb!=xd&&xb!=xe&&xc!=xe?.324:rr;i%11==0?(xa==xb&&xb==xc&&xc==xd&&xd==xe?sc:.273):rr' ) -

二幎前に曞いた蚘事のや぀が党然動かなくなっおた...。 蚘事や過去は -resize を埌に曞いおも動いおいたが、前に曞かないず u[i] が意図通り動いおくれなくなっおいた。なぜかこのバヌゞョンのImageMagickはいたるずころがバグっおいお、䞉項挔算子(?:)の分岐が逆になるこずがあったり(は)、倉数宣蚀をするかどうかで結果が倉わったり(は)、䞉項挔算子の䞭で䞉項挔算子を䜿うず結果が宇宙的に倉わったりする。䟋えばi%11==0?(xa==xb&&xb==xc&&xc==xd&&xd==xe?sc:.273):rrはフラッシュ刀定ですが、党郚同じなら無効文字を出すずなっおミスっおるように芋えるが、実はなぜかバグっお䞉項挔算子の逆転が発生するので逆になっお通りたす。sc=0;の定数倀の倉数の利甚も䞍芁に芋えたすが、省略しお盎接倀を曞くず䜕故か結果が倉わるので消せない...。条件匏もだいたい&&で結合するずバグっおうたく動かなくなるので無限に蚀い換えを詊すず通るや぀があっお、それがこのコヌドです。

なんでこんなバグるのか考えたけどきっずみんなImageMagickを画像凊理にしか䜿っおなくお文字列凊理甚途ずしおのImageMagickはたったく保守されおいないんだろうな...。うヌん、たずもに動いおいた2幎前のImageMagickにバヌゞョン固定しおおいたほうがいいですねこれは...。

hiromi_mi远蚘: 今回は v7.1.1-12 が䜿われたした

Version: ImageMagick 7.1.1-12 Q16-HDRI x86_64 21239 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5) 
Delegates (built-in): 
Compiler: gcc (9.4)

IRC

Green Team (@ten986, 689 bytes)

コヌドを芋る
* main has joined #code
* x has joined #code
* y has joined #code
* s has joined #code
* main sets mode: +v x
* main sets mode: +v y
* main sets mode: +v s
* main changes topic to 'a'
<input> Hey, x.
<if> x, are you equal to 0?
* main has quit
<s> I'm 1.
* main changes topic to 'b'
<input> Hey, y.
<s> I'm s times y.
<input> Hey, y.
<if> y, are you equal to 10?
<jump> Let's talk about c.
<if> y, are you not equal to x?
<x> I'm 99.
<jump> Let's talk about b.
* main changes topic to 'c'
<if> x, are you less than 98?
<x> I'm 70.
<s> I'm s divided by 4494.
<output> What's your character, s?
<output> What's your character, x?
<output> What's your character, y?
<jump> Let's talk about a.

@bx4ay さんのコヌドを気合いで瞮めた。ロゞックは分かっおない。 終了は * main has quit IRC (Quit: ) ではなく * main has quit でも行けるらしい。 埌日感想戊で@nu4nuさんによっお*でいいこずも分かった。今埌のコヌドゎルフの定石になりたすね。

Red Team (@satos---jp, 692 bytes)

コヌドを芋る
* main has joined #code
* c has joined #code
* f has joined #code
* s has joined #code
* main sets mode: +v c
* main sets mode: +v f
* main sets mode: +v s
* main changes topic to 'h'
<s> I'm 1.
<input> Hey, f.
<if> f, are you equal to 0?
* main has quit IRC (Quit: )
* main changes topic to 'g'
<input> Hey, c.
<s> I'm s times c.
<input> Hey, c.
<if> c, are you not equal to f?
<f> I'm f times c.
<if> c, are you not equal to 10?
<jump> Let's talk about g.
<c> I'm 83.
<if> s, are you equal to 344362200?
<output> What's your character, c?
<c> I'm 70.
<if> f, are you less than 999?
<output> What's your character, c?
<c> I'm 10.
<output> What's your character, c?
<jump> Let's talk about h.

nu4nuさんから『Egisonが取れたずきにどうぞ』ず蚗されおいたコヌドを提出したもの。 (nu4nu远蚘) 挔算や制埡のコストが高いので短い匏で蚈算する必芁があるnu4nuは最初二乗和==13015のコヌドを曞いおいたが、satos---jpさんに積==344362200の圢に盎しおもらった。labelやjumpを枛らすために改行コヌドの刀定をルヌプ末尟に持っおきおいる。 最埌緑チヌムに(Quit: )の省略で抜かれおしたったが、これ実は*だけの行でもよくお、芁は䜕にもマッチしない行を曞いおむンタプリタを異垞終了させればよい。たた、緑チヌムの4494で割っお盎接文字を出すPHPのchrは256でmodを取ったものを出しおくれる手法を䜿うず、cを発蚀させなくできるので* main sets mode: +v cを消せる。これらを合わせるず以䞋のような609Bのコヌドが埗られる。

609Bのコヌド
* main has joined #code
* c has joined #code
* f has joined #code
* s has joined #code
* main sets mode: +v f
* main sets mode: +v s
* main changes topic to 'h'
<s> I'm 1.
<input> Hey, f.
<if> f, are you equal to 0?
*
* main changes topic to 'g'
<input> Hey, c.
<s> I'm s times c.
<input> Hey, c.
<if> c, are you not equal to f?
<f> I'm f times c.
<if> c, are you not equal to 10?
<jump> Let's talk about g.
<s> I'm s divided by 4494.
<output> What's your character, s?
<s> I'm 70.
<if> f, are you less than 999?
<output> What's your character, s?
<output> What's your character, c?
<jump> Let's talk about h.
⚠ **GitHub.com Fallback** ⚠