15 자 알파벳에서 6 자 문자열 생성


17

직장에서 진행중인 프로젝트 중 하나에서 최근 15 자 알파벳에서 6 자 문자열을 생성하는 특히 큰 방법을 발견했습니다. 우리 중 몇몇은 코드 골프의 작은 내부 게임을 시작한 "한 줄로 얻을 수있을 것"이라고 주장했다.

당신의 임무는 우리를 이길 것입니다.

원래 알고리즘은 알파벳 0-9A-E를 사용했지만 다른 알파벳을 실험했습니다. 따라서 세 가지 하위 작업이 있습니다.

  1. 6임의의 하드 코드 된 코드에서 임의로 선택하여 문자열을 생성합니다.15와 같이 문자 알파벳ABC123!@TPOI098 . (이것은 단지 예일 뿐이며 바이트 수에 영향을주지 않고 사용자 정의 할 수 있어야합니다.)
  2. 6에서 무작위로 선택하는 문자열을 생성15문자 알파벳0123456789ABCDE .
  3. 6에서 무작위로 선택하는 문자열을 생성15 문자 알파벳 하십시오 (인쇄 가능한 문자 만).

각 캐릭터는 선택과 반복의 기회동일 해야합니다 가져야하며 이 가능해야합니다.

각 하위 작업을 관리 할 수있는 최선의 방법은 다음과 같습니다.

  • "ABC123! @ TPOI098"- 24 bytes
  • "0123456789ABCDE"- 21 bytes
  • 맞춤 알파벳- 13 bytes

점수는 각 하위 작업 솔루션의 바이트 합계입니다. 즉, 우리의 점수는 현재 58입니다.

우리는 CJam과 Ruby를 사용하려고 시도했습니다. 원본은 C #에있었습니다. 원하는 언어를 사용하되, 특히이 언어로 된 솔루션을보고자합니다.


5
여러 부분으로 된 도전과 관련하여. 불행히도,이 세 가지 하위 작업이 여러 과제로 나눌 수없는 너무 유사하기 때문에이 경우에는 좋은 해결책이 없습니다. 또한 하위 과제가 동일한 과제의 작은 변형 인 다중 부분 과제에 대한 해당 정책의 예외 제안을 고려하고 있습니다. (여전히 다른 답변에서 하위 솔루션을 가져올 수 있다는 문제가 있지만) 나는 이것을 망치지 않을 것이며 커뮤니티가 어떻게 생각하는지 봅니다.
Martin Ender

"당신의 점수는 바이트의 합입니다 ..."그래서 첫 번째 예는 불행합니다. 나는 또 다른 잠재적 인 예제를 수정합니다
제임스 웹스터에게

2
@MartinEnder 내 2 센트 : 괜찮아요. VTC는 안될 것 같아요. 물론, 나는 일반적으로 하나의 흥미로운 작업으로 도전하는 것이 더 낫다고 생각하지만, 이러한 작업은 매우 유사하기 때문에 "이 8 개의 임의의 관련없는 작업을 수행하십시오"라는 "골프 코스"보다 훨씬 낫습니다. 작업 사이에 상호 작용이 없지만 내 눈 에이 도전은 모든 16 논리 게이트 골프 라고하는 것과 크게 다르지 않습니다 .
DJMcMayhem

시간이나 메모리 제한이 있습니까? 서브 태스크가 독립적이어야합니까, 아니면 코드를 공유 할 수 있습니까?
Dennis

2
"문자열 생성"은 코드가 실제로 적절한 문자를 사용하여 문자열 값을 생성해야하는지 또는 공백이나 줄 바꿈으로 구분되지 않은 6 개의 문자를 허용합니까?
DLosc

답변:


6

젤리 , 38 바이트

TryItOnline은 A , BC를 연결 합니다.

A :ABC123!@£POI098, 22 바이트

“ABC123!@£POI098”Wẋ6X€

(이것을 줄이려면 압축을 생각하십시오)

B :0123456789ABCDE, 8 바이트 :

ØHṖWẋ6X€

C :123456789ABCDEF(선택), 8 바이트 :

ØHḊWẋ6X€

어떻게?

...Wẋ6X€ - common theme
   W     - wrap (string) in a list
    ẋ6   - repeat six times
      X€ - random choice from €ach

ØH...... - hexadecimal digit yield: "0123456789ABCDEF"

..Ṗ..... - pop: z[:-1] (B)

..Ḋ..... - dequeue: z[1:] (C)

8

CJam (23 + 14 + 10 = 47 바이트)

임의 알파벳 : 23 바이트 ( 온라인 데모 )

{"ABC123!@TPOI098"mR}6*

16 진 알파벳 : 14 바이트 ( 온라인 데모 )

{FmrAbHb'0+}6*

맞춤 알파벳 : ABCDEFGHIJKLMNO, 10 바이트 ( 온라인 데모 )

{Fmr'A+}6*

해부

16 진수는 흥미로운 것입니다.

{      e# Loop...
  Fmr  e#   Select a random number from 0 to 14
  AbHb e#   Convert to base 10 and then to base 17
       e#   (i.e. add 7 if the number is greater than 9)
  '0+  e#   Add character '0' (i.e. add 48 and convert from integer to character)
       e#   Note that 'A' - '0' = 17
}6*    e# ...six times

6 개의 문자가 스택에 남아 자동으로 인쇄됩니다.


2
AbHb훌륭합니다. 나는 그 일반적인 접근 방식에 대해 생각했지만 _9>7*+너무 길었습니다.
Martin Ender

6

펄, 46 + 26 + 26 = 98 바이트

13 바이트 절약을 위해 많은 크레딧이 @Dom Hastings 에 갑니다 !

변경되는 알파벳을 제외하고 3 개의 프로그램은 거의 동일합니다.

  • 하드 코딩 된 알파벳 ( ABC123!@)POI098이 예에서)-> 46 바이트 :

    say map{substr"ABC123!@)POI098",15*rand,1}1..6

  • 고정 알파벳 0123456789ABCDE-> 26 바이트 :

    printf"%X",rand 15for 1..6

  • 0123456789ABCDE이 경우 사용자 지정 알파벳 -> 26 바이트 :

    printf"%X",rand 15for 1..6

그것들을 모두 파일에 넣어서 실행할 수 있습니다.

$ cat 6chr_strings.pl
say map{substr"ABC123!@)POI098",15*rand,1}1..6;
say "";
printf"%X",rand 15for 1..6;
say "";
printf"%X",rand 15for 1..6;
say "";
$ perl -M5.010 6chr_string.pl
CB8!8!
24D582
9ED58C

( say "";출력 형식을 향상시키기 위해 여기에 있습니다)


2
좋은 답변입니다! 첫 번째와 마지막에 거의 동일했지만 say: say map{("ABC123!@)POI098"=~/./g)[rand 15]}1..6및을 사용하여 바이트를 저장할 수 있습니다 say map{(A..O)[rand 15]}1..6. 두 번째의 경우 당신은 사용할 수 있습니다 printf: printf"%X",rand 15for 1..6모든 이상 (11)을 저장! 톤이 더 많은 마법을 권유하여 더 많은 돈을 절약 할 수 있다고 확신합니다!
Dom Hastings

1
실제로 사용자 정의 알파벳을 사용 substr하면 다음과 같은 다른 say map{substr"ABC123!@)POI098",15*rand,1}1..6
Dom Hastings

1
@DomHastings 흠, 정말 훌륭합니다. 감사합니다 :-)
Dada

2
나는 코드가 간단하다는 메모를 제거했다는 것을 좋아한다. : D
Dom Hastings

@DomHastings with printf"%X" , substr..rand그리고 map조금 덜 명확하므로 사람들이 스포일러없이 펄 마술을 즐길 수 있습니다! : D
Dada

4

R, 33 + 43 + 59 = 135 바이트

임의의 하드 코딩 된 알파벳 (알파벳을 변경하려면 문자열 변경) :

cat(sample(strsplit("ABC123!@TPOI098","")[[1]],6,1),sep="")

알파벳 [0-9A-E]:

cat(sample(c(0:9,LETTERS[1:6]),6,1),sep="")

stdin의 사용자 정의 알파벳 :

cat(sample(scan(,''),6,1),sep="")

모든 경우에 출력 단어를 표준 출력으로 인쇄합니다.


4

자바 스크립트 (ES6), 167 166 164 163 바이트

Neil 덕분에 1 바이트
절약 ETH 프로덕션 덕분에 2 바이트 절약
1 바이트 1 바이트 절약

하드 코드 : "ABC123!@TPOI098" (58 바이트)

f=(n=6)=>n?"ABC123!@TPOI098"[Math.random()*15|0]+f(n-1):''

고정 : "0123456789ABCDE" ( 58 57 바이트)

f=(n=6)=>n?f(n-1)+("ABCDE"[n=Math.random()*15|0]||n-5):''

사용자 정의 : "()+.1=>?M[afhnt" ( 51 49 48 바이트)

f=(n=6)=>n?(f+1)[Math.random()*15|0+5]+f(n-1):''

1
(n=6)=>n?f(n-1)+("ABCDE"[n=Math.random()*15|0]||n-5):''바이트를 절약합니다.
Neil

1/8+Math위대한 것입니다 :)
ETHproductions

그러나 .1+JSON더 낫다;)
ETHproductions

1
또는 JSON+f( [object JSON](n=> " (JNOS[]bcejnot")
ETHproductions

@ETHproductions 좋은 사람. :)
Arnauld

3

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

맞춤 알파벳 : 66 바이트

_=>"......".replace(/./g,c=>"ABC123!@TPOI098"[Math.random()*15|0])

0-9A-E : 63 바이트

_=>"......".replace(/./g,c=>"ABCDE"[n=Math.random()*15|0]||n-5)

0-9a-e : 55 바이트

_=>(Math.random()*11390625+1e8|0).toString(15).slice(1)

날짜 기반 임의성이 허용되는 경우 6 바이트를 뺍니다.


다음을 사용하여 마지막 바이트에 바이트를 저장할 수 있습니다 **._=>((Math.random()+1)*15**6|0).toString(15).slice(1)
ETHproductions

@ETHproductions 확실히 ES6이 아닌 ES7로 만들 것입니까? (또한 3 바이트를 절약하는 것처럼 보입니다.)
Neil

예, 3 바이트를 절약하는 것으로 보입니다. f=바이트 수에 포함해야합니다
ETHproductions

3

q, 42 바이트

19 바이트

6?"ABC123!@TPOI098"

14 바이트

6?15#.Q.n,.Q.A

9 바이트

6?15#.Q.a

(알파벳의 첫 15자를 사용합니다)


3

줄리아 (36 + 26 + 21 = 83)

join(rand(["ABC123!@TPOI098"...],6))

base(15,rand(15^6:15^7-1))

join(rand('a':'o',6))

2

CJam, 48 바이트

임의의 알파벳, 23 바이트 :

{"ABC123!@TPOI098"mR}6*

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

16 진수, 15 바이트 :

{A,'F,65>+mR}6*

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

알파벳 ABCDEFGHIJKLMNO, 10 바이트 :

{Fmr'A+}6*

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


나는 나쁜 생각이 있었다. U + FFFE를 문자로 간주하면 기술적으로 인쇄 가능한 것을 반환 ~c하지 'A+않습니다.
jimmy23013

어쩌면 내가 틀렸을 수도 있습니다. 인쇄 가능한 유니 코드 문자의 정의를 찾지 못했습니다.
jimmy23013

2

루비 47 + 37 + 31 = 115

하드 코드 : "ABC123! @ TPOI098"(47)

(1..6).map{"5CABC123!@TPOI098".chars.sample}*''

고정 : "0123456789ABCDE"(37)

(1..6).map{[*0..9,*?A..?E].sample}*''

사용자 정의 : "ABCDEFGHIJKLMNO"(31)

(1..6).map{[*?A..?O].sample}*''


1

파이썬 2, 70 + 70 + 64 = 204 바이트

from random import*
s=""
exec"s+=choice('ABC123!@TPOI098');"*6
print s

from random import*
s=""
exec"s+=choice('0123456789ABCDE');"*6
print s

from random import*
s=""
exec"s+=chr(randint(65,80));"*6
print s

불행히도 두 번째 예는 첫 번째 방법으로 다음과 같은 것보다 쉽습니다. choice([randint(48,57)),choice(65,69)])


왜 사용 from random import*합니까? 나는 당신이 사용할 수 있다고 생각 import random하고 random.choice처음 두 예에서 적어도.
Roman Gräf

import random random.choice27 그러나 from random import* choice또한, 26 인 import random as r r.choice27
칼 Napf

16 진수 경우에는를 사용하여 조금 더 잘 할 수 format(randrange(8**8),'X')있다고 생각합니다.
DSM

@DSM 문제는 없어야합니다F
Karl Napf


1

J, 24 + 24 + 18 10 = 58 바이트

마일 덕분에 8 바이트가 절약되었습니다!

'ABC123!@TPOI098'{~?6#15
'0123456789ABCDE'{~?6#15
u:65+?6#15

예, 두 번째 문자열은 J에서 쉽게 압축 할 수 없습니다.

u:47+23#.inv 12670682677028904639x
u:47+;(+i.@])/"1&.>1 10;18 5
('ABCDE',~1":i.10)
(toupper,hfd?6#15)
'0123456789ABCDE'

소문자 16 진수 알파벳이 괜찮다면 ,hfd?6#15@miles가 지적한 것처럼 9 바이트입니다.

어쨌든, ?6#150과 15 사이의 6 개의 난수입니다. {~테이크 아웃입니다. u:숫자를 문자로 변환합니다. 마지막 예는ABCDEFGHIJKLMNOP 합니다.

보너스 : 일반적인 경우

{~6?@##

{~6?@## 대략입니다 :

{~6?@##  input: y
      #  length of y
  6  #   six copies of the length
   ?@    random numbers between 0 and the length
{~       taken from y

두 번째 경우에,라는 내장 거기 hfd로 변환 시간F ROM D ecimal. 을 사용하여 9 바이트 솔루션을 얻을 수 있습니다 ,hfd?6#15. 마지막으로 쉽게 읽을 수 있도록 'A'10 바이트 솔루션 의 알파벳을 사용하여 u:65+?6#15총 24 + 9 + 10 = 45를 만듭니다.
miles

@ 마일즈 두 번째 경우에는 대문자가 필요하다고 생각합니다. 마지막 경우는 ... 하하, 죄송합니다. 벡터화 된 덧셈을 완전히 잊었습니다.
Conor O'Brien

1

PHP, 46 + 36 + 35 = 117 바이트

하드 코드 (46 바이트)

for(;$i++<6;)echo"ABC123!@TPOI098"[rand()%15];

(47 바이트)

for(;$i++<6;)echo"ABC123!@TPOI098"[rand(0,14)];

16 진 (소문자) (36 바이트)

for(;$j++<6;)echo dechex(rand()%15);

하드 코딩 된 버전의 대문자, 46 바이트

사용자 지정 (AO) (35 바이트)

for(;$k++<6;)echo chr(rand(65,79));

나는 당신의 두 번째 부분을 받아 들일 수 없다고 생각합니다. ae는 AE와 동일하지 않습니다
James Webster

0

스칼라, 154 바이트

하드 코딩 된 알파벳 (54 바이트) :

Seq.fill(6)("ABC123!@TPOI098"((math.random*14).toInt))

16 진 알파벳 (54 바이트) :

Seq.fill(6)("0123456789ABCDE"((math.random*14).toInt))

맞춤 알파벳 ABCDEFGHIJKLMNO (47 바이트) :

Seq.fill(6)(('A'to'O')((math.random*14).toInt))

설명:

Seq.fill(6)(               //build a sequence of 6 elements, where each element is...
  "ABC123!@TPOI098"(         //from the string
    (math.random*14).toInt   //take a random char
  )
)

'A'to'O' A부터 O까지 15 개의 문자 시퀀스를 만듭니다.


0

, 42 바이트

하드 코딩 된 알파벳, 22 바이트 :

L6ORC"ABC123!@TPOI098"

16 진수, 11 바이트 :

L6ORR15TB16

처음 15 개의 소문자, 9 바이트 :

L6Oz@RR15

설명

세 프로그램 모두 L6O 같이 : 6 번 반복하고 주어진 표현을 출력합니다.

  • RC"...": 하드 코딩 된 문자열에서 임의의 문자 선택
  • RR15TB16: RandRange (15), 16 진수로 변환
  • z@RR15: zRandRange (15)로 색인화 된 소문자 알파벳

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


0

Skript / skQuery , 108 바이트

하드 코드 (43 바이트) :

random 6 char string from `A@cD%F3h9JK{mN!`

0123456789ABCDE (34 바이트) :

random 6 char string from `0-9A-E`

선택 (31 바이트) :

random 6 char string from `A-M`

개구부 `를 왼쪽으로 이동할 수 있습니까 ?
애디슨

@VTCAKAVSMoACE 아니오, 그것은 당신을 못하게합니다
Oliver Ni

0

줄프, 26 + 14 + 13 = 51 바이트

Μ*S6d rG"ABC123!@TPOI098"E

맞춤 알파벳, 24 바이트 여기 사용해보십시오!

Μ*S6d r lp^0wά

0-9A-E 알파벳, 14 바이트 여기 사용해보십시오! lp^0wά되고 lp(0-Z)는 (슬라이스 l부터) 015( ).

Μ*S6d r lp^1ά

1-9A-F 알파벳, 13 바이트. 여기 사용해보십시오! lp^1ά행을 제외하고 상기와 동일한 116 .


일반적인 방법 :

Μ*S6d r
M*S6d      map six newlines over this function:
      r    select random element from array.

다른 시도 (문자열 압축 사용) :

Μ*S6d rGμpwΞ $AE

0

PowerShell v2 +, 45 + 44 + 37 = 126 바이트

고정 알파벳, 45 바이트

-join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})

거의 16 진 알파벳, 44 바이트

-join[char[]](0..5|%{Random(48..57+65..69)})

커스텀 알파벳 (A ~ O), 37 바이트

-join[char[]](0..5|%{Random(65..79)})

이 모든 패턴은 동일한 패턴을 따릅니다. 루프에서에서 05반복 됩니다 . 각 반복은 Random문자 또는 ASCII 값을 선택하고 , char필요한 경우 이를 배열 로 캐스트 -join하고 문자열로 함께 묶습니다. 해당 문자열은 파이프 라인에 남아 있으며 출력은 암시 적입니다.


PS C:\Tools\Scripts\golfing> -join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})
32ATB3

PS C:\Tools\Scripts\golfing> -join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})
III@B2

PS C:\Tools\Scripts\golfing> -join(0..5|%{'ABC123!@TPOI098'[(Random)%15]})
@302O@

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(48..57+65..69)})
74E117

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(48..57+65..69)})
09D7DD

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(65..79)})
COJDFI

PS C:\Tools\Scripts\golfing> -join[char[]](0..5|%{Random(65..79)})
EAKCNJ

-1

파이크, 35 바이트

임의의 알파벳, 20 바이트

6V"ABC123!@TPOI098"H

여기 사용해보십시오!

16 진수 알파벳, 8 바이트

6V~J15<H

여기 사용해보십시오!

~J15< - "0123456789abcdefghijklmno..."[:15]

맞춤 알파벳, 7 바이트

6VG15<H

여기 사용해보십시오!

G15< - alphabet[:15]

알파벳 선택 : abcdefghijklmno

6V     - repeat 6 times:
  ...  -   get alphabet
     H -  choose_random(^)

이것은 6 문자 문자열 대신 6 줄을 줄 바꿈으로 구분하여 출력하는 것 같습니다.
Emigna

질문에 출력 형식이 명시되어 있지 않습니다.
Blue

사양에서 4 개 장소에 6 개 문자열 생성이라는 단어 가 표시됩니다.
Emigna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.