천막 기호 문자


41

매일 당신은 움직일 수있는 글자가 있는 선택 윤곽 표시 에 새로운 단어를 붙이고 , 당신이 그것을 쓸 필요가있는 글자 만 구입합니다. 당신은 가능한 한 빨리 이전 단어를 위해 구입 한 편지를 재사용합니다. 매일 쓰고 싶은 단어가 순서대로 있으면 매일 구입하는 글자를 출력하십시오.

Input:  ['ONE', 'TWO', 'THREE', 'SEVENTEEN']
Output: ['ENO', 'TW', 'EHR', 'EENSV']

일 1 : 당신은 너무 쓰기에, 아니 문자로 시작 ONE, 당신은 모든 문자를 구입 E, N, O.
2 일 : 다음날,을 TWO (를) 내려 놓고 싶습니다 ONE. 귀하는 이미 Ofrom을 가지고 ONE있으므로 추가로 구매하십시오 TW.
3 일 : 이 시점에서 ENOWT. 쓰려면 THREE필요합니다 EHR. E가지고있는 것 외에 두 번째를 구입해야합니다 .
4 일 : 글 을 쓰려면 총 SEVENTEEN4 E개가 필요 합니다. 이미 2 개 (3 개가 아님)가 있으므로 2 개를 더 구매하십시오. 의 T및 중 하나가 N있으므로 나머지 문자를 구입하십시오 EENSV.

이 예에서는 문자를 알파벳순으로 정렬했지만 아무 순서로나 출력 할 수 있습니다.

입력 : 비어 있지 않은 문자열로 구성된 비어 있지 않은 목록 A-Z. 원하는 경우 소문자를 사용할 수 있습니다. 문자 목록은 문자열에 적합합니다.

출력 : 매일 구매해야하는 추가 문자를 출력하거나 인쇄하십시오. 요일의 문자는 어떤 순서로도 출력 될 수 있지만 요일은 올바른 순서로 나와야합니다.

하루의 문자는 다른 날과 분리되어 하루가 끝나는 곳을 알 수 있습니다. 후행 및 / 또는 선행 구분 기호는 하루 또는 하루 사이에 좋습니다. 하루에 구입 한 문자가 없을 수 있으며 출력에 반영되어야합니다 (마지막 날에도 공백 또는 빈 줄은 괜찮습니다).

테스트 사례

['ONE', 'TWO', 'THREE', 'SEVENTEEN']
['ENO', 'TW', 'EHR', 'EENSV']

['ONE', 'TWO', 'ONE', 'THREE']
['ENO', 'TW', '', 'EHR']

['ABC', 'AABC', 'ABBC', 'ABCC', 'AABBCC']
['ABC', 'A', 'B', 'C', '']

['SHORT', 'LOONG', 'LOOOONG', 'LOOOOOOONG', 'SHORT', 'LOOONG']
['HORST', 'GLNO', 'OO', 'OOO', '', '']

다음은 별도의 목록으로 모든 입력 및 출력입니다.

[['ONE', 'TWO', 'THREE', 'SEVENTEEN'], ['ONE', 'TWO', 'ONE', 'THREE'], ['ABC', 'AABC', 'ABBC', 'ABCC', 'AABBCC'], ['SHORT', 'LOONG', 'LOOOONG', 'LOOOOOOONG', 'SHORT', 'LOOONG']]
[['ENO', 'TW', 'EHR', 'EENSV'], ['ENO', 'TW', '', 'EHR'], ['ABC', 'A', 'B', 'C', ''], ['HORST', 'GLNO', 'OO', 'OOO', '', '']]

그리고 공백으로 구분 된 문자열 (출력의 후행 공백이 중요합니다) :

ONE TWO THREE SEVENTEEN
ONE TWO ONE THREE
ABC AABC ABBC ABCC AABBCC
SHORT LOONG LOOOONG LOOOOOOONG SHORT LOOONG

ENO TW EHR EENSV
ENO TW  EHR
ABC A B C 
HORST GLNO OO OOO  

리더 보드


5
와일드 스크립트 리더 스크립트가 사용자 스크립트 시대에 등장했습니다 : o
Quintec

모든 문자의 문자열이 아니라 구매해야하는 문자의 배열로 출력 할 수 있습니까? 예 :[['E', 'N', 'O'], ...]
Downgoat

SHORTLONGOOOOO마지막 출력에 유효한 출력입니까? 구분자를 사용하지 않는 AKA?
매직 문어 항아리

@Downgoat 예, 목록은 출력하기에 좋습니다.
xnor

@MagicOctopusUrn 아니요, 구분 기호가 필요합니다. 그렇지 않으면 어떤 요일에 어떤 문자가 있는지 말할 수 없습니다.
xnor

답변:


10

하스켈, 54 49 바이트

import Data.List
g x=zipWith(\\)x$scanl(++)""$g x

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

\\입력 목록 의 목록 차이 ( )와 출력 목록의 누적 추가 (로 시작)를 쌍으로 계산 하여 출력 목록을 작성합니다 "".

input list:                ONE       TWO       THREE        SEVENTEEN
cumulative append:         ""   +->  ONE  +->  ONETW   +->  ONETWHRE
list difference (output):  ONE -+    TW  -+    HRE    -+    SVEEN

람다 봇 환경을 사용하는 등 범위 Data.ListData.Function범위가 모두 30 바이트로 단축 될 수 있습니다.

fix.(.scanl(++)"").zipWith(\\)

편집 : @Sriotchilism O'Zaic 덕분에 -5 바이트.



10

파이썬 2 , 72 68 바이트

Jonathan Allan 덕분에 -4 바이트.

p=''
for r in input():
 for x in p:r=r.replace(x,'',1)
 print r;p+=r

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

댓글

l=input()       # the list of words to write
p=''            # p contains all letters we own
for r in l:     # for each word ...
  for x in p:   # for each letter we own ...
    r=r.replace(x,'',1)   # remove one occurence from the current word
  print r       # print the remaining word
  p+=r          # add the remaining chars to p

3
for r in input():4 바이트를 저장합니다.
Jonathan Allan


7

펄 6 , 44 바이트

{$!=@;.map:{kxxv $!=.comb.Bag∖($⊎=$!):}}

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

문자 목록으로 출력합니다.

설명

{                                      } # Anonymous codeblock
 $!=@;                                   # Initialise $! to an empty list
      .map:{                          }  # Map each item in the input to
                    .comb                # The string split to characters
                         .Bag            # In a Bag
                                        # Set minus
                              ($⊎=$!)    # The accumulated Bag of results
                 $!=                     # And save the result for the next item
            kxxv                     : # Then decompose the Bag into a list

2
downvote의 이유는 감사합니다
Jo King

downvoter는 아니지만이 출력 형식이 너무 많이 벗어났다고 말할 것입니다. 같은 뭔가가 Bag(E(2), N, S, V)실제로 두 개의 E의 수 확인을 보여줄 필요가있다.
xnor

3
정말? 기본 인쇄 형식 일뿐입니다. 반환 결과는 해당 문자를 포함하고 동일한 문자를 여러 개 포함 할 수있는 순서가없는 목록입니다. 이것을 더 잘 반영하기 위해 출력 형식을 업데이트 할 것이지만, downvote는 어리석은 것처럼 보입니다.
조 왕

Downvoter, 설명해 주시겠습니까? I / O 또는 다른 것입니까? 가방 형식에 대해, 나는 Perl을 모른다, 이것이 Perl 골프의 I / O에 공통적인가? 문서를 보았을 때 (사이트가 다운되어 캐시되었으므로) collections.Counter출력으로 허용하지 않으려는 Python과 비슷하게 카운트가있는 dicts처럼 보입니다 . 다중성을 사용하여 bag elt를 쉽게 반복하고, 목록 / 배열로 캐스트하고, 다중성을 사용하여 표시 할 수 있습니까?
xnor

3
Downvote는 실수였습니다.
Jonathan Allan

7

하스켈 , 44 바이트

import Data.List
foldl1(\a x->a++',':(x\\a))

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

출력은 ONE,TW,HRE,SVEEN일 사이에 쉼표 와 같은 문자열 입니다.


1
\`. And an unexpected foldl1` 기본 케이스 를 접을 필요가 없도록 출력 형식을 훌륭하게 사용합니다.
xnor

7

자바 스크립트 (Node.js) , 59 바이트

a=>a.map(h=>([...t].map(c=>h=h.replace(c,'')),t+=h,h),t='')

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

매우 간단한 해결책. 각 단어마다 h이미 가지고있는 문자를 제거하십시오.

해당 코드의 설명 된 버전은 다음과 같습니다.

f = list => {
  // the string that accumulates all the letters already bought
  let accu = '';
  // for every word in the list
  return list.map( word => {
    // for every letter already bought 
    [...accu]
      // remove the letter from the word
      .map(char => {
        return word = word.replace(char,'')
      });
    // add not bought letters to accumulator
    accu += word;
    // the reduced word (without already bought letters) should be added to result map
    // this represents the letters to buy today
    return word
  }, accu)
}

console.log(f(['ONE', 'TWO', 'THREE', 'SEVENTEEN']))
console.log(f(['ONE', 'TWO', 'ONE', 'THREE']))
console.log(f(['ABC', 'AABC', 'ABBC', 'ABCC', 'AABBCC']))
console.log(f(['SHORT', 'LOONG', 'LOOOONG', 'LOOOOOOONG', 'SHORT', 'LOOONG']))


지나치게 복잡한 솔루션에서 유일한 가치있는 트릭을 빌려 1 바이트절약 할 수 있습니다 .
Arnauld

5

J , 29 바이트

FrownyFrog 덕분에 -29 바이트!

(],a.<@#~0>.-&(1#.a.=/;))/@|.

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

원본 게시물

J , 58 바이트

[:}.@>[:(],<@(/:~@({.@>@-.&(((e.<@#[){:)\));))&.>/<@a:,~|.

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

"반복 부분을 존중하면서 뺄셈 문자"를 개선하는 데 도움을 주신 ngn에게 감사드립니다.

J에게 적합하지는 않지만 조명 운동입니다.

wo반복을 존중하면서 한 문자열의 모든 체커를 다른 문자열에서 제거 하는 도우미 동사 ( "without")를 구성하는 것으로 시작하겠습니다 .

wo=.{.@>@-.&(((e. <@# [) {:)\)

여기에는 재미있는 아이디어가 있습니다. 캐릭터의 반복되는 각 인스턴스를 필요한 횟수만큼 반복하여 고유하게 만듭니다. 따라서 원래 문자열이 ABBA다음과 같이되면 :

┌─┬─┬──┬──┐
│A│B│BB│AA│
└─┴─┴──┴──┘

세 번째 A는 그렇게 될 것 AAA입니다. 이것은 문구에 의해 수행되는 ((e. <@# [) {:)\각 접두사 소요, \마지막 요소에서 외모, {:해당 접두어에있는 모든 요소의 마스크를 그것의, 및 구축 일치하는 e.마지막 요소 다음 필터 상자 바로 이러한 요소가 <@#.

입력이 "고유 화"된 상태에서 이제 -. 반복을 존중하면서 정상 설정 마이너스 를 안전하게 사용할 수 있습니다 .

그런 다음 각 결과를 열고 첫 번째 요소 만 반복을 "실행 취소"합니다. {.@>

이 헬퍼 동사를 연결하면 전체 솔루션 (간단히 인라인)이됩니다.

[: }.@> [: (] , <@(/:~@wo ;))&.>/ <@a: ,~ |.

본질적으로 우리가하는 일은 문제를 단일 축소로 설정하는 것입니다. 입력을 반전시키고 ace 또는 빈 상자를 |.추가하기 시작합니다.이 결과는 다음과 같이 최종 결과의 초기 값이됩니다.,~a:

┌─────────┬─────┬───┬───┬──┐
│SEVENTEEN│THREE│TWO│ONE│┌┐│
│         │     │   │   ││││
│         │     │   │   │└┘│
└─────────┴─────┴───┴───┴──┘

각 요소 사이에 다음 동사를 붙여서 축소에 영향을줍니다.

(] , <@(/:~@wo ;))/

이것은 말합니다 : 올바른 입력 ](즉, 결과)을 가져 와서 오른쪽 입력 의 영향을 받지 않고 , 왼쪽 입력 (이것은 ONE첫 번째 반복, TWO2 등) wo에 추가 ;합니다 (즉, 지금까지의 이전 문자가 없음) 사용)하지만 추가하기 전에 정렬 /:~하고 다시 상자에 넣으 십시오 <@.

이 모든 것이 끝나면 원하는 결과, 상자 목록이 있지만 하나의 큰 추가 상자 안에 있고 여전히 빈 상자가 앞에 있습니다. 따라서 우리는 외부 상자를 제거하고 첫 번째 요소를 죽입니다 : }.@>.


[:}.@>|.(],a.<@#~0>.-&(1#.a.=/;))&.>/@,<@a:
FrownyFrog

(],a.<@#~0>.-&(1#.a.=/;))/@|.가장자리가 빠지지 않는 한 간단한 방법 도 있습니다.
FrownyFrog

내가 알 수있는 한 정렬은 요구 사항에 없습니다.
FrownyFrog

2
업데이트되어 이제 그것을 흡수 할 시간이 있었으므로 다시 말하고 싶었습니다 : 좋은 J입니다!
요나

4

자바 스크립트 (ES6),  66  65 바이트

a=>a.map(b=s=>[...s].filter(c=>x==(x=x.replace(c))?b+=c:0,x=b+0))

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

댓글

bbxcxb

a =>                      // a[] = input
  a.map(b =               // initialize b to the callback function of this map()
                          // it will be coerced to a string that does not contain
                          // any letter in uppercase
    s =>                  // for each entry s in a[]:
    [...s].filter(c =>    //   for each character c in s:
      x == (              //     check whether x is changed when
        x = x.replace(c)  //     c is replaced with 'undefined'
      ) ?                 //     if so:
        b += c            //       append c to b and keep c
      :                   //     else:
        0,                //       discard c
      x = b + 0           //     coerce b to a string and save it in x
    )                     //   end of filter()
  )                       // end of map()

4

C ++ (gcc) , 177170 바이트

@anatolyg의 팁 덕분에 -5 바이트, 내가 발견 한 작은 것들에 -2 바이트.

#import<random>
#define v std::vector<std::string>
v a(v p){std::vector<int>o(91),b;int j=-1;for(auto i:p){b=o;p[++j]="";for(int c:i)--b[c]<0?p[j]+=c,++o[c]:0;}return p;}

설명

#import<random>모두 추가 <string><vector>반 바이트.

먼저 0의 91 요소 벡터 (문자 65-90 만 문자 발생을 저장하는 데 사용됨)와 동일한 유형이지만 값으로 설정되지 않은 다른 벡터를 만듭니다. 입력의 각 요소 (일)를 반복합니다. 현재 소유 한 문자를 가져오고 해당 날짜에 필요한 문자를 가져오고 인덱스의 입력을 필요한 양으로 대체하고 소유 한 문자를 업데이트합니다. 재정의 된 입력을 반환합니다.

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


바이트 수를 6 바이트로 줄이기 위해 수행 #define v std::vector<std::string하고 제거 할 수 있습니다 using namespace std.
anatolyg

2

C # (Visual C # 대화식 컴파일러) 123 바이트

a=>{var b="";for(dynamic i=0,e,f;i<a.Count;b+=a[i++]=f)foreach(var c in((e,f)=(b.ToList(),"")).f+a[i])f+=e.Remove(c)?"":c;}

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

입력 배열을 수정하여 출력하는 익명 함수입니다.

// a: input array of strings
a=>{
  // b: cumulative letters
  var b="";
  for(
    // i: loop index of string
    // e: copy of cumulative letters for manipulation
    // f: characters missing from current string
    dynamic i=0,e,f;
    // iterate over each string in a
    i<a.Count;
    // add missing letters of the day to
    // cumulative missing letters and
    // update array for output
    b+=a[i++]=f
  )
    // iterate current string with character c
    foreach(var c in
      // tuplized variable assignment
      // e=b.ToList()
      //   set e to a copy of the cumulative letters
      // f=""
      //   initially there are no letters needed for the day
      ((e,f)=
      (b.ToList(),"")).f+a[i]
    )
      // conditionally add c to missing letters for the day
      f+=e.Remove(c)?"":c;
}

2

R, 119112106103 바이트

더 긴 두 함수 이름의 별명을 -7 바이트에서 시작하여 -3 바이트 에서 사용자 입력 을 가져 와서 -3 바이트를 한 번만 scan()
호출 하여 별명을 제거하고 한 번의 호출로 두 개의 변수를 지정하십시오.strsplit()

(또한 잘못 잘못 된 바이트 수를 편집했습니다)

a=scan(,'');b=a=strsplit(a,'');for(i in 2:length(a))b[[i]]=vecsets::vsetdiff(a[[i]],unlist(b[1:i-1]));b

이것은 모든 종류의 첫 PPCG 제출입니다! 그래서 나는 골프와 에티켓 게시 측면에서 내가 무엇을하고 있는지 전혀 모른다. 결과는 챌린지 조건을 충족하거나 충족하지 않을 수있는 벡터 목록입니다. :-피

코드 자체 scan()는 다른 솔루션과 마찬가지로 사용자 입력을 통해 각 새 날의 편지를 누적 소유 한 편지와 비교합니다. 더 짧은 대안이 unlist있고 strsplit문자열을 알고있는 멋진 개별 문자의 벡터로 변환하는 경우. 또한 vsetdiffCarl Withoft vecsets패키지 의 기능을 사용하여 다음 날에 필요한 문자와 현재 소유 한 문자의 차이를 얻었습니다.


1
아뇨, 완벽합니다. 나는 외부 패키지를 사용하는 것을 꺼려하지만, 나는 단지 ... 나는 기본 R 코드의 도전에 접근하는 것을 선호한다;)
digEmAll






2

Japt , 15 14 바이트

£Q®X=rZPPÃQ±XX

시도 해봐

£Q®X=rZPPÃQ±XX     :Implicit input of array
£                  :Map each X
 Q®                :  Map each Z in Q (initially a quotation mark)
   X=              :    Reassign to X
     rZ            :    Replace Z with
       P           :    The empty string
        P          :    With the default global flag disabled
         Ã         :  End map
          Q±X      :  Append X to Q
             X     :  Return X

1
@Downvoter, 의견을 남겨주세요.
Shaggy


1

PowerShell , 71 바이트

$args|%{$w=$_;$p|% t*y|%{$w=$w-replace"^(.*?)$_(.*)",'$1$2'};$w;$p+=$w}

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

입력 단어 $args를 가져 와서 반복합니다. 반복 할 때마다 현재 단어를 설정 $w한 다음 $p이미 구매 한 문자 를 반복 합니다. 각각의 내부 루프는 -replace현재 $word에서 정규 표현식 을 수행하여 $pool 에서 첫 번째 문자 인스턴스를 대체합니다 . 풀의 모든 글자를 다 읽은 후에는 남아있는 것 $w(즉, 구매해야하는 것)을 출력 한 후 다음 글자를 $p+=$w위해 해당 글자를 풀 에 붙입니다.


1

Excel VBA, 127 바이트

Function z(w)
z=""
For Each x In w.Cells
v=x.value
For y=1To Len(z)
v=Replace(v,Mid(z,y,1),"",1,1)
Next
z=z&v
Next
End Function

엑셀 범위의 형태로 입력을받습니다.





1

스칼라, 68 바이트

(c:Seq[String])=>c./:(Seq(""))((a,n)=>a:+n.diff(a./:("")(_+_))).tail

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

/ : foldLeft 연산자의 약자, a는 집계, 궁극적으로 원하는 결과를 반환, n은 다음 요소

언 골프

def NewLettersPerDay(c: Seq[String]): Seq[String] = {
    c.foldLeft(Seq(""))((agg, next) => {
      val existingLetters = agg.reduce(_+_)
      val newDayLetters = next.diff(existingLetters)
      agg :+ newDayLetters
    }).tail
}


0

, 18 바이트

EθΦι¬⊙…θκ‹№…ιμλ№νλ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

 θ                  Input array
E                   Map over strings
   ι                Current string
  Φ                 Map over characters
       θ            Input array
      …             Truncated to length
        κ           Outer index
    ¬               Logical Not
     ⊙              Any element exists where
          №         Count of
              λ     Current letter in
            ι       Outermost word
           …        Truncated to
             μ      Current letter index
         ‹          Is less than
               №    Count of
                 λ  Current letter in
                ν   Innermost word
                    Implicitly print each day's bought letters on their own line

0

PHP, UTF-8 인식 (253 바이트)

<?php $p=[];for($i=1;$i<$argc;$i++){$a=$p;$b=[];for($j=0;$j<mb_strlen($s=$argv[$i]);$j++){$k=1;if(isset($a[$c=mb_substr($s,$j,1)]))if($a[$c]){$k=0;$a[$c]--;}if($k){echo $c;if(isset($b[$c]))$b[$c]+=$k;else $b[$c]=$k;}}$p=array_merge($p,$b);echo PHP_EOL;}

0

C # (Visual C # 대화식 컴파일러) , 112 바이트

a=>{var b="";for(int i=0;;b+=a[i++])foreach(var z in b)if(a[i].Contains(z))a[i]=a[i].Remove(a[i].IndexOf(z),1);}

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


흠 ... 예외가 발생합니까?
dana

@dana 나는 아무것도 반환하지 않는 함수는 예외로 종료 될 수 있다고 확신한다
무지의 구현

흥미 롭습니다 ... 가장 이상한 규칙은 아니라고 생각합니다.
dana




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