모든 문자열을 출력


34

문자 세트가 주어지면 해당 문자로 만들어진 모든 문자열을 출력하십시오. (이 세트의 Kleene 별 입니다.) 예를 들어 for {'a','b'}의 문자열은 다음과 같습니다.

'', 'a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', ...

입력 : 비어 있지 않은 고유 문자 모음 a..z. 이들은 문자 또는 단일 문자 문자열 일 수 있습니다.

출력 : 해당 문자의 모든 문자열을 순서없이 순서대로 반복합니다. 문자 목록을 문자열로 사용할 수 있습니다.

이것은 무한 목록이므로 다음과 같이 출력 할 수 있습니다.

  • 점점 더 많은 문자열을 영원히 쓰는 중입니다. 이 문자열은 플랫으로 구분 된 형식으로 작성할 수 있습니다. 즉, 각 문자열이 끝나는 위치를 알 수 있지만 문자열은 그룹으로 세분화되지 않습니다.
  • 숫자 n를 입력으로 취하고 첫 번째 n문자열을 플랫 분리 형식으로 출력
  • 생성기 객체에서 각 문자열을 차례로 생성
  • 무한한 물건 만들기

일부 문자열에 도달하지 않고 세트에서 무한히 많은 문자열을 생성 할 수 있으므로 메소드는 결국 출력에서 ​​모든 문자열을 생성해야합니다.

에 의해 출력 되지 않을 수 있습니다

  • n주어진 문자열을 생성n
  • 주어진 문자열이 세트에 속하는지를 결정하는 멤버쉽 오라클 제공

빌트인은 허용되지만, 유권자들에게 빌트인을 주로 사용하는 것보다 작업 자체를 구현하는 답변에주의를 기울 이도록 요청합니다.


@Cyoce 무슨 뜻인지 잘 모르겠습니다. 문자열을 분리해야한다는 것을 분명히 했으므로 빈 문자열을 아무 것도 말할 수 없습니다.
xnor

"N이 주어진 N 번째 문자열 생성"이 허용되지 않는 이유를 설명하십시오.
CalculatorFeline

4
@CatsAreFluffy 판결 전화였습니다. 나는 Nth 문자열을 생성하는 것이 대안에 비해 너무 쉬우 며 특히 일부 언어에는 임의의 기본 변환이 내장되어 있기 때문에 도전을 덜 흥미롭게 만듭니다. 또한 무한 세트를 쿼리하는 것이 아니라 생성하는 아이디어를 포착했다고 생각하지 않았습니다.
xnor

"무한 대상 생성"을 설명 할 수 있습니까? 예를 들어 프로그램이 완료되지 않아 출력이 생성되지 않더라도 예를 들어 각 문자열을 스택으로 푸시하고 (스택 언어의 경우) "영원히"실행되도록 할 수 있습니까?
Luis Mendo

@DonMuesli 스택에 출력이 그러한 언어에 허용되는 출력 방법입니까? 그리고 스택에는 언제든지이 문자열 만 포함됩니까?
xnor

답변:


26

파이썬 2, 53 56

그것을 실현 한 후 -3 yield x식으로 사용할 수 있습니다.

def f(s):yield'';[(yield w+c)for w in f(s)for c in s]

에 한 바이트는 짧은,하지만 시작 'aa'이 아니라에서 '': S=lambda s:(c+w for f in[str,S]for w in f(s)for c in s). 빈 입력에도 작동하지 않습니다.
orlp

20

하스켈, 24 바이트

f s=[]:[b:a|a<-f s,b<-s]

무한 목록을 생성합니다.

*Main> f "abc"
["","a","b","c","aa","ba","ca","ab","bb","cb","ac","bc","cc","aaa","baa","caa","aba","bba","cba",…

너무 (:)<$>s<*>f s나쁘면 순서가 잘못 될 것입니다. 있다 f s="":(flip(:)<$>f s<*>s)그러나 그것은 더 이상이다.
xnor

네. 에 없는 f s=[]:(f s<**>map(:)s)것을 제외하고 23 바이트를 찾았 <**>습니다 Prelude.
Anders Kaseorg

11

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

function*g(s){yield'';for(let r of g(s))for(c of s)yield c+r}

@feersum의 Python 생성기 포트. 이 let필요하다. 배열 이해를 사용하여 2 바이트를 절약하십시오 (ES7 제안에 실패했지만 Firefox 30-57에서 작동 함).

function*g(s){yield'';[for(r of g(s))for(c of s)yield c+r]}

n위 생성기에서 생성 된 첫 번째 요소 를 리턴하는 73 바이트의 대체 버전 :

(s,n)=>Array(n).fill('').map(g=(r,i)=>i--?g(r+s[i%l],i/l|0):r,l=s.length)

JS에는 발전기가 있습니까? : 0000000
고양이

10

매스 매 티카, 32 31 바이트

Do[Echo/@#~Tuples~n,{n,0,∞}]&

편집하다:

CatsAreFluffy가 1 바이트를 폐기했습니다.


8

펄, 39 37 35 바이트

(먼저 이전 버전을 설명합니다. 새로운 짧은 프로그램이 끝났습니다)

에 +3 포함 -alp

STDIN에서 일련의 문자로 실행 perl -alp kleene.pl <<< "a b c"

kleene.pl (이 버전은 34 + 3 바이트입니다) :

$#a=$"=","}for(@a){push@a,<{@F}$_>

STDIN의 문자 사이에 쉼표를 이미 입력 한 경우에는 +2를 추가하십시오 -F( -a입력 문자 사이에 공백이 없으면 내재적 삭제 , 또는 -6 ( @a=""이전 에만 })).

설명:

-alp옵션 효과적으로 코드를합니다

BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    our @F = split(' ', $_, 0);
    $#a = $" = ',';
}
foreach $_ (@a) {
    use File::Glob ();
    push @a, glob('{' . join($", @F) . '}' . $_);
}

보시다시피 <>perl은 readline에 사용될뿐만 아니라 shell style globbing도 할 수 있습니다 (사실 고대 perls에서는 shell을 호출하여 구현했습니다).

예를 들어 <{a,b}{1,2}>로 확장됩니다"a1","a2","b1","b2"

따라서 요소가 있으면 그 @F사이에 쉼표 만 추가하면됩니다. 보간의 기본 문자 사이는 특수 변수에 저장된 공백 $"입니다. 설정 있도록 $"하기 위해 ,켜집니다 "{@F}"{a,b}하는 경우 @F=qw(a b)(globs와 문자열로 확장)

실제로 나는 정말로와 같은 것을 반복하고 싶었지만 glob"{@F}"x$n++첫 번째 빈 줄이 생성되지 않고 발견 된 모든 해결 방법으로 인해 코드가 너무 길다는 문제가 계속 발생했습니다.

따라서이 코드의 또 다른 필수 부분은 for배열을 루프 하기 위해 루프 를 사용하면 실제로 루프 중에 추가 요소를 푸시 할 수 있으며 루프는 이러한 새로운 요소를 선택한다는 것입니다. 루프에서 우리가 요소에서 예하는 경우 그래서 "ab", 다음 <{@F}$_>에 확장됩니다 <{a,b}ab>목록에 문맥이되는 ("aab", "bab"). 그래서 이것을 누르면 @a왼쪽으로 확장 된 문자열도 사용할 수 있습니다.

내가 여전히해야 할 일은 빈 문자열로 루프를 프라이밍하는 것입니다. 즉 사용하여 수행됩니다 $#a = 0( ,이된다 숫자 맥락에서 0의 최초이자 유일한 요소가 발생하는) @a처럼 행동한다 미확정가되기 위해 ""내가 그것을 사용하는 경우를

개량

실제로이 설명에 대한 테스트를 수행하여 첫 번째 빈 항목을 올바르게 처리하는 확장 글로브를 사용할 수있는 짧은 방법을 찾았습니다. 다음으로 실행 perl -ap kleene0.pl <<< "a b"(따라서 2 바이트 추가 -ap)

kleene0.pl (이 버전은 33 + 2 바이트입니다) :

$"=",";print<$z,>;$z.="{@F}";redo

이러한 모든 솔루션은 점점 더 많은 출력을 메모리에 유지하므로 일정 시간이 지나면 프로그램이 실패합니다. 스칼라 컨텍스트에서 펄 글롭을 사용하여 게으른 생성에 사용할 수 있지만 프로그램을 더 길게 만듭니다 ....


무슨 일이 일어나고 있는지 설명해 주 <{@F}$_>시겠습니까? 감사!
andlrc

6

피 이스, 7

<s^LzQQ

여기 사용해보십시오

는의 각 숫자를 사용하여 입력의 데카르트 곱을 계산하고 0..n-1조인 한 다음 첫 번째 만 유지합니다 n. 3-4보다 훨씬 큰 숫자 나 문자열의 경우 온라인 시간이 초과됩니다.

또는 무한 출력을 얻으려면 Jakube의 답변을보십시오 .


5

젤리, 8 6 바이트

⁷³p$Ȯ¿

이것은 알파벳을 받아들이고 무한한 문자열 목록을 인쇄하는 모나 딕 링크입니다. 온라인으로 사용해보십시오!

작동 원리

⁷³p$Ȯ¿    Monadic link. Argument: A (alphabet)

⁷         Set the return value to '\n'.
     ¿    While loop.
            Condition:
    Ȯ         Print the current return value and return it (always truthy).
            Body:
   $          Combine the two links to the left into a single, monadic link.
 ³              Yield A.
  p             Perform the Cartesian product of A and the current return value,
                updating the return value in the process.

대체 버전, 6 바이트 (비경쟁)

R’ḃL}ị

이것은 알파벳과 원하는 수의 문자열을 각각 왼쪽과 오른쪽 인수로 받아들이는 2 차원 링크입니다.

이 버전은 경쟁적이지 않은 것으로 생각합니다.이 버전은이 도전이 샌드 박스 처리 된 후에 구현 된 bijective 기본 변환을 사용하기 때문입니다. 온라인으로 사용해보십시오!

작동 원리

R’ḃL}ị    Dyadic link. Arguments: n (integer), A (alphabet)

R         Range; yield [1, ..., n].
 ’        Decrement; yield [0, ..., n-1].
   L}     Yield l, the length of A.
  ḃ       Convert every i in [0, ..., n-1] to bijective base l.
     ị    For each array of digits, retrieve the corresponding characters of A.

4

파이썬 2, 89 84 83 바이트

x,n=input()
l=len(x)
for i in range(n):
 s=''
 while i:i-=1;s+=x[i%l];i/=l
 print s

와우. 더 짧고 내장되지 않습니다.
Morgan Thrapp 2019

4

CJam, 16 10 바이트

6 바이트를 절약 한 jimmy23013에게 감사합니다.

N{eam*_o}h

입력은 문자 당 하나의 명령 행 인수입니다. 출력은 각 줄에 하나의 문자열입니다.

온라인으로 사용해보십시오! (그러나 즉시 죽이십시오 ...)

설명

N      e# Push [\n]. At each step this array will contain all strings of length N,
       e# each followed by a linefeed.
{      e# Infinite loop...
  ea   e#   Read command-line arguments.
  m*   e#   Cartesian product: pairs each letter with each string in the list.
  _o   e#   Output all the strings of the current length.
}h

3

Pyth, 7 바이트

.V0j^zb

@fry의 대안. 이 프로그램은 문자열을 읽고 무한대까지 문자열을 계속 인쇄합니다.

설명:

.V0      for b in (0 to infinity):
    ^zb     compute all strings of length b consisting of the input alphabet
   j        print each one on a separate line

또는 다음이 작동합니다. 그래도 조금 더 해키입니다.

u
M^zH7

3

하스켈, 33 바이트

k u=do s<-[0..];mapM(\_->u)[1..s]

예를 들어, k "xyz"무한 목록입니다["","x","y","z","xx","xy","xz","yx","yy","yz","zx","zy","zz","xxx",...]


3

MATL , 10 바이트

0cD`G@Z^DT

온라인으로 사용해보십시오! 그러나 서버에 많은 계산 부하를 피하기 위해 오랫동안 실행하지 마십시오.

프로그램은 문자열을 동적으로 표시하며 각 문자열은 다른 줄에 표시됩니다.

0cD             % force display of a newline to represent the empty string
   `      T     % infinite do-while loop
    G           % push input, or nothing if no input has been taken yet
     @          % push iteration. Gives 1, 2,... in each iteration
      Z^        % Cartesian power. In the first iteration takes input implicitly 
       D        % display

2

파이썬 3, 95

from itertools import*
def f(x,l=0):
 while 1:print(*combinations_with_replacement(x*l,l));l+=1

itertools 함수가 왜 그렇게 긴 이름을 가져야합니까?


3
combinations_with_replacement그럴 가치가 없습니다. 루프를 사용하는 것이 더 짧습니다. 항상.
mbomb007

2

루비, 65 60 바이트

->a{n=-1;loop{puts a.repeated_permutation(n+=1).map &:join}}

긴 내장 이름 ...


1
AFAIK & 앞에 공백이 필요 없으며 put 대신 p를 사용할 수 있습니다.
Nic Hartley

@QPaysTaxes 공간을 삭제할 수 없으며 다음과 같은 출력을 생성하는 인수를 p호출합니다 inspect.[] ["a","b"] ["aa", "ab", ...
Doorknob

나는 당신의 대답을 오해했습니다. 나는 그것이 무한 배열을 생성하고 인쇄한다고 생각했습니다. 그러나 Array에서는 to_s가 검사를 위해 별칭이 지정되므로 put과 p는 동일한 출력을 갖습니다. ruby-doc.org/core-2.2.0/Array.html#method-i-to_s WRT 공간 : 확인 했습니까? 틀림없이 나는 확실하지 않지만 그것에 대해 상당히 확신합니다.
Nic Hartley 12

1

파이크 (커밋 31), 10 9 바이트

=blR.fbtp

설명:

=b         -    set characters for base conversion to eval_or_not(input())
  l        -   len(^)
   R      -  [^, eval_or_not(input()]
    .f    - first_n(^)
      b   -    conv_base(^)
       t  -   ^[-1]
        p -  print(^)

1

스칼라, 69

def f[A](s:Set[A]):Stream[List[A]]=Nil#::f(s).flatMap(x=>s.map(_::x))

게으른 개울은 이런 종류의 일에 아주 좋습니다.


1

apt, 50 40 34 28 바이트

V²o ®s1+Ul)£UgXnH)¯X¦0}Ãâ ¯V

입력입니다 "string", number of items. 출력은 길이별로 정렬 된 다음 알파벳 순서를 반대로합니다. 온라인으로 테스트하십시오!

작동 원리

V²  o ®   s1+Ul)£  UgXnH)¯  X¦ 0}Ã â ¯  V
Vp2 o mZ{Zs1+Ul)mX{UgXnH)s0,X!=0}} â s0,V

Vp2 o      // Create the range [0..V²).
mZ{     }  // Map each item Z in this range to:
Zs1+Ul)    //  Take the base-(1+U.length) representation of Z.
mX{     }  //  Map each char X in this to:
XnH        //   Parse X as a base-32 number.
Ug   )     //   Take the char at index -^ in U.
s0,X!=0    //   If X is 0, slice it to an empty string.
â          // Uniquify the result.
s0,V       // Slice to the first V items.

이 버전은 100 개 이상의 항목을 수행하려는 경우 시간이 걸립니다. 더 빠른 버전을 원하면 이 32 바이트 버전을 사용해보십시오 .

V*2 o ms1+Ul)f@!Xf'0î£UgXnH}ïV

1

계피 껌, 6 바이트

0000000: 6801 301c e74b                           h.0..K

시나몬 껌은이 도전 후에 만들어 졌기 때문에 비경쟁입니다.

온라인으로 사용해보십시오 (TIO 제한 출력).

설명

h계피 껌을두고 형식과 모드를 생성합니다 . 나머지 문자열은로 압축 해제됩니다 [%s]*. 는 %s다음 입력으로 교체되고, 생성기는 그 출력을 정규식 매칭 가능한 모든 문자열을 생성한다.


1

05AB1E , 9 바이트

g<∞*εÅв¦J

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

g             # length of the input
 <            # - 1
  ∞           # infinite list [1, 2, 3, …]
   *          # multiply each by the length-1
    ε         # for each:
     Åв       #  custom base conversion, using the input as the list of digits
       ¦      #  chop off the first digit
        J     #  join the rest to a string

0

파이썬, 55 바이트

s=input();l=['']
for x in l:print x;l+=[x+c for c in s]

이것은 feersum의 53 바이트 솔루션 보다 길지만 인쇄 된 출력과 다른 방법을 보여줍니다. l읽은 각 문자열의 모든 한 문자 접미사를 추가하여 목록 이 반복되는 동안 목록 이 업데이트됩니다.

사용하는 것도 똑같습니다 map.

s=input();l=['']
for x in l:print x;l+=map(x.__add__,s) 

Python 3에서 동일한 길이를 수행하여에 대한 문자를 잃고 print()입력 압축을 풀면 문자를 저장할 수 있습니다.

s,*l=input(),''
for x in l:print(x);l+=[x+c for c in s]

0

Zsh , 31 바이트

f(){<<<${(F)a};a=($^a$^@);f $@}

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

배열을 인쇄 한 다음 반복하기 전에 인수를 압축하십시오. 함수 이름을 포함하더라도 반복 버전보다 1 바이트 짧습니다.

for ((;;))<<<${(F)a}&&a=($^a$^@)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.