'KVZ'를 알고 있습니까?


23

개념

곡을 망치지 않고 Twinkle Twinkle Little Star 곡을 노래 할 수 있도록 영어 알파벳을 어떤 방식으로 스크램블 할 수 있습니까?

규칙

스와핑

다음의 각 세트에 포함 된 글자를 기본적으로 곡을 망치지 않고 자유롭게 바꿀 수 있다고 가정 해 봅시다.

  • {A, J, K}
  • {B, C, D, E, G, P, T, V, Z}
  • {나, Y}
  • {Q, U}
  • {S, X, F}
  • {M, N}
  • 따라서 H, L, O, R 및 W가 제자리에 고정됩니다.

산출

프로그램은 위의 조건을 만족하는 순서대로 완전한 영어 알파벳을 포함하는 단일 RANDOM 문자열 (또는 문자 목록)을 임의의 순서로 출력해야합니다. 프로그램이 어떤 문자열을 출력할지 예측할 수있는 방법이 없어야합니다 (시드를 무시하는 경우). 단지 하드 코딩 할 수는 없습니다.

당신의 프로그램은 각각 9!!!2!2!2!=104509440 출력.

간격, 구분 기호 또는 대소 문자에 대한 특정 형식 제한은 없으며 일관성이 있습니다.

가장 적은 바이트가 이깁니다!

예 :

  • KCDBPSVHIAJLMNOZQRXGUEWFYT
  • A, G, Z, V, P, X, C, H, Y, K, J, L, N, M, O, T, U, R, S, D, Q, B, W, F, I, 이자형
  • KVTDCFBHIJALNMOPURSZQGWXYE
  • jcdebxthikalnmogursvq pwfyz
  • ABCDEFGHIJKLMNOPQRSTUVWXYZ

비 예제 :

  • HLWROABCDEFZXYGIJKMNPQTSVU

개념 증명 : (Python3, 529 바이트)

import random
g1 = ['A', 'J', 'K']
g2 = ['B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z']
g3 = ['I', 'Y']
g4 = ['Q', 'U']
g5 = ['S', 'X', 'F']
g6 = ['M', 'N']
random.shuffle(g1)
random.shuffle(g2)
random.shuffle(g3)
random.shuffle(g4)
random.shuffle(g5)
random.shuffle(g6)
print(g1[0] + g2[0] + g2[1] + g2[2] + g2[3] + g5[0] + g2[4] + 'H' + g3[0] + g1[1] + g1[2] + 'L' + g6[0] + g6[1] + 'O' + g2[5] + g4[0] + 'R' + g5[1] + g2[6] + g4[1] + g2[7] + 'W' + g5[2] + g3[1] + g2[8])

5
Z, 그것은 다른 사람과 운율하지 않는다 "제자리에 고정"수?
얽히고 설킨

3
내가 어디에서 왔는지에 따라 다릅니다. 'zed'라고 말하면 꺼내는 것이 합리적이지만 그렇지 않으면 'zee'라고 말하면 그대로 두십시오. 궁극적으로 나머지 세트와 마찬가지로 귀하에게 달려 있습니다. 그들은 :) 엄격한 규칙에 반대 지침과 시작점이 될 거 야
breadlord

3
0이 아닌 확률을 갖는 균일하게 무작위이거나 모든 가능성 또는 다른 것?
jimmy23013

8
@PeterTaylor 나는 그룹의 멤버가 원곡의 튜닝과 리듬을 유지하면서 노래 중간에 쉽게 교체 할 수 있다고 생각합니다-그래서 운율이있는 동안 W는 3 음절이고 U는 1입니다. 노래의 리듬이 바뀔 것입니다.
Sok

2
(나 같은) 질문에 대해
전혀 몰랐던

답변:


6

05AB1E , 28 바이트

A.•¬=©ƶÓÄûkTVã”ØζÞ•Dás#€.rJ‡

단일 소문자 문자열로 출력합니다.

온라인으로 시도 하거나 확인하십시오 한 번에 무작위 출력 .

설명:

A                    # (a) Push the lowercase alphabet
 .•¬=©ƶÓÄûkTVã”ØζÞ•  # Push compressed string "ajk bcdegptvz iy qu sxf mn"
  Dá                 # (b) Duplicate it, and only keep the letters (removing the spaces)
    s#               # Swap to get the string again, and split it by spaces
      €.r            # Shuffle each substring randomly
         J           # (c) Join it back together to a single string
                    # Transliterate all characters from (b) to (c) in string (a)
                     # (and output the result implicitly)

이 05AB1E 광산의 팁을 참조하십시오 (섹션 압축 문자열 사전의 일부에 어떻게? ) 이유를 이해하는 .•¬=©ƶÓÄûkTVã”ØζÞ•것입니다 "ajk bcdegptvz iy qu sxf mn".




3

Pyth , 59 57 56 바이트

hMeD,Vs.SMJc"ajk bcdegptvz iy qu fsx mn h l o r w"dxLGsJ

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

출력은 소문자 배열입니다.

hMeD,Vs.SMJc"ajk bcdegptvz iy qu fsx mn h l o r w"dxLGsJ   Implicit: d=" ", G=<lowercase alphabet>
          Jc"ajk bcdegptvz iy qu fsx mn h l o r w"d        Chop the grouping string on spaces, store in J
                                                      sJ   Concatenate J into single string
                                                   xLG     Find the index of each letter in grouping string in the unaltered alphabet
       .SMJ                                                Shuffle each group in J
      s                                                    Concatenate into a single string
    ,V                                                     Pair the shuffled string with their 'correct' positions in the alphabet
  eD                                                       Order the pairs by the derived positions (last element of each pair)
hM                                                         Keep the letter from each pair (the first element)
                                                           Implicit print


3

펄 6 , 76 바이트

{my@a='A'..'Z';<AJK BCDEGPTVZ IY QU SXF MN>>>.&{@a[.ords X-65].=pick(*)};@a}

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

익명 코드 블록은 인수를 취하지 않고 문자 목록을 반환합니다.

설명:

{                                                                          } # Anonymous code block
 my@a='A'..'Z';      # Initialise @a as a list of the alphabet
               <AJK BCDEGPTVZ IY QU SXF MN>   # For each of the sets of letters
                                           >>.&{@a[.ords X-65].=       }  # Set those indexes
                                                                pick(*)   # To a random order
                                                                        ;@a  # And return

3

자바 스크립트 - 421 344 328 320 306 280 277 276 ... 176 바이트

-77 바이트-내 자신의

-18 바이트- @tsh@Geza Kerecsenyi 덕분에 @tsh가 처음 지적한 것을 보았습니다

-8 바이트- @Geza Kerecsenyi 덕분에

-14 바이트- @Geza Kerecsenyi의 도움으로

- @Geza Kerecsenyi -1 Bytes의

도움으로 다시 28 Bytes- 내 자신의 -3 Bytes-

어떻게 이런 일이 일어날 수 있습니까 ?

...

-100 바이트- @Kaiido 가 그것을 죽이고이 모든 일이 끝나기 전에 몇 단계를 거쳐 행 176 바이트

골프 :

c=[,'AJK','BCDEGPTVZ','IY','QU','SXF','MN'].map(s=>[...s]);alert([...'1222252H311L66O24R5242W532'].reduce((o,v)=>o+(+v?(p=>p.splice((Math.random()*p.length)|0,1))(c[v]):v),""))

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


1
최소한 ''B ','C ','D ','E ','G ','P ','T ','V ','Z ']를'BCDEGPTVZ '로 바꿀 수 있습니다. 바이트를 절약하기 위해
tsh

1
-2 'BCDEGPTVZ'.split``대신에 시도하십시오 .split('').
Geza Kerecsenyi

1
또한, 당신은 정의 할 수 있습니다 y=q=>q.split``코드의 상단에, 그리고에 당신이 통과하는 배열 문자열의 모든을 y()- 예를 들어이 a=['A','J','K']된다a=y("AJK")
게자 Kerecsenyi

1
그리고 교체 'BCDEGPTVZ'.split('')와 함께y('BCDEGPTVZ')
게자 Kerecsenyi

1
'abcdef'.includes(s)?r(eval(s)):l[i]
Geza Kerecsenyi

2

룬 마법 , 210 바이트

>yy `AJK`06B$̤$@
>`BCDEGPTVZ`06B$$$$ $̤$y $ $y @
>̤`IY`06Byyy$yyy̤ @
> ̤`QU`06Byy̤ $y @
> ̤`FSX`06B $yy̤$yy@
>y̤ `MN`06Byyy $@
}}f}l3-[r\
3-[2'RA?rR1Kl'RAs]{1-:0)?\}l
> ̤`HLORW`06Bo$y $y$y$yy@ \~{{B͍

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

Runic에서 그렇게 할 수있는 좋은 방법이 없기 때문에 무작위 화는 균일 하지 않습니다. 대신 무작위로 각 문자 모음 (예 : [BCDEGPTVZ]하나의 그룹화)을 일정량만큼 회전시킵니다 (예 : 스택의 상단이 오른쪽에 있으면 결과는 4로 위의 세트를 회전 [BCDEGZPTV]). 스택을 뒤집습니다. 이 작업은 15 번 수행됩니다. 결과적으로 가능한 모든 주문이 가능 하지만 똑같이 가능 하지는 않습니다 . (이것으로 충분하지 않은 경우, 추가로 0 바이트를 소비하면 올리면 최대 15000 셔플 루프가 필요합니다).

다음은 셔플 링을 처리하는 코드 섹션입니다.

  v              vvvv           Loop counter

}}f}l3-[r\                      < Loop entry
[2'RA?r1KRl'RAs]{1-:0)?\}l3-
                       \~{{B͍    < loop exit

 ^^^^^^                         Randomly reverse
          ^^^^^                 Rotate by a random an amount

나머지 코드는 다음과 같이 전개됩니다.

                     ABCDEFGHIJKLMNOPQRSTUVWXYZ
>      `AJK`08B      $        $$;
> `BCDEGPTVZ`08B      $$$$ $        $   $ $   $;
>         `IY`08B            $               $;
>          `QU`08B                   $   $;
>          `FSX`08B       $            $    $;
>            `MN`08B             $$;
>          `HLORW`08Bo      $   $  $  $    $;

^                                                   Create IPs
 ^^^^^^^^^^^^^^^^                                   Set letter groupings
                  ^^^                               Call shuffle function
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^    Print letters
                     ^                              Last letter group needs to be sorted

알파벳을 2 바이트로 변경하여 글자가 섞이지 않은 경우 (한 번 되 돌리면) 이 정상적으로 인쇄되어 모든 문자 그룹이 올바른 위치에 인쇄되는지 확인할 수 있습니다. 공백은B명령을 단계에서 벗어나는 은 모든 IP가 충돌없이 동시에 함수 루프를 사용한 다음 다시 단계로 되돌릴 수 있도록하는 것입니다.

골프하려면 먼저 모든 라인에 제거 할 수있는 공간을 정돈 한 후 각 두 공간은 변환 된 y, 그리고 모든 순서 yyyy로 전환 된 ̤때문에 ̤yyyy지연 같은 양의가 있지만이 저렴 바이트. HLORW간격 종료 바이트 (12 바이트)를 절약하기 위해 루프 엑시트도 기본 프로그램 세그먼트 와 결합되었습니다 .


2

펄 5 , 103 91 85 바이트

map{my%l;@l{/./g}++;@k{/./g}=keys%l}AJK,BCDEGPTVZ,SXF,IY,QU,MN;say map$k{$_}||$_,A..Z

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

이 코드 (ab)는 Perl의 해시 키 출력 ( %l)이 임의 %k의 가능한 수정 가능한 문자와 가능한 대응 문자 중 하나에 대한 매핑 ( ) 을 생성하기 위해 무작위 라는 사실을 사용합니다 . 출력시 존재하지 않는 키는 변경되지 않은 것으로 가정합니다.


Perl의 해시 키 출력은 전혀 무작위가 아닙니다. 완전히 결정적이며 키 자체의 영향을 받아 예측하기가 어렵습니다. 그렇기 때문에이 코드는 모든 실행에서 동일한 출력을 생성합니다. 이것이이 접근법의 자격을 상실하는지의 여부.
John Bollinger

@JohnBollinger 프로그램 실행 내에서만 적용됩니다. 단일 실행 내에서 해시가 수정되지 않은 경우 해시 순서는 동일합니다. 두 번의 실행 또는 수정과 함께 perl을 호출 할 때마다 임의의 시드가 생성됩니다. 참조
Xcali

좋아, @Xcali, 나는 정정했다. 그러나 "온라인으로 사용해보십시오!"에 의해 적어도 부분적으로 잘못 인도되었습니다. 나에게 동일한 출력을 반복적으로 생성하는 링크. 캐싱 또는 무언가 여야합니다.
John Bollinger

사용 keys확실히 좋은 방법입니다,하지만 당신은 사용하여 6 바이트를 저장할 수 있습니다 sort rand 2,...대신 :( 온라인으로보십시오!
돔 헤이스팅스



1

APL (Dyalog Extended) , 55 바이트

전체 프로그램. 선행 및 후행 공백으로 대문자를 인쇄하지만 중간 공백은 없습니다.

{(?⍨∘≢⊇⊢)@(∊∘⍺)⊢⍵}/⌈'AjkBcdegptvzIyQuSxfMn'(⊂⍤⊢,⍨∊⊂⊣)⎕A

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

⎕A 대문자 알파벳

'AjkBcdegptvzIyQuSxfMn'()  다음과 같은 익명의 암묵 함수를 오른쪽 인수로, 표시된 문자열을 왼쪽 인수로 적용하십시오.

 왼쪽 주장에 대해

 분할하여 새 세그먼트를 시작하십시오.

 왼쪽 인수 문자는 오른쪽 인수의 멤버입니다 (예 : 대문자)

,⍨ 덧붙이다

 묶으 (단일 요소로 취급하는)

 오른쪽 인자를

 모두 대문자

{}/ 다음과 같은 익명의 람다로 줄이면…"QU"λ("SXF"λ("MN"λ"A-Z")) :

⊢⍵ 올바른 주장에 (진행중인 알파벳)

()@(∊∘⍺) 다음의 익명의 암묵적 기능을 왼쪽 논증 (동운 그룹)의 구성원 인 부분 집합에 적용

   그 하위 집합에

   그것을 재정렬

  ?⍨ 부분 집합에서 문자
   의 길이
  집계에  대한 임의 순열


1

, 43 바이트

FαF⪪”&↖(vJf#S»↖ιηa↷N↖⪪νP´↑x‖υ” F№κι‽Φκ¬№KAμ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 숯에는 셔플 링 연산자가 없지만 교체하지 않고 샘플링하는 방법을 생각해 냈습니다. 설명:

Fα

알파벳의 각 문자를 반복하십시오.

F⪪”&↖(vJf#S»↖ιηa↷N↖⪪νP´↑x‖υ” 

문자열 AJK BCDEGPTVZ IY QU SXF MN H L O R W을 공백으로 분할하고 하위 문자열을 반복합니다.

F№κι

현재 문자가 하위 문자열에 나타나는 횟수만큼 반복합니다. 조건부에는 elsecaluse 가 필요하기 때문에 루프를 사용합니다 . 또는 동일한 바이트 수에 대해 현재 문자가 포함 된 하위 문자열을 필터링 할 수 있습니다.

‽Φκ¬№KAμ

임의의 문자를 인쇄하되 이미 인쇄 된 문자는 제외하십시오.


0

레티 나 , 80 바이트

K`1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z
~(K`123456
.
?O`$&.¶
)`¶$
[blank line]
\d
[blank line]

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

아마도 가장 골프 방법은 아니지만 어쨌든 제출하겠습니다.

설명:

K`1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z

작업 문자열을로 설정하십시오 1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z. 이 예를 들어 그룹의 각 문자 앞에 숫자입니다 A, J그리고 K모두가 1그들 앞에.

~(

일부 레티 나 코드를 생성하는 코드 섹션을 표시 한 다음 나중에 실행하십시오.

K`123456

작업 문자열을 123456

.
?O`$&.¶

각 문자를 ?O`{character}.¶

)`¶$
[blank line]

후행 줄 바꿈을 제거하고 그룹을 완료하여 코드를 생성하십시오. 그룹은 코드를 생성합니다.

?O`1.
?O`2.
?O`3.
?O`4.
?O`5.
?O`6.

{n}.숫자 n 의 모든 인스턴스 다음에 문자를 찾습니다. ?O각 인스턴스를 무작위로 정렬하며 모든 문자 세트에 대해 수행됩니다.

\d
[blank line]

마지막으로 모든 숫자를 제거하고 생성 된 문자열을 내재적으로 출력하십시오.

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