문자열과 숫자로 재미


13

다음은 프로그래밍 퍼즐입니다.

예를 들어, 문자열 쌍과 해당 숫자의 목록이 주어지면 [[A,37],[B,27],[C,21],[D,11],[E,10],[F,9],[G,3],[H,2]]다음과 같은 방식으로 문자열 만 갖는 다른 목록을 출력합니다.

  1. 문자열의 총 개수는 입력 데이터의 해당 수와 정확히 같아야합니다.

  2. 시퀀스에서 문자열을 인접하게 반복해서는 안되며 모든 문자열이 출력 목록에 나타납니다.

  3. 다음 문자열의 선택은 두 규칙을 어 기지 않는 한 무작위로 수행해야합니다. 각 솔루션은 0이 아닌 확률을 선택해야합니다.

  4. 조합이 불가능한 경우 출력은 단지이어야합니다 0.

입력 목록은 임의의 순서 (정렬 또는 정렬되지 않음)로 제공 될 수 있으며, 목록의 문자열은 임의의 길이 일 수 있습니다.


위의 샘플 입력 1에 대한 샘플 출력

[A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,G,H,G,H,G]


입력 샘플 2 :

[[A,6],[B,1],[C,1]]

두 번째 입력에 대한 출력 :

0

규칙에 따라 가능한 목록이 없기 때문입니다.


샘플 입력 3 :

[[AC,3],[BD,2]]

유효한 출력 : [AC,BD,AC,BD,AC]

유효하지 않은 출력 : [AC,BD,AC,AC,BD]


더 자세한 설명이 필요하면 언제든지 의견을 말해주십시오. 그에 따라 즉시 조치하겠습니다.

이것은 이므로 각 언어마다 가장 짧은 코드가 바이트로 표시됩니다!


좋은 도전! 나는 그것이 우리의 표준에 의해 약간 지정되지 않았다고 생각합니다. 챌린지를 게시하기 전에 샌드 박스 를 사용하여 많은 피드백을 얻을 것을 적극 권장합니다 . :-) 나는 당신에게서 더 좋은 도전을 기대하고 있습니다!
주세페

@ 주세페 감사합니다. 이 정보를 놓친 경우 세부 정보를 추가해야하는 경우 알려주십시오.
Stupid_Intern

1
문자열과 숫자 만 입력 할 수 있습니까?
FrownyFrog

'랜덤'이라는 문구를 사용하는 데 모호한 점이있을 수 있습니다. 이러한 솔루션 중 일부는 실제로는 의사 랜덤 인 "랜덤"라이브러리를 사용하고 있습니다.
밝게 돈

답변:


6

젤리 , 11 바이트

Œṙ'Œ!⁻ƝẠ$ƇX

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

Œṙ'Œ!⁻ƝẠ$ƇX Arguments: z
  '         Flat: Apply link directly to x, ignoring its left and right depth properties
Œṙ            Run-length decode
   Œ!       Permutations of x
         Ƈ  Filter; keep elements of x for which the link returns a truthy result
        $     ≥2-link monadic chain
      Ɲ         Apply link on overlapping pairs (non-wrapping)
     ⁻            x != y
       Ạ        Check if all elements of x have a truthy value (+vacuous truth)
          X Pick a random element of x; return 0 if the list is empty.

경우 Œṙ가없이 작동합니다 벡터화하지 않았다'
dylnan

5

젤리 , 17 바이트

Wẋ¥Ɲ€ẎẎŒ!Œɠ’SƊÐḟX

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


시도 ["A", 100], ["B", 3]하면 아무것도 출력되지 않지만 붙어 있다고 생각합니다.
Stupid_Intern

1
@newguy 103 개 항목의 모든 순열을 생성하는 것은 그 속도로 유명하지 않습니다. 참고로, 이후 결과 Œ!에는 99029007164861804075467152545817733490901658221144924830052805546998766658416222832141441073883538492653516385977292093222882134415149891584000000000000000000000000 요소가 있습니다.
아웃 골퍼 에릭

@newguy이 솔루션은 O(n!)짧지 만 속도는 중요하지 않습니다. 숫자가 약 6-8 개가 넘는 숫자로 시도하지 마십시오 .P
HyperNeutrino

Œṙ도와 드릴까요?
Arnauld

1
@dylnan 나는 그것이 내가 시도하고 잘못된 출력으로 ["AT", 3], ["B", 3]얻은 문자열에 대해 작동하지 않는다고 생각합니다TBATATBAB
Stupid_Intern

5

파이썬 (2) , 114 (189) 185 174 바이트

from random import*
a=input()
s=u=[]
while a:x,y=a.pop(a.index(next((w for w in a if w[1]>sum(v[1]for v in a+u)/2),choice(a))));s=s+[x];a+=u;u=[[x,y-1]]*(y>1)
print[s,0][y>1]

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

아야! 규칙 3으로는 훨씬 더 어려워요 ... :). 여전히 O(n!)접근 을 피하려고 노력 하므로 우주의 열사 전에 언젠가 모든 테스트 사례를 처리 할 수 ​​있습니다 ...

알고리즘 : 총 문자열 수의 합이라고 가정합니다 t. 문자열 개수 n2*n>t+1이면 제약 조건을 충족 할 수 없습니다. (이전에 선택한 일 제외) 임의의 문자열이 카운트 경우 따라서, n과를 2*n=t+1, 우리는 다음에 해당 문자열을 선택해야합니다. 그렇지 않으면 이전에 선택한 문자열이 아닌 임의의 문자열을 임의로 선택할 수 있습니다.


1
@ Arnauld : 완전히 그것을 놓쳤다! 지금 수정되었습니다.
Chas Brown

4

R , 148141 바이트

function(x,y,p=combinatXXpermn(rep(seq(y),y)),q=which(sapply(lapply(p,diff),all)))"if"(n<-sum(q|1),"if"(n-1,x[p[[sample(q,1)]]],x[p[[q]]]),0)

온라인으로 사용해보십시오! (저는 combinat::permn그것을 복사 해서 combinatXXpermn그곳에서 호출했습니다 .)

무차별 대입 O (n!) 솔루션.

패키지 permn에서 사용 하여 combinat가능한 모든 주문을 생성합니다. 그런 다음 규칙을 따르는 지 확인하고 규칙 중 하나를 임의로 선택합니다.


n<-sum(n|1)내가 믿는 바이트가 짧습니다. 그러나 sample길이가 1 인 입력 의 단점은 여기서 매우 실망 스럽습니다.
Giuseppe

그것도 약간 아래로 골프를 쳤다, 여기 에서 시도해라 – 나는 충분히 작은 링크를 얻기 위해 헤더에서 combinatXXpermn을 제거해야했다.
Giuseppe

내가 가지고 뭔가 매우 유사 dataframe으로 복용 입력합니다. bruteforce의 문제점은 너무 큰 입력을 처리하지 못한다는 것입니다.
JayCe

@JayCe는이 도전의 규칙 3을 감안할 때 무 브루 포스 알고리즘조차 가능합니까?
ngm 2016 년

동의하지 않을 수도 있습니다. 규칙 3없이 더 흥미 로웠을 것입니다.
JayCe

3

자바 스크립트, 112 바이트

먼저 이것에 패스하고, 더 많은 골프를 (희망스럽게) 따르십시오.

f=([i,...a],o=[])=>a.sort((x,y)=>(y[1]-x[1])*Math.random()-n*.5,n=--i[1],o.push(i[0]))+a?f(n?[...a,i]:a,o):n?0:o

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


1
고마워, @Arnauld, 나는 그것을 그리워했다. Chas의 리드를 맹목적으로 따르는 것이 아니라 스펙을 다시 확인해야합니다. 빠른 수정을 구현했습니다. 나중에 더 잘 골프를 칠 수 있는지 나중에 다시 찾아 와야합니다.
얽히고 설킨

예, 어쨌든 모든 솔루션을 쉽게 무차별 대입 할 수있는 esolangs에게는 세 번째 규칙이 적합하지만 다른 언어로 더 짧은 알고리즘을 구현하는 것은 상당히 어렵습니다 ... BTW : 이제 유효한 항목에서 때때로 0 을 반환하는 것 같습니다 .
Arnauld

@Arnauld라는 또 다른 빠른 수정 프로그램을 구현했습니다. 정렬되지 않으면 더 많은 시간을 들여 볼 때까지 다시 삭제해야합니다. 참고 : 다음 문자열을 무작위로 선택해야 한다는 말로 스펙을 취했습니다 . 첫 번째 선택은 무작위 일 필요는 없음을 의미합니다.
얽히고 설킨

1
@Shaggy-동의합니다. 맹목적으로 내가하는 일을 절대 따라서는 안됩니다! :)
Chas Brown

3

J, 60 53 바이트

FrownyFrog 덕분에 -7

(?@#{])@(#~*/@(2~:/\])"1)@(]i.@!@#@;A.;) ::0(#~>)/&.>

기발한

(?@#{])@(#~2&([:*/~:/\)"1)@(A.~i.@!@#)@;@:(([#~>@])/&.>) ::0

언 골프

(?@# { ])@(#~ 2&([: */ ~:/\)"1)@(A.~ i.@!@#)@;@:(([ #~ >@])/&.>) ::0

개선을위한 제안 환영합니다.

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


에 Golfed 53
FrownyFrog

멋진 tyvm @FrownyFrog, 나중에 게시물을 업데이트합니다
Jonah

죄송합니다, [:*/2~:/\|:더 짧습니다
FrownyFrog


2

, 38 바이트

WΦθ§κ¹«≔‽Φ∨Φι›⊗§κ¹ΣEι§μ¹ι¬⁼κυυ§υ⁰⊞υ⊖⊟υ

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

WΦθ§κ¹«

0이 아닌 카운트가 하나 이상있는 동안 반복하십시오.

Φι›⊗§κ¹ΣEι§μ¹

나머지 절반을 초과하는 수를 찾으십시오.

∨...ι

없는 경우 이전에 필터링 된 0이 아닌 카운트를 취하십시오.

Φ...¬⁼κυ

마지막으로 출력 된 문자열을 필터링하십시오.

≔‽∨...υ

위의 두 목록 중 비어 있지 않은 임의의 요소를 마지막 출력 문자열에 지정하십시오. 불가능한 조합을 입력하면이 시점에서 프로그램이 중단됩니다.

§υ⁰

문자열을 인쇄하십시오.

⊞υ⊖⊟υ

카운트를 줄입니다.


예를 들어 ["h4x0r", 1337]문자열 로 포함 된 것과 같이 잘못된 출력이 생성 됩니다.
ngm

@ngm 코드를 재 배열했는데 그렇게하면 충돌이 발생합니다 ... 올바른 유효성 검사는 불행히도 더 많은 바이트를 소비합니다.
Neil

2

루비 , 85 바이트

무차별 대입 접근 방식 (조나에게 아이디어를 주셔서 감사).

->l{l.flat_map{|a,b|[a]*b}.permutation.select{|p|r=0;p.all?{|a|a!=r&&r=a}}.sample||0}

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

루비 , 108100 96 바이트

이전에는보고 소트 접근 방식

->l{w=[];l.map{|a,b|w+=[a]*b;b}.max*2>w.size+1?0:(w.shuffle!until(r='';w.all?{|a|a!=r&&r=a});w)}

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


다음은 93 명을위한 것입니다 : 온라인으로 사용해보십시오!
Jonah

2

녹 633 바이트

이것을 다른 것들과 조금 다르게 만드는 것은 물리적 시스템을 시뮬레이션하여 현을 재배 열하는 아이디어로 시작했다는 것입니다. 각 문자열은 먼저 적절한 횟수만큼 복제됩니다. 그런 다음 각 개별 문자열은 공간에서 입자로 취급됩니다. 동일한 스트링 값을 갖는 2 개의 입자는 서로 "반발"하지만, 다른 값을 갖는 2 개의 입자는 서로를 끌어 당긴다. 예를 들어 AAAAAAABBBBCC로 시작하면 As는 서로를 폐지하고 서로 멀어지게하여 B가 그들 사이를 이동할 수있게합니다. 시간이 지남에 따라 이것은 좋은 입자 혼합물에 도달합니다. '입자 이동'이 반복 될 때마다 프로그램은 동일한 입자가 인접 해 있지 않은지 확인한 다음 1 차원 공간에 나타나는 순서대로 문자열 목록 인 시스템 상태를 중지하고 인쇄합니다.

이제 물리적 시스템을 실제로 구현할 때는 구식 PC 데모 / 게임 기술을 사용하여 각 입자 위치와 속도를 숫자로 저장 한 다음 반복을 통해 위치와 속도를 업데이트하는 것으로 시작했습니다. 반복 할 때마다 위치에 속도를 추가하고 (움직임) 속도에 가속도를 추가하고 (이동률의 변화) 가속도를 계산합니다 (입자의 힘 찾기). 단순화하기 위해 시스템은 다른 모든 입자를 기준으로 각 입자의 힘을 계산하지 않으며, 바로 인접한 입자 만 검사합니다. 파티클이 너무 많이 가속되지 않고 무한대로 날아갈 수 있도록 '댐핑'효과도있었습니다 (예를 들어, 각 단계마다 속도가 x 퍼센트 감소).

그러나 골프 과정을 통해이 모든 것이 크게 줄어들고 단순화되었습니다. 이제 두 개의 같은 입자가 서로 반발하는 대신 단순히 '텔레포트'입니다. 다른 입자는 단순히 시스템의 정체를 방지하기 위해 wee bit을 'scoot'합니다. 예를 들어 A가 A 옆에 있으면 순간 이동합니다. A가 B 옆에 있으면 약간만 이동합니다. 그런 다음 조건이 충족되는지 확인하고 (인접한 입자와 같지 않음) 1 차원 공간에서의 위치에 따라 문자열을 순서대로 인쇄합니다. 그것은 시뮬레이션보다 정렬 알고리즘과 거의 비슷합니다. 다시 한번, 정렬 알고리즘을 '질량'에 기반한 시뮬레이션 된 '표류'의 형태로 볼 수 있습니다. 나는 산다.

어쨌든, 이것은 내 첫 Rust 프로그램 중 하나이므로 아직 몇 시간 동안 골프를 타면서 포기했지만 여전히 기회가 있습니다. 파싱 ​​비트가 어렵습니다. 표준 입력에서 입력 문자열을 읽습니다. 원하는 경우 "let mut s ="[[A, 3], [B, 2]] "로 대체 될 수 있지만 지금은 'echo [[A, 3], [B, 2]] | 명령 행에서화물을 실행하십시오.

정지 계산은 약간의 문제입니다. 시스템의 유효한 상태에 도달하지 못할 경우 어떻게 감지합니까? 첫 번째 계획은 '현재'상태가 예를 들어 ACCC가 CACC로 변경되었다가 다시 ACCC로 변경된 경우 이전 상태를 반복했는지 여부를 감지하는 것입니다. 의사 난수 일 뿐이므로 프로그램이 종료되지 않는다는 것을 알고 있습니다. 그런 다음 포기하고 0을 인쇄해야합니다. 그러나 이것은 엄청난 양의 Rust 코드처럼 보였으므로 대신 많은 수의 반복을 거치면 아마도 멈추고 꾸준한 상태에 도달하지 않기 때문에 0을 인쇄하고 중지합니다. 얼마나? 파티클 수 제곱

암호:

extern crate regex;
struct P {s:String,x:i32,v:i32}
fn main() {
    let (mut i,mut j,mut p,mut s)=(0,0,Vec::new(),String::new());
    std::io::stdin().read_line(&mut s);
    for c in regex::Regex::new(r"([A-Z]+),(\d+)").unwrap().captures_iter(&s) {
        for _j in 0..c[2].parse().unwrap() {p.push(P{s:c[1].to_string(),x:i,v:0});i+=1;}
    }
    let l=p.len(); while i>1 {
        j+=1;i=1;p.sort_by_key(|k| k.x);
        for m in 0..l {
            let n=(m+1)%l;
            if p[m].s==p[n].s {p[m].v=p[m].x;if n!=0 {i=2}} else {p[m].v=1}
            p[m].x=(p[m].x+p[m].v)%l as i32;
        }
        if j>l*l{p.truncate(1);p[0].s="0".to_string();i=1}
    }
    for k in &p{print!("{}",k.s)};println!();
}

l2regex

내가 그것을 퍼지하지 않았지만 그것은 내가 공급 한 예를 통과시켰다. TIO에서 작동하도록 수정했습니다. 'let s = [( "A", 3), ( "B", 2), ( "ZZ", 4)];'를 수정해야합니다. line, bit.ly/2LubonO
밝게 돈


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