###### tags: `esolang`
# Shared Document for <font color='red'>Red Team</font> in Esolang Codegolf Contest 7
## コンテストページ
https://esolang-codegolf.hiromi-mi.jp/contests/7
## 記号
入力
各行を1文字ずつ区別し
```
a1 a2 a3
b1 b2 b3
c1 c2 c3
```
2進数入力で
```
a
b
c
```
10進数入力で
```
A
B
C
```
X = A+B+C
## ロジックリスト
- `a&b|b&c|c&a` あるいは `(a&b|b&c|c&a)>0`
- `A+B&C|A&B`
- `A+B+C>(A|B|C)`
- x=A+B+C して Σ各桁/2 = x/200+x%100/20+x%10/2 != 0
- iff `(x/200+x/20+x/2)%5 != 0`
- A,B,C:8進数で `A+B+C&146`
- スタック言語ならそのほうが短くなることもありそう
- Xを4進数→10進数変換して X&42
- [探索用コード](https://wandbox.org/permlink/pd6vkZt9uF30Sh1S)
- 16進だと`&546`
- X=ABC(文字列結合を9桁の数字とみなす)
- Xを4進数とみなしてX*4161%172032>0
- `((A+B+C)*34%212&20)!=0`
[探索用コード(wandbox)](https://wandbox.org/permlink/bBjcHVKfZYpGiQhg)
- `(A+B+C)**3%37&11` (11の代わりに27,75,91などでもよい)
- `(A+B+C)**3*35%37>2` bitwise andがない言語にも使える
- `(A+B+C)**3*36%37>1`
- `(A+B+C)**3*68%74>6` iff `((A+B+C)*8)**3%74>6`
- `((A+B+C)**3+1)%37>1`
- `((A+B+C)^34)%35>7`
- `(A+B+C)%66%17%10>1` modだけ
- `((A+B+C)^2)+26&88>0`
- `((A+B+C)+32&90)%5>0`
- ``"a1a2a3b1b2b3c1c2c3" =~ .*1..1.*|.*1.....1.*``
- ``"c1c2c3a1a2a3b1b2b3c1c2c3" =~ .*1..1.*``
- ``"a1a2a3b1b2b3c1c2c3" * 2 =~ .*1..1.*``
- (A+B+C)=~/[23]/
- `(146-a1-b1-c1)*(146-a2-b2-c2)*(146-a3-b3-c3) < 1 ? 1 : 0`
- `><>` で使用した。スタックベース向き。
- 改行も146から引いていって、116が来たら出力、が可能
- `(2-a1%4-b1%4-c1%4)*(2-a2%4-b2%4-c2%4)*(2-a3%4-b3%4-c3%4) < 1 ? 1 : 0`
- 0は48、1は49なので、%4すると0,1になる(%2でないのは、改行(=10)でも同じ演算をしていて、0になってほしくないため)
- 特別な事情がなければ%2でOK
- 1行分のテキスト(32ビット)をリトルエンディアンの整数として読み込んだものをx,y,zとして`(x&y|y&z|z&x)^0xA303030`
- 先頭が0の行は8進数、1の行は10進数で読み込んだA,B,Cについて
- `A+B&C|A&B` はOK
## テクニック
- 入力など長めの関数を3回繰り返す場合、rとかの別名を付けておくと、だいぶ縮む
## 未提出回答, 予測回答一覧
### gs (16)
```
~]3/{.~++\~||>}%
```
### go (129)
```go
package main
import."fmt"
func main(){a,b,c,s:=0,0,0,Scan;for{n,_:=s(&a);s(&b);s(&c);if(a+b)&c|a&b!=0/n{Print(1)}else{Print(0)}}}
```
### Octave (43)
```
disp(bitand(sum(scanf("%x",[3,16])),546)>0)
```
### ><> (30)
```
''::'!'\~**1(n
-;?(0:i}/?=3:
```
https://tech-unlimited.com/escape-unicode.html で 、\u0092で146に対応する2byte文字を取得
編集モードから取得した方が早い
### Compile Time Typescript (176)
```
type S<X,Y=``>=X extends`${infer A}
${infer B}
${infer C}
${infer R}`?S<R,`${C}${A}${B}${C}`extends`${infer a}${100|101|110|111}1${infer b}`?`${Y}1`:`${Y}0`>:Y
export default S
```
### sed (25)
```
h;N;N;G;/1...1/c 1
/0/c 0
```
※現行より負けてるけど
### ExchangeIF (未定)
※ロジックのみ設計、変数は適当にアドレスを割り当てる。処理項番の枝番は、順序不定で良いものを表す
```
1 . b=2
2-1. z=4
2-2. s1=147
2-3. s2=147
2-4. s3=147
3 . i1=getc() <- eof時は停止
4 . i2=getc()
5 . i3=getc()
6 . d=getc()
7-1. s1-=i1
7-2. s2-=i2
7-3. s3-=i3
7-4. z-=b
8 . goto 3 if z>=0
9-1. s1/=b
9-2. s2/=b
9-3. s3/=b
10-1. s1*=s2
10-2. s1*=s3
10-3. c=49
11 . c-=s1
12 . putc(c)
13 . goto 2 if b>=0
```
ウソjpegへ変換するテキトーツールruby … は、コンテスト終了後のWriteUpに内容掲載済み
### Erlang (126)
1行目は空行
```
f()->{_,[A,B,C]}=io:fread("","~d
~d
~d
"),io:write(if A+B+C>A bor B bor C->1;1>0->0 end).
main(_)->[f()||_<-lists:seq(1,16)].
```
## 提出済み
### Ada (改行を消して181)
```
With Ada.Integer_Text_IO;
Use Ada.Integer_Text_IO;
procedure t is
X,Y,Z:Integer;
begin
loop
Get(X);Get(Y);Get(Z);
Put(Boolean'Pos((X+Y+Z)**3*35 mod 37>2));
end loop;
end;
```
https://ideone.com/iXrCSt ※空白一杯入るのマズければPut(X,1)みたいにすれば良いはず
### hack
```
<<__EntryPoint>>
function a(){$r="readline";while($a=$r()+$r()+$r()){echo$a**3%37&11?1:0;}}
```
### Whitespace (134)
```
mark MAIN
push 0
call READ
call READ
call READ
call DIGIT
call DIGIT
call DIGIT
mark POST
puti
jump MAIN
mark READ
dup
dup
geti
retr
add
ret
mark DIGIT
push 10
push 1
dup
copy 3
copy 3
mod
sub
jneg POST
pop
div
ret
```
※独自アセンブリで書いたバージョン
### jq (41)
```
.+input+input+.|match("1..1")//0|length/4
```
### Tcl (118)
```
while {[gets stdin x]>0} {set t "set x \[expr 4\$x+1\[gets stdin\]\]"
eval $t
eval $t
puts [string match *\[23\]* $x]}
```
### Brainfuck (99)
```
+[>>+>>+>
+++[-
<[
,[-<+>]+
<<]
>>>>>>,>]
<+[
[-
<[>[->>]<[>++++>]<<-]
>[-[>>>>+<]]
<<]
>>-[----->+<]>---.
<]
>]
```
### PHP (62)
```
<?php
$r=readline;while($a=$r()+$r()+$r())echo$a**3%37&11?1:0;
```
### Wren (120)
```
import"io"for Stdin
while(1){
var a=0
for(j in 0..2)a=a+Num.fromString(Stdin.readLine())
System.print((a^34)%35>7?1:0)
}
```
### Compile time C++(clang) (本体は`#include<iostream>`の下からinの上まで 空白改行を除いて547bytes(現行最短+184))
```
#include <iostream>
template<int I>struct A{
char V[I];
};
template<int I>
std::ostream&operator<<(std::ostream&o,A<I>a){
o<<a.V;return o;
}
template<int...I>struct q{};
template<int N,int...I>struct e:e<N-1,N-1,I...>{};
template<int...I>struct e<0,I...>:q<I...>{};
template<int N,class T,int...I>
constexpr A<N+1>l(char c,T s,q<I...>){return{{c,s.V[I]...}};}
template<int N=16>
constexpr A<N+1>f(const char*const x){
return l<N>((146-*x-x[4]-x[8])*(146-x[1]-x[5]-x[9])*(146-x[2]-x[6]-x[10])<1?'1':'0',f<N-1>(x+12),e<N>{});
}
template<>
constexpr A<1>f<0>(const char*const){return{};}
constexpr const char* in = "100\n010\n001\n000\n101\n000\n011\n011\n000\n100\n100\n101\n011\n100\n100\n101\n010\n001\n011\n100\n000\n000\n001\n011\n010\n100\n110\n110\n000\n101\n111\n100\n000\n000\n111\n000\n100\n100\n100\n010\n010\n100\n000\n001\n010\n100\n100\n000";
constexpr auto out = f(in);
int main(){
std::cout << out;
return 0;
}
```
### プロデル (74)
```
16回繰り返
a=0
『a=コンソールから受け取*8+a』を3回繰り返
+(a^3%74>6)を報告
```
### Husk (24)
```
m( 以下の関数を適用
s int to str
± 01に変換
n20 bit-wise and 20
%212
*34
Σ リストのsum
mr 3つの文字列をそれぞれ10進数としてintに変換
)
C3 リストを3つずつに分割
¶ 入力を改行で分割
```
### Csound (428)
```
<CsoundSynthesizer> ; ここの改行は必要
<CsInstruments>
sr=1 ; この2行はおまじない
kr=1 ;
instr 1
iA tab_i p4,1 ; 変数名の1文字目が変数の型を表す?
iB tab_i p4+1,1 ; p4は第4引数
iC tab_i p4+2,1 ; `tab_i x, i` によりi番目のtableから空白や改行区切りでx番目の10進数を読み込む
aN=-30208 ; 何故かいったん変数に代入しておく必要がある
iI=32767 ; '\n' これを出力しないとたぶんNULL文字が代わりに出てしまう(なぜ?)
iX=((iA+iB+iC)#34)%35>7?-20224:-20480 ; 例のロジック。#はxor
iR ftgen 2,0,32,-7,iX,1,iX,0,iI,1,iI,0 ; 出力を矩形波に整形。最後のiIは後で使うが本当に必要かは不明
aR osciln 1,1,iR,3 ; 出力を音声信号に変換
kR vaget 0,aR ; たぶん現在出力中の音の値をとってきている
if(kR==iI)then ; 0/1を出力し終わったら:
out aN
if(p4>47)then
event"e",1,0,0 ; exit
else
event"i",1,0,128,p4+3 ; 再帰
endif
else
out aR ; 音声を出力
endif
endin
</CsInstruments>
<CsScore>
f 1 0 0 -23 "input.in" ; 入力をGEN23(?)で解析し1番目のテーブルにset
i 1 0 128 0
</CsScore>
</CsoundSynthesizer>
```
### Functional()(326)
※改行・空白除去前コード
```
0,1,=,:,V,F,R,W,E,
V(L,F(u)(
V(t,=(E(),0))(L)(u,t(u)())
)),
V(D,F()(
1(R(),R(),R(),R(),
R(),R(),R(),R())
)),
V(G,F(P,T,o,2,3,4,5,6,7,8,9,a,b,c,d)(
P(T(o(2,6,a),o(3,7,b),o(4,8,c)))
)),
L(F()(
G(
F(x)(W(x),W(0),W(0),W(0),W(1),W(1),W(0),W(0)),
F(x,y,z)(x(1,y(1,z))),
F(x,y,z)( x(y(1,z),y(z,0))),
D(),D(),D(),D(),D(),D(),D(),D(),D(),D(),D(),D()
)
))
```
### Nim(ライブラリ解禁前)(100)
```
while 1>0:(var A,B,C=stdin.readLine;A&=B&C&A;var x='0';for i in..8:x=max(x,min(A[i],A[i+3]));echo x)
```
### Nim(解禁後)(76)
```
import re
while 1>0:(var A,B,C=stdin.readLine;echo int(A&B&C&A=~re".*1..1"))
```
### TSP (681)
人力セールスマンの結果。`#`が訪れるべき点、そばに数字があるものはコード上の歩数がその数値に一致する必要がある。
このmapは[このコード](https://gist.github.com/nakario/b46f3e43e6cdbaeb63e6579bd8a46309)で出力した。
```
| #
|
|
| #
|
|
|
2 # |
2 # | ##
4 # | ##
|
4 # |
| #
3 #| #
3 #|
5 #|
3 #| #
3 #|
|
# | #
# # # | #
# # |
## # |
# # ### # ### | 48
# ## | 3 3 145 3 #
# ### | # # # ## #
--------------------------#--------------------49---3
|
# | #
| #
|
|
| #
# | ###
28 | #
| #
| ## #
|
| #
| ##
|
|
25 #|
|
|
|
|
15 #|
|
|
4 # |
|
|
4 # |
DDW$
WWWWW$
DDDDW$
AAWWW$
WWW$
WAA$
WWWDD$
D$
W$
D$
WWWWWAAAA$
WWW$
AASSSSSSS$
AA$
DDS$
AA$
DDS$
AAAD$
SSDA$
DSS$
SDA$
SDADA$
SDA$
SDA$
AAAAAAAAAAAAAAAAASS$
DS$
DDDD$
DDD$
S$
AAA$
AAAAAS$
A$
AAAAAAAS$
DDD$
DDDD$
D$
D$
DDD$
DDDDDDDD$
D$
W$
DS$
S$
S$
A$
W$
AS$
WAA$
S$
AAAAAAAAAAAASSS$
WWA$
DDDDDDDDDDDDDDDDDDDSSSSSSSDA$
SSSSSSSSSSSSSSD$
SSSA$
DDS$
SSAA$
DDW$
WWWWWWWWWWAWSWSWSWSWSWSWS$
DDDWWW$
D$
WA$
DDDDDWW$
AAAA$
A$
W$
DW$
W$
D$
D$
WA$
DDDDDDDDDDDDDDDDDDDDDWWW$
WAAA$
WWW
AAAAAAAAAAAAAAAAAAAAAAA
DDDDDDDDDDDDDDDDDDDDDDD$
DWS$
DDD$
WA
AAAAAAAAAAAAAAAAAAAAAAA
DDDDDDDDDDDDDDDDDDDDDDD$
SSA$
AAAAW
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$
AAAAS$
AAW$
AAAAAAAAAAAAAAS$
```
### Lua (65)
```lua
::a::r=io.read X=r()+r()+r()io.write(X^3*68%74>6 and 1or 0)goto a
```
### TeX (235)
```
\let\m=\multiply\let\v=\advance\let\n=\newcount\n\x\n\y\n\i\i=0\loop\ifnum\i<16\read0to\a\read0to\b\read0to\c\x=\a\v\x\b\v\x\c\y=\x\m\x\y\m\x\y\m\x35\y=\x\divide\y37\m\y37\v\x-\y\immediate\write16{\ifnum\x>2 1\else0\fi}\v\i1\repeat\end
```
### Aheui (92)
```
밥밣따북처흐뭉저두벅
뿌떠벍벌뽀터어볻러포
방방방다다빠빠따따또
```
同じマス数なら行数が少ないほうがいい(それはそう)
### Ascii Dots(53)
```
%$A
.->*#?{+}{+}-{x}-{%}{>}$#A
A-/\#?-*#?*#34*#35*#7/
```
### VB.NET (117)
```
Module P
Sub Main
Dim x=0,a=Sub()x+=Console.ReadLine
a
a
a
Console.Write(-(x^3*36Mod 37>x\x))
Main
End Sub
End Module
```
+(True)が-1で解釈されてびっくりしちゃった
無引数関数は()いらないってまじ?すげ~~
## Sample Input/Output
```
100
010
001
000
101
000
011
011
000
100
100
101
011
100
100
101
010
001
011
100
000
000
001
011
010
100
110
110
000
101
111
100
000
000
111
000
100
100
100
010
010
100
000
001
010
100
100
000
```
```
0011110111101101
```
## Checker
Usage:
```
./a.out < in.txt | ./checker in.txt
```
- checker
```python
#!/usr/bin/env python3
import sys
def solve(grid):
ret = []
for gridi in grid:
for i in range(3):
if gridi[0][i]+gridi[1][i]+gridi[2][i] >= 2:
ret.append(1)
break
else:
ret.append(0)
return ret
iptfile = sys.argv[1]
grid = [None]*16
with open(iptfile, mode='r') as ipt:
iptgrid = [list(map(int, list(line[0:3]))) for line in ipt.readlines()]
for i in range(16):
grid[i] = iptgrid[3*i:3*(i+1)]
ans = solve(grid)
ret = []
while True:
try:
ret += list(map(int, list(input())))
except EOFError:
break
for i in range(16):
if ret[i] != ans[i]:
print(f'Incorrect answer at case {i+1}: {grid[i]}', file=sys.stderr)
print("Done")
```
## プログラム置き場
### <>< から golfish に変換
```c
#include <stdio.h>
int main (void)
{
while (char c = getchar()) {
// special
if (c == '\n') putchar(0x80); else
if (c == ' ') putchar(0x00); else
// in/out
if (c == 'i') putchar(0x01); else
if (c == 'n') putchar(0x06); else
// arithmetic
if (c == '+') putchar(0x10); else
if (c == '-') putchar(0x11); else
if (c == '*') putchar(0x12); else
if (c == ',') putchar(0x13); else
if (c == '%') putchar(0x14); else
// compare
if (c == '=') putchar(0x20); else
if (c == '(') putchar(0x22); else
if (c == ')') putchar(0x24); else
// stack
if (c == ':') putchar(0xC0); else
if (c == '~') putchar(0xC1); else
if (c == '}') putchar(0xC5); else
if (c == '{') putchar(0xC6); else
// numeric
// Note: 'bcdef' of <>< have no corresponding characters in Golfish
if (c >= '0' && c <= '9') putchar(c - '0' + 0xD0); else
if (c >= 'a' && c <= 'f') putchar(c - 'a' + 0xDA); else
// flow
if (c == '>') putchar(0xE0); else
if (c == '<') putchar(0xE1); else
if (c == '^') putchar(0xE2); else
if (c == 'v') putchar(0xE3); else
if (c == '/') putchar(0xE4); else
if (c == '\\') putchar(0xE5); else
if (c == '|') putchar(0xE6); else
if (c == '_') putchar(0xE7); else
if (c == '!') putchar(0xEC); else
if (c == '?') putchar(0xED); else
if (c == ';') putchar(0xFF); else
// exception
if (c == EOF) break; else
fprintf(stderr, "unknown token: %X\n", c);
}
return 0;
}
```