트윗의 Binary Tetris


16

최근 140 바이트테트리스 구현에 대한 웹 사이트 프로그래밍 에 대한 몇 가지 소문이 있었습니다. ...

비록 작지만 Tetris의 단순화 된 버전이며 완전한 구현조차도 아닙니다. 핵심 논리 함수 만 140 바이트의 Javascript에 맞습니다. 실제로 실행하려면 ~ 840 자 이상의 HTML이 필요합니다.

우리는 더 잘할 수 있습니다!
이 과제는 가능한 한 적은 수의 트윗으로 "Binary Tetris"의 전체 버전을 구현하는 것입니다.

이진 테트리스 규칙 :

  • 프로그램은 최소 5 개의 열과 6 개의 행의 셀이 포함 된 경기장을 표시해야합니다.
    • 필드의 블록 및 가장자리가 명확하게 표시되는 한, 임의의 디스플레이 방법이 사용될 수있다.
  • 적어도 두 가지 유형의 블록이 있어야합니다 : ###. ###L과 같은 블록 또는 앵글 블록 과 같은 추가 블록 지원 은 나에게 호의를 표할 것입니다.
  • 새로운 행이 맨 위 행의 필드에 추가되고 하나의 블록 셀이 가운데 열을 차지해야합니다.
  • 블록은 고정 된 속도로 맨 아래 줄을 향해 내려갑니다. 사용자 입력 없이도 블록이 내려 와야합니다.
  • 블록이 필드의 하단이나 아래쪽 블록에 닿으면 떨어지지 않고 제자리에 고정됩니다. 새로운 블록이 추가됩니다.
  • 행의 모든 ​​열이 블록으로 채워지면 행이 비워지고 위의 모든 고정 블록이 한 행 아래로 내려갑니다.
  • 프로그램은 키 누르기에 응답해야합니다. 다음 기능을 수행하는 3 개의 고유 키가 있어야합니다.
    • 현재 블록을 1 열 왼쪽으로 이동
    • 현재 블록을 오른쪽으로 1 열 이동
    • 현재 블록을 1 행 아래로 이동
  • 각 트윗에는 140 자만 사용할 수 있습니다. 트윗에 넣을 수있는 멀티 바이트 문자 사용이 허용됩니다.
  • 트윗에있을 수있는 규칙은 간단합니다. 당신이 그것을 트윗 할 수 있다면 당신은 그것을 사용할 수 있습니다.

  • 해석 된 언어는 동일한 규칙을 따릅니다. 각 섹션은 사양을 따라야합니다. 런타임 오류가 발생하지 않고 나머지는 사양에 따라 유효한 한 귀하의 답변은 유효한 골프 규칙입니다.
    원래 구현은 "트위터 가능"하기 때문에이 과제는 동일합니다. 출품작은 일련의 트윗 (140 자 이하)으로 전송 될 수 있어야합니다.

  • 첫 번째 트윗에는 컴파일러 / 인터프리터 이름, 프로그램 이름 및 명령 줄 인수가 포함되어야합니다.

    • "P0"파일로 저장됩니다
  • 다음 N 트윗은 프로그램을 일련의 라인으로 포함해야합니다.
    • 각 트윗은 이름이 T <n> 인 파일에 저장되며, 여기서 n은 1입니다.
  • 각 줄은 이전 줄에 추가되고 컴파일되거나 해석됩니다. 유효한 오브젝트 파일 또는 프로그램을 생성해야합니다.
  • 마지막 줄이 추가 될 때까지 프로그램이 작동하지 않아도됩니다.
  • 프로그램은 다음과 같은 방식으로 실행됩니다 (의사 bash).

    interp,prog,args = split P0 /\s/ 
    touch $prog
    for file in ./T* do
      cat $prog file > $prog
      $interp $prog $args
      die("FAIL") if $? #detect error
    done
    

    인터프리터는 테트리스를 아직 구현하지 않은 일반적으로 사용 가능한 실행 가능 프로그램이어야합니다.

채점 :
P0을 포함한 가장 작은 트윗. 가장 많은 수의 스페어 문자 (140 * num tweets-총 문자 수)로 묶인 넥타이.

예제 항목

chrome a.htm
<html><div id="output"></div></html>
<script>cool java script here</script>

점수 = 3 (334 스페어)

cc a.c ;a.out
main(){/*cool prog here*/}

점수 = 2 (241 예비)

tetris

합법적이라면 점수 = 1 (예비 134) , 그렇지 않은 경우

특별한 감사

Ashelly의 동의를 얻어 여기 에 게시 할 수있었습니다.


트윗에는 UTF-8 문자가 포함될 수 있습니다. CJK 문자를 사용하여 하나의 트윗에 400ish 바이트를 넣을 수 있습니까?
Robert Fraser

@RobertFraser 트윗에 입력하여 보내 주시면 예
Christopher

트윗에 들어갈 수있는 것이 게임 인 경우, 각 "트윗"내에 개행을 줄 수 있습니까? 트윗 내에서 줄 바꿈이 허용됩니다.
notjagan

@notjagan 예. 그것은 당신이 그것을 트윗 수 있습니다 당신은 그것을 할 수 있습니다
크리스토퍼

2
도전이 그렇게 될 경우, 트윗에 허용되는 문자 시퀀스의 정확한 사양을 포함해야합니다.
feersum

답변:


8

Python 3, 5 개의 트윗 점수 (242 개의 예비, P0 계산)

테트리스 프로그램 데모 (게시 된 버전보다 약간 더 부드럽게)

Jonathan Allan 덕분에 -19 바이트 !

스페어 수는 트윗 사이의 줄 바꿈을 고려하지 않습니다.

트윗 1 (선언, 12 바이트)

python3 t.py

트윗 2 (70 바이트)

import msvcrt as m,os;f=c=s=0;a=34636833;r=range;p=1<<32;t=30
while 1:

트윗 3 (129 바이트)

 if m.kbhit()and b"\xe0"==m.getch():p=[p>>(not(a|f<<1)&p),p,p<<(not(a<<4|f>>1)&p),p>>5-5*(bool(f&p>>5)or p<t)][ord(m.getch())-77]

트윗 4 (113 바이트)

 c+=1;print("\n".join("".join(".#"[1&(f|p)>>i*5+j]for j in r(5))for i in r(6))[::-1]);os.system("cls")
 if c%t<1:

트윗 5 (134 바이트)

  if f&p>>5or p<t:s=~s;f|=p;p=2-s<<26
  else:p>>=5
 for i in r(0,t,5):
  if f|31<<i==f:b=bin(f)[2:].zfill(t);f=int(b[:-i-5]+b[t-i:],2)

풀 프로그램 (449 바이트)

import msvcrt as m,os;f=c=s=0;a=34636833;r=range;p=1<<32;t=30
while 1:
 if m.kbhit()and b"\xe0"==m.getch():p=[p>>(not(a|f<<1)&p),p,p<<(not(a<<4|f>>1)&p),p>>5-5*(bool(f&p>>5)or p<t)][ord(m.getch())-77]
 c+=1;print("\n".join("".join(".#"[1&(f|p)>>i*5+j]for j in r(5))for i in r(6))[::-1]);os.system("cls")
 if c%t<1:
  if f&p>>5or p<t:s=~s;f|=p;p=2-s<<26
  else:p>>=5
 for i in r(0,t,5):
  if f|31<<i==f:b=bin(f)[2:].zfill(t);f=int(b[:-i-5]+b[t-i:],2)

일부 악의적 인 비트 해킹을 수행하고 필드와 조각을 두 정수로 저장합니다. 곧 설명을 게시하겠습니다.

참고 : 이것은 Windows에서만 실행되지만 msvcrtgetch"cls"→를 통해 Linux로 전환 할 수 있습니다 "clear". 또한 문자 입력은 Python의 IDLE에서 작동하지 않으므로 다른 곳에서 실행하는 것이 좋습니다.


와아! 이 짧은
크리스토퍼

1
잘 했어. \xe04 개의 바이트없는 한 트윗 3 (130) 당신이 놓친 것 같습니다해야한다, 그래서 time.sleep(.1);c+=1다시 트윗 4에서와 순서 (순서 변경은 의도적 인 경우 나도 몰라)를 변경하고 \n는 134이어야한다, 그래서 한 두 바이트 아니다 .
조나단 앨런

1
... sleep내 컴퓨터가 없으면 재생할 수있는 것처럼 보입니다 .
Jonathan Allan

1
테스트 c%10<1하고 제거 할 수도 있습니다 c=0.
Jonathan Allan

1
@JonathanAllan 제안 해 주셔서 감사합니다! 이 게시물을 게시 할 때 조금 서두르므로 트윗을 나누는 데 다소 부주의 한 것 같습니다.
notjagan

3

자바 스크립트 (4 Tweets / 343317 bytes / 243 spare)

헤더 및 트윗 형식의 요구 사항에 대해 잘 모르므로 수정이 필요한지 조언하십시오. 그래도 조금 더 면도 할 수 있습니다.

트윗 1-P0 (11 바이트)

chrome a.js

트윗 2 (82 바이트)

a=y=z=j=0,onkeyup=b=>R((k=b.keyCode-40)?z*2*(d=k+3?k+1?1:.5:2)&65|j*d&a||(z*=d):0)

트윗 3 (126 바이트)

R=d=>{d||(!(!y||a&j>>5)||(y>25?a=0:(31^31&(a|=j)>>y||(a=a>>y+5<<y|a&-1>>>-y-5>>5),y=0)),y-=5),y>=0||(y=30,z=12/(new Date%3+1))

트윗 4 (98 바이트)

j=z<<y;for(o="",i=30;i--;)o+=1<<i&(a|j)?"#":"_",o+=i%5?"":"<br>";O.innerHTML=o},setInterval(R,300)

JSFiddle에서 실행하십시오 : https://jsfiddle.net/CookieJon/7Lenhcge/

키보드 출력에 대한 초점을 제공하려면 출력 창을 클릭하십시오.


질문에 부분적으로 완료되었거나 잘못된 답변을 게시하지 마십시오. 당 이 메타 논의 는 질문에 설명 된 사양을 준수 할 때까지이 답변을 삭제해야합니다
PunPun1000

@ PunPun1000 사과드립니다. 이제 완료 및 삭제 취소되었습니다.
Bumpy

문제 없습니다. 다운 보트를 제거하겠습니다. PPCG에 오신 것을 환영합니다.
PunPun1000
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.