비트 눈알


9

타원과 스틱으로 인쇄 된 이진 값을 눈에 띄는 것은 그리 쉬운 일이 아닙니다.이를 돕기 위해서는 사용자 지정 이진 표현으로 숫자를 인쇄하는 함수 (또는 프로그램)를 작성해야합니다.
따라서 3 ( 00000011)과 같은 숫자를 가져 와서 비트를 사용자 정의 형식으로 출력 하려고합니다 ( 예 : 공백으로 구분 된 쌍).

00 00 00 11

또는 반대로, 일부 데코레이터와 반대로, 예를 들어

11_00_00_00

또한 '0'과 '1'을 더 잘 구분하기 위해 사용자 지정 문자로 표시 할 수 있어야합니다. 예 :

XX oo oo oo

따라서 다음 사양과 함께 코드를 작성해야합니다.

사양

함수는 다음과 같은 입력을받습니다 : f (A, mask, zeros, ones)

매개 변수 :

A- 입력 번호-0-255 범위의 (부호없는) 정수
mask- 출력 구성을 정의하는 문자열 매개 변수입니다.
zeros- 길이가 같은 문자열로, 각 출력 슬롯에 대해 'zero'글리프를 정의합니다.
ones- 길이가 같은 문자열은 각 출력 슬롯에 대해 '하나'글리프를 정의합니다.

출력 구성 규칙 :

출력이 어떻게 생성되는지 이해하려면이 이미지를 예를 자세히 살펴보십시오.

여기에 이미지 설명을 입력하십시오

따라서 마스크 의 단일 숫자 만 구문 분석되고 A의 해당 비트로 대체되고 다른 문자는 그대로 남아 있습니다 . 또한, 취해진 비트의 값이 1이면 최종 출력에 "X"로 표시되고 0이면 "o"로 표시됩니다. 위의 예에서 4 개의 촬영 비트는 모두 "1"이므로 모든 슬롯에 "X"가 표시됩니다.

입력 번호가 128 인 경우 논리적으로 출력은입니다 X foo bar ooo. 매개 변수 "0"및 "1"의 문자 : 인쇄 가능한 ASCII 문자는 항상 마스크와 문자 정렬 된 것으로 가정합니다.

참고 사항 :

  • 비트는 0으로 인덱싱됩니다. 0 번째 비트는 MSB입니다.
  • 마스크 문자열에 숫자 8,9가 허용되지 않는다고 가정하십시오.
  • 입력 문자열에는 인쇄 가능한 ASCII 문자가 포함됩니다.
  • 'Zeros'와 'ones'는 마스크와 문자 정렬됩니다.
  • 해당 언어의 특수 문자 / 수정 자 : 입력 문자열에 표시되지 않을 것이라고 가정 할 수 있습니다.

명확성을 위해 더 많은 예제를 참조하십시오.

입력-> 출력 예

일반적인 타원 및 스틱 표기법으로 공백 구분 기호를 사용하여 공통된 순서로 8 비트를 모두 출력합니다.

mask  =  "0123 4567"  
zeros =  "0000 0000"  
ones  =  "1111 1111"  

A=1 ->    0000 0001


대시 및 글리프 표기법으로 역순으로 출력 :

mask =    "| 7654 3210 |"
zeros=    "  ---- ----  "
ones =    "  ssss ssss  "

A=1  ->    | s--- ---- |
A=3   ->   | ss-- ---- |
A=128->    | ---- ---s |


하나의 출력에 다양한 표기법 (예 : 압축 된 데이터의 경우) :

mask =       "0 | 123 4567"
zeros=       "    --- ----"
ones =       "X   kkk ssss"

A= 15  ->       | --- ssss
A= 16  ->       | --k ----
A= 32  ->       | -k- ----
A= 128 ->     X | --- ----
A= 255 ->     X | kkk ssss


반복 패턴 :

mask =    "| 7 66 555 4444 |"
zeros=    "  . .. ... ....  "
ones =    "  0 00 000 0000  "

A= 0 ->    | . .. ... .... |
A= 1 ->    | 0 .. ... .... |
A= 2 ->    | . 00 ... .... |
A= 3 ->    | 0 00 ... .... |
A= 4 ->    | . .. 000 .... |

최신 정보

규칙은 약간 단순화되었습니다. 프로그램은 하나의 숫자 만 인쇄해야합니다 (처음 제안 된 배열 / 숫자 목록은 아님).


우리는 또한 네 가지 입력을 받아들이는 프로그램을 제출할 수 있습니까? 일부 언어는 제대로 작동하지 않습니다.
Stephen

@StephenS 나는 예라고 생각하지만, 나는 그것들을 이해할 것입니다 : /
Mikhail V

2
마지막 두 가지 주장은 대부분의 언어에서 전적으로 관련이없는 것 같습니다. 왜 1과 0 만 요구하지 않습니까? 목록이라는 첫 번째 주장은 일반 언어가 간단한 루프 / 재귀를 추가하는 동시에 더 난해한 언어가 경쟁하기가 훨씬 어려워지는 것 외에는 많은 일을하지 않는 것 같습니다.
FryAmTheEggman 1

@MikhailV 당신이 당신의 도전에 제출, 행운의 모든 이해하려면 : 당신이 그들을 작품을 볼 수 있도록 / 그들 대부분은 TryItOnline 링크를 가지고 있지만, 당신은 그들이 무엇을 알고 때까지 대부분의 골프 언어 넌센스처럼
스티븐

@FryAmTheEggman 또한 A모든 테스트 사례에서 동일하기 때문에 무엇을 이해하지 못합니다
Stephen

답변:


2

자바 스크립트 (ES6), 57 바이트

(A,M,O,I)=>M.replace(/[\d]/g,(d,i)=>(A>>7-d)%2?I[i]:O[i])


2

루비 , 48 바이트

->a,f,*b{f.gsub(/\d/){b[a[55-$&.ord]][$`.size]}}

zeroes 및 ones 매개 변수는 배열 ( *b) 로 취급되며 zeroes 매개 변수는에 저장되고 b[0]ones 매개 변수는에 저장됩니다 b[1].

마스크 매개 변수 f에는 각 숫자 ( /\d/)가 해당 배열의 문자로 대체됩니다. $`현재 일치하는 텍스트를 유지하는 특수 변수 는 여기에서 (ab) 위치 추적을 위해 사용됩니다.

Ruby의 비트 인덱싱은 최하위 비트 0을 호출하지만 챌린지는 0을 최상위 비트로 호출합니다. 55에서 ASCII 빼기 ( '7'문자)는 사용 가능한 Ruby 비트 색인을 생성합니다.

온라인으로 사용해보십시오!


1

펄 6 , 60 바이트

->\a,$_,\o,\z{S:g|\d|{substr (z,o)[a+>(7-$/)%2],$/.from,1}|}

1

파이썬, 97 바이트

lambda A,M,Z,O:"".join([[Z,O][1&(A>>7-int(d))][i] if d.isdigit() else d for i,d in enumerate(M)])

1

Mathematica, 131 바이트

""<>Table[(f/@{##2})[[x[[i]],i]],{i,Length[x=(f=Characters)@#2/.Table[ToString@i->2+Floor[#/2^(7-i)]~Mod~2,{i,0,7}]/._String->1]}]&

Length[x]할 수 Length@x있고 {#2,#3,#4}할 수 있습니다 {##2}.
CalculatorFeline

또한, StringJoin@@단지 수 있습니다 StringJoin@#1단지입니다#
CalculatorFeline

규칙을 약간 단순화했습니다. 업데이트를 참조하십시오.
Mikhail V

1

q / kdb +, 86 64 바이트

해결책:

f:{[A;M;Z;O]@[M;m;:;((-8#0b vs A)"I"$'M m)(Z;O)'m:(&)M in .Q.n]}

예 :

q)f[1;"0123 4567";"0000 0000";"1111 1111"]
"0000 0001"
q)f[1;"| 7654 3210 |";"  ---- ----  ";"  ssss ssss  "]
"| s--- ---- |"
q)f[15;"0 | 123 4567";"    --- ----";"X   kkk ssss"]
"  | --- ssss"
q)f [0;"| 7 66 555 4444 |";"  . .. ... ....  ";"  0 00 000 0000  "]
"| . .. ... .... |"

설명:

입력 마스크 M가 숫자 인 인덱스를 뽑아서 입력 마스크를 m수정할 곳 이라고 부릅니다 . 문자열에서 숫자를 꺼내 정수로 캐스트 한 다음 8 비트 배열로 색인하여 올바른 순서를 갖습니다. 이 8 비트 배열을 사용하여 O(1이 설정된 경우) 또는 Z(0이 설정된 경우)로 색인을 생성 한 다음로 지정된 색인에서이 목록으로 색인을 생성하십시오 m. 마지막 :으로이 새 목록을 인덱스의 원래 마스크에 적용 m합니다.

{[A;M;Z;O]                                                   } / lambda function with 4 parameters
          @[ ; ; ;                                          ]  / apply, applies 3rd parameter to 1st parameter at indexes from parameter 2 with parameter 4 :)
                   (-8#0b vs A)                                / convert input number to binary (64 bit), take the last 8 items
                                              m:(&)M in .Q.n   / returns indices where mask is in "0123..789", stores in variable m
                               "I"$'M m                        / index into mask at indices m, then cast these numbers to an integer array
                  (                    )                       / we then index into our 8 bits a these offsets to get the output order
                                        (Z;O)                  / 2-item list of the zeroes and ones mask
                                             '                 / take each item on the left and right and apply them to (Z;O) (ie index in at 0 / 1 and then 123..67)
            M m :                                              / apply *this* list to M at each index given by m

노트:

다음과 같은 형식으로 인수를 허용하면 14 바이트를 더 줄일 수 있습니다.

[A;M;(Z;O)]

q는 3 개의 인수까지 허용으로 (그들이라는 명시하지 않고 함수로 주어지는 x, yz각각) :

f:{@[y;m;:;((-8#0b vs x)"I"$'y m)z'm:(&)y in .Q.n]}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.