비트 단위로 문자를 세십시오!


19

간단한 부분 : 인쇄 가능한 ASCII 문자 (공백-물결표) 만 포함하는 입력 문자열이 주어지면 각 문자의 발생 횟수를 세고 편리한 형식으로 결과를 반환하십시오. 문자열의 결과는 a%hda7a다음과 같아야합니다 a:3, %:1, h:1, 7:1, d:1. 정렬은 불필요하며 구분 기호 및 형식은 선택 사항이지만 어떤 숫자가 어떤 문자에 해당하는지 쉽게 이해해야합니다. 입력 문자열에없는 문자를 포함해서는 안됩니다 ( a:3, b:0, c:0, d:1, ...OK가 아님).

진짜 도전 :

코드의 모든 문자를 8 비트 이진수 (또는 UTF-16 또는 이와 유사한 형식을 사용하는 경우 16 비트)로 변환하고에서 시작하는 모든 문자를 열거하십시오 0.

모든 문자 ( i열거 자)에 대해 i%7-bit 1 은이어야 합니다 1. 비트는 오른쪽부터 번호가 매겨집니다. 다른 모든 비트는 원하는대로 될 수 있습니다.

다음 코드를 예로 들어 보겠습니다.

[f]-xif)#f

이것을 이진수로 변환하면 아래 배열을 얻습니다. 첫 번째 숫자 (표시 [는 0 번째 1위치에 있으므로 하나는 정상 임) 두 번째 숫자 (표시 f는 1 번째 1위치에 있고 따라서 하나도 OK 임) 계속 진행하면 다음과 같이 표시됩니다 위의 코드가 유효하다는 것을

C 76543210 비트 번호
-------- ----------
[0101101 10   -OK
011001 F 1 0 1 - OK
] 01011 1 01 2-확인
- 0010 1 101 3 - OK
x 011 1 1000 4-확인
I 01 1 01001 5 - OK
F 0 1 100110 6 - OK
) 0,010,100 1   - 0 OK
# 001000 11 1-확인
f 01100 1 10 2-양호

코드를 ]f[-xif)#f다음과 같이 변경하면 다음과 같은 시퀀스가 ​​시작됩니다.

C  76543210  Bit number
-  --------  ----------
]  01011101  0   <- OK
f  01100110  1   <- OK
[  01011011  2   <- Not OK
-  00101101  3   <- OK

보시다시피, 세 번째 문자 [1두 번째 위치에 0이 아닌 인덱스가 없으므로이 코드는 유효하지 않습니다.

테스트 사례 :

Input:
This is a string containing some symbols: ".#!".#&/#

Output:
   !  "  #  &  /  :  T  a  b  c  e  g  h  i  l  m  n  o  r  s  t  y  .
7  1  2  3  1  1  1  1  2  1  1  1  2  1  5  1  2  4  3  1  6  2  1  2

합리적인 출력 형식은 괜찮습니다 (가장 편리한 방법). 예를 들어 다음을 가질 수 있습니다. :7, !:1, ":2, #:3, &:1, /:1, T:1, a:2 ...또는 [ ,7][!,1][",2][#,3][&,1].... 출력은 표준 방식으로 수행됩니다 (기능에서 복귀, STDOUT 등으로 인쇄).

1i 계수 7.


이것은 이므로 바이트 단위의 가장 짧은 코드는 ref이 됩니다.


6
약간의 도움을주기 위해 다음과 같은 n%7자리 에서 사용할 수있는 문자가 있습니다. pastie.org/pastes/10985263/text
TidB

@TidB 웹 사이트가 오프라인인가요 ??
Rod

1
@Rod 그래, Pastie는 문제가있는 것 같다. 대신 pastebin을 사용해보십시오
TidB

1
개행은 00001010입니다. 유용 할 수도 있습니다! :)
Stewie Griffin

1
몇 가지 더 도움이 될하려면 여기 당신이 UTF-8 인코딩에 사용할 수있는 검증 스크립트. 예제와 같이 입력을 문자열로 캡슐화하십시오.
AdmBorkBork

답변:


6

파이크, 1 6 바이트

1cn;1c

여기 사용해보십시오!

1c     - chunk(size=1, input)
  n;1  - noop. 
     c - count(^)

이 코드의 절반은 아무 문제가 없습니다 ...

00110001 - 1
01100011 - c
01101110 - n
00111011 - ;
00110001 - 1
01100011 - c

@EriktheOutgolfer는 유효한 포인트를 가지고 있습니다. Pyke에서 실제로 일반 문자열이 아닌 한이 입력 형식이 유효하다고 생각하지 않습니다. 이후 MATLAB / Octave에서 유효한 입력 문자열 'abc'==['a','b','c']이므로 Pyke에있을 수도 있습니다 ...?
Stewie Griffin

@StewieGriffin Pyke가 일반적으로 문자열을 처리하는 방식이 아닙니다. 그것이 좋지 않으면 입력 형식 전환에 대해 알 수 있지만 문자 목록이 허용되는 기본값 목록 아래에 있지만 이것이 속임수로 간주 될 수 있습니다.
Blue

5
1 바이트 내장으로 도전에 대해 죄송합니다. 실제로 당신이 실제로 미안하다고 생각하지 않으며, 이것으로 도전이 깨지지 않습니다 :-)
Luis Mendo

2
이것은 문자 목록이 아닙니다. 문자열 목록입니다. 문자 목록은 + 17 / -0 이지만 문자열 목록은 + 2 / -2 이므로 허용되는 기본값은 아닙니다. @StewieGriffin이 유효한지 여부를 결정해야합니다.
Dennis

1
@StewieGriffin 더 나은가요?
Blue

6

Pyth, 12 8 7 바이트

@Loovjo 덕분에 -1 바이트

m+d/Qd{
      { # remove all duplicated elements from the (implicit) input
m       # map each element (d) of the parameter (the set from previous operation)
   /Qd  # count the occurrences of d in Q
 +d     # concatenate with d

이진 표현

0110110 1 분
001010 1 1 +
01100 1 00 일
0010 1 111 /
010 1 0001 Q
01 1 00,100 D
0 1 111011 {

여기를보십시오


좋은! : 출력 13에 대한 111이상한 외모,하지만 오해 할 수 없다 (단일 문자가없는 13이 완벽하게 유효 그래서, 1 시간을 사용하는 것을)!
Stewie Griffin

4

Befunge-93, 150 바이트

={<{p+}3/}*77\%*7{7:\+{}{1g}+3/*77\%*7{7:}=:_{}{}={}{}{v#{}{}`x1:~
}-}=*}{2*}97}:<$}={$_v#}!:-*84g+3/*77\%*7{7:}=:}:}+}1{}<_{@#
}{}{}={}{}{}={^.},\={<

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

나는 이것을 정기적 인 Befunge 프로그램으로 작성하기 시작했다. 그런 다음 프로그램의 다양한 문자가 허용 된 위치에만 표시되도록 패딩을 추가했습니다. 이 패딩은 Befunge-93에서 지원되지 않는 명령이 무시된다는 사실에 의존했기 때문에 필요한 위치에 비트가 정렬 된 사용되지 않는 문자 시퀀스가 ​​필요했습니다 (사용 한 시퀀스는 ={}{}{}).

복잡한 비트는 라인 사이의 다양한 가지가 올바르게 정렬하는 데 필요했습니다 (예 : v한 줄의 <화살표는 그 아래 의 화살표 와 정렬되어야 함 ). 브리지 명령 ( #)을 인접한 분기 화살표에서 분리 할 수 ​​없다는 사실로 인해 더욱 복잡해졌습니다 . 처음에는 패딩을 프로그래밍 방식으로 생성하려고 시도했지만 결국 수동 프로세스였습니다.

프로그램의 크기 때문에 전체 문자 분석을 나열하지는 않지만 처음과 끝의 샘플입니다.

= 00111101 0
{ 01111011 1
< 00111100 2
{ 01111011 3
p 01110000 4
+ 00101011 5
} 01111101 6
3 00110011 0
/ 00101111 1
...
{ 01111011 1
^ 01011110 2
. 00101110 3
} 01111101 4
, 00101100 5
\ 01011100 6
= 00111101 0
{ 01111011 1
< 00111100 2

줄 바꿈은 개행 문자로 취급되므로 위치 1 또는 3에 있습니다.


3

MATL , 17 바이트

u"G91x@=zD91x@uRD

개수와 해당 문자를 모두 줄 바꿈으로 표시합니다. 가장 큰 어려움은 @입니다 0b01000000; 나는 그것을하지 않고 할 수있는 방법을 찾을 수 있기를 바랍니다.

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

설명:

u"  % Implicit input. Take (u)nique characters and loop (") over them.
G   % Take the input a(G)ain
91x % Filler: push 91, delete immediately.
@   % Push current character of loop
=   % Check for equality with earlier G
z   % Count number of equal characters
D   % Display
91x % More filler!
@   % Get loop character again
uR  % Filler: two NOPs for the single-character @
D   % Display. Implicitly end loop.

MATL, 15 바이트 (질문 출력)

스택에 두 개의 행 벡터를 남겨 두는 것이 허용되는 경우 ( 메타 게시물에 따른 함수와 유사한 동작 )

u"G91x@=zv]v!Gu

그러나 여기서 출력은 깔끔하게 정렬되지 않았습니다.


스택 내재적 프로그램의 끝에 프린트와 I 번째 방법에 문제가 표시되지 않도록 출력 포맷은, 챌린지에 따라 유연하다
루이스 Mendo

@LuisMendo 확실하지 않습니다. 90 개의 다른 입력 문자가 있으면 어떤 키가 어떤 문자에 속하는지 말하기가 어렵 기 때문에 Sanchises에 대해 No라고 말해야한다고 생각합니다. – 2 시간 전 Stewie Griffin 은 제안 된 하이브리드에 대한 답장 ( 프로그램 종료시 개별적으로 계산 된 Dd Gu)이며 15 바이트 버전이 충분히 다른지 확신 할 수 없습니다.
Sanchises

@StewieGriffin 15 바이트 버전 ( 온라인으로 사용해보십시오! )이 정상인지 여부를 알 수 있습니까?
Sanchises

Stewie가이 포스트에서 핑을 받을지 확신하지 못하고, 도전 포스트를 더 잘 사용하십시오.
Luis Mendo

당신에 대해 모르지만 여기 에서 쉽게 이해할 수 있다고 생각하지 않습니다. :) 17 바이트 솔루션을 선호하지만 15 바이트를 자유롭게 대답하십시오!
그건

1

CJam, 14 바이트

q__|_ @sfe=]zp

여기에서 시도하십시오.

전과 공간 @s공간이 아무것도 안하고는 : 그 후는 ASCII 코드가 필요한 패턴에 맞게 만들어 삽입 필러 문자입니다 s단지 문자열로 문자열을 변환합니다. 그 외에도 도전 과제를 매우 간단하고 간단하게 구현합니다.

q_ "입력 내용을 읽고 복사하십시오";
  _ | "복사에서 반복되는 문자 붕괴";
    _ "축소 된 문자열의 사본을 저장하십시오";
      @ "원래 입력 문자열을 스택의 상단으로 당깁니다";
       s "(여기서 아무것도하지 않음)";
        fe = "축소 된 문자열의 각 문자에 대해 ...";
                 "... 원래 문자열에서 발생하는 횟수";
           ] z "축소 된 문자열의 저장된 사본과 개수를 쌍으로 묶습니다";
             p "결과의 문자열 표현을 인쇄한다";

입력 foobar123의 경우이 코드가 출력 [['f 1] ['o 2] ['b 1] ['a 1] ['r 1] ['1 2] ['2 2] ['3 1]]됩니다. 다음과 같이 단순히 한 줄에 숫자를 인쇄하고 다른 문자에 해당 문자를 인쇄하는 경우 :

[1 2 1 1 1 2 2 1]
fobar123

허용되는 출력 형식으로 간주되는 ]z경우 총 12 바이트 동안 2 바이트를 절약하기 위해 생략 할 수 있습니다 . 예, 단축 된 코드는 여전히 비트 패턴 요구 사항을 통과합니다.

추신. 또한 이 과제에 대한 간단한 소스 코드 검사기 를 작성했습니다. 코드 라인을 입력으로 받으면 먼저 해당 라인을 에코 한 다음 각 문자를 ( n % 7) 번째 ASCII 비트로 교체하여 동일한 라인을 인쇄합니다 . 두 번째 줄이 모두 한 줄이면 입력이 유효합니다.


1

Jelly 코드 페이지에서 6 바이트

ṢZṢṀŒr

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

(문자, 개수) 쌍의 목록을 반환하는 함수입니다. (Jelly는 요소를 연결하여 표준 출력으로 전송되는 경우와 같은 텍스트와 같은 목록을 나타냅니다. 따라서 완전한 프로그램이 아닌 함수로 처리해야합니다. ( 여기 에 일부 코드가 추가 된 동일한 프로그램이 있습니다. 함수를 호출 한 다음 내부 구조를 표준 출력으로 인쇄하여 출력이 모호하지 않은 형식임을 증명하십시오.)

이진 표현 및 설명 :

  76543210 

110 1011011 1    입력 문자 정렬
Z 010110 1 0 목록을 바꿉니다 (1D이므로 목록에 효과적으로 줄 바꿈).
110 10110 1 11 목록 정렬 (하나의 요소 만 있으므로 no-op)
100 1100 1 000 가장 큰 (즉, 유일한) 요소를 취하십시오1 
000 1 0011 2 바이트 명령의 첫 바이트
r 01 1 10010 실행 길이 인코딩

두 번째, 세 번째 및 네 번째 문자는 서로 상쇄되며 필요한 비트 패턴을 유지하기 위해서만 존재한다는 것을 알 수 있습니다. Œr그래도 너무 편리하고 프로그램을 패딩하여 사용할 수 있기 때문에 내장 된 것없이 문제를 해결하려고 시도하는 것보다 짧은 프로그램을 제공 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.