프랑켄슈타인의 괴물의 이름


15

소개:

거의 할로윈이기 때문에 할로윈 테마의 무작위 과제를 생각하고있었습니다. 결국 나는 Frankenstein의 wikipedia 페이지를 읽고 있었고 다음과 같은 텍스트를 보았습니다.

생물

프랑켄슈타인이 그의 창조를 거부 한 것의 일부는 그가 이름을 밝히지 않아서 정체성이 결여된다는 사실이다. 대신 "wretch", "monster", "creature", "demon", "devil", "fiend"및 "it"와 같은 단어로 표시됩니다. 프랑켄슈타인은 10 장에서 그 생물과 대화 할 때, "사악한 곤충", "이상한 괴물", "마음", "포장 된 악마", "악한 악마"로 설명합니다.

출처

도전:

두 개의 정수 (연도 및 장)가 주어지면 다음 규칙에 따라 문자열을 출력하십시오.

  1. 연도가 1818보다 작은 경우 : 빈 문자열 †을 출력하십시오.
  2. 연도가 정확히 1818이고 장이 10 미만인 경우 : 목록에서 임의의 문자열을 출력 하십시오.["wretch", "monster", "creature", "demon", "devil", "fiend", "it"]
  3. 연도가 정확히 1818이고 장이 10 이상인 경우 : 목록에서 임의의 문자열을 출력 하십시오.["vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"]
  4. 1818 년이 지난 해 (그리고 그 책이 출판 됨), return "Frankenstein's Monster".

도전 규칙 :

  • 소문자, 대문자 또는 조합으로 출력할지 여부를 선택할 수 있습니다.
  • 연도는 항상 범위에 있습니다 1500-2017
  • 챕터는 항상 범위 내에 있습니다. 1-24(구글을 올바르게 검색하면 24 개의 챕터가 있습니다)
  • 대신 옵션 1에 대한 빈 문자열을 출력, 당신도 출력 할 수 있습니다 null, undefined, false, 0, 또는 당신의 선택의 다른 값을 다른 세 가지 옵션의 일부가 (당신이 당신의 대답에 사용 한 내용을 적어주세요).
  • 출력에는 선행 또는 후행 공백 / 탭 또는 선행 줄 바꿈이 포함될 수 없습니다. 하나의 선택적 후행 줄 바꾸기가 포함될 수 있습니다.

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙이 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수가있는 기능 / 방법, 전체 프로그램을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다 (특히 '가짜 임의의 숫자' ).
  • 가능하면 코드 테스트 링크를 추가하십시오.
  • 또한 필요한 경우 설명을 추가하십시오.

테스트 사례 :

year,chapter possible outputs:

1700,1       ""; null; undefined; false; 0; etc.
1700,12      ""; null; undefined; false; 0; etc.
1817,10      ""; null; undefined; false; 0; etc.
1818,1       "wretch"; "monster"; "creature"; "demon"; "devil"; "fiend"; "it"
1818,9       "wretch"; "monster"; "creature"; "demon"; "devil"; "fiend"; "it"
1818,10      "vile insect"; "abhorred monster"; "fiend"; "wretched devil"; "abhorred devil"
1818,11      "vile insect"; "abhorred monster"; "fiend"; "wretched devil"; "abhorred devil"
1818,18      "vile insect"; "abhorred monster"; "fiend"; "wretched devil"; "abhorred devil"
1819,1       "Frankenstein's Monster"; "frankenstein's monster"; "FRANKENSTEIN'S MONSTER"
1819,18      "Frankenstein's Monster"; "frankenstein's monster"; "FRANKENSTEIN'S MONSTER"
2017,24      "Frankenstein's Monster"; "frankenstein's monster"; "FRANKENSTEIN'S MONSTER"

답변:


3

펄 5 156 153 151 바이트

DomHastings 덕분에 -3 바이트

로 실행 -p

$_=($d=devil,$m=monster,$w=wretch,<"{creature,demon,it,fiend,vile insect,{abhorr,$w}ed {$d,$d,$m},Frankenstein's $m}">)[/818/?6*/,../+rand 7:$_/606-5]

이 출력 분포는 균일하지 않으며 기본적으로 허용됩니다 . 구체적으로, 날짜가 1818이고 장이 ≥10 인 경우“악한 악마”와“이상한 괴물”이라는 이름은 두 배나 가중됩니다. rand 7목록의 크기가 다르더라도 두 경우 모두에 사용할 수 있습니다 .

1818 년 전의 결과는 "wretched monster"입니다. 일부 유사점에도 불구하고이 문자열은 다른 세 가지 옵션 중 일부 가 아니므 로 사용하는 것이 좋습니다.

이것은 1212 – 2424 범위를 벗어난 몇 년 동안 실패하지만 다행히도 1500-2017 범위의 규칙에 따라 연도가 보장됩니다.

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


나는 괄호 확장이 Perl에 전혀 없다는 것을 몰랐다 ... 그 접근법을 사용하면 , 알려진 알려진 도전에 대한 훌륭한 해결책 이있다 ! 온라인으로 사용해보십시오!
Dom Hastings

@DomHastings Ooh 나는 그런 공간을 인용 할 수 있다는 것을 몰랐다. 여기는 -3 바이트입니다!
Grimmy

기꺼이 도와 드리겠습니다! 나는 확실히 이것을 시도하고 기억해야 할 것입니다 <...>.
Dom Hastings

1
<>는 내용에 따라 readline 또는 glob입니다 (클래식 Perl : 문법은 모호하지만 파서는 DWYM을 시도합니다). 글로브 일 때는 쉘의 일반적인 기능인 가새 확장을 포함하여 쉘 글로브를 모방합니다.
Grimmy

답변에 TIO 링크를 추가 할 수 있습니까? :) 현재 가장 짧은 답변이지만 가장 짧은 것으로 수락하기 전에 모든 것이 작동하는지 확인하고 싶습니다.
케빈 크루이 ssen

9

파이썬 (2) , 227 (220) 214 바이트

lambda y,c:[[choice([["wretch",m,"creature","demon",d,F,"it"],["vile insect",a+m,F,"wretched "+d,a+d]][c>9]),"Frankenstein's "+m][y>1818],0][y<1818]
from random import*
m,d,F,a='monster','devil','fiend',"abhorred "

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


1
'abhorred '하단에있는 목록에 두 번 사용되었으므로 6 바이트를 더 절약 할 수 있습니다 . ( 'wretch'가능하지만 바이트 수는 동일하게 유지됩니다.)
Kevin Cruijssen

6

펄 5 , 172 바이트

171 바이트 코드 + 1 -p.

@a=<><10?($}=wretch,$M=monster,creature,demon,$D=devil,fiend,it):("vile insect",($A="abhorred ").$M,fiend,"$}ed $D",$A.$D);$_=($a[rand@a],"frankenstein's $M",0)[$_<=>1818]

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

설명

꽤 표준적인 것은 약간의 불행한 것만으로 '우주선 연산자'( <=>)를 사용 1818하여 return -1,, 0또는 1입력 $_1818소스 데이터의 마지막, 첫 번째 또는 두 번째 색인을 반환하기 위해 보다 작거나 같거나 큰 경우 . 또한 나는 물고기 연산자를 좋아한다 !


나는을 사용하지 않는 것에 의문을 제기 $F=fiend했지만 테스트 후에는 같은 길이가됩니다.
Kamil Drakari

@KamilDrakari 그래, $시길 때문에 길이가 6 이상이어야한다 :(
Dom Hastings

$}무슨 변수 이름 ...
Titus

@Titus Yup! 많은 특별한 의미가 있지만 거의 모든 것이 작동합니다. 나는 마치 사용 $W했던 ${W}것처럼 다른 편지 옆에있는 것처럼 사용해야 했습니다.
Dom Hastings

1
나는 그것을 생각했다. gotcha none less :)
Titus

4

C 번호 (카메라 번호 컴파일러 C) , 225 (209) 바이트

y=>c=>y<1818?"":y>1818?"frankenstein's monster":"wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')[new System.Random().Next(c>9?6:0,c>9?11:7)];

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

Kevin Cruijssen에게 -16 감사

특히 간결하지는 않지만 C #이 반복되는 문자열을 반복하고 반복하는 것보다 반복적 인 문자열을 선언하고 사용하는 데 더 많은 공간이 필요합니다. Thread.Sleep(1)기본 시딩 Random()은 현재 시간 을 사용하고 실제 기능은 지연없이 후속 실행에서 동일한 시드로 끝날 수 있기 때문에 포함 된 테스트 러너에는 테스트 사례 열거가 있습니다.

func 함수는 currying 구문을 사용합니다 f(year)(chapter)(또는 f 대신 함수가 저장된 이름)


2
나는 도전 과제를 게시 할 때 생각했던 것과 같은 트릭을 적용하여 fiend단일 문자열 배열의 중간에 넣는 것을 보았습니다 . 두 목록 모두에 있기 때문입니다. 당신은 대체하여 몇 바이트를 저장할 수 있습니다 new[]{"wretch","monster","creature","demon","devil","it","fiend","vile insect","abhorred monster","wretched devil","abhorred devil"}"wretch,monster,creature,demon,devil,it,fiend,vile insect,abhorred monster,wretched devil,abhorred devil".Split(',')(-16 바이트)
케빈 Cruijssen

@KevinCruijssen 멋진 트릭은, 바로의 구분 유익하지만 변화하지 않는 것 ","으로 그냥 ,의 이상 차지 .Split(',')에 비해 new[]{}이상의 몇 가지 항목.
Kamil Drakari

3

배쉬, 229 , 206 , 197 , 179 바이트

m=monster
a=("Frankenstein's $m" wretch $m creature demon devil it fiend vile\ insect {abhorr,wretch}ed\ {devil,$m})
echo "${a[$1>1818?0:$1<1818?13:RANDOM%($2>9?5:7)+($2>9?7:1)]}"

가새 / 가변 확장에 대한 설명

m=monster
{abhorr,wretch}ed\ {devil,$m}

처음으로 확장

abhorred\ {$m,devil} wretched\ {devil,$m}
abhorred\ $m abhorred\ devil wretched\ devil wretched\ $m

그런 다음 변수 m이 확장됩니다

abhorred\ monster abhorred\ devil wretched\ devil wretched\ monster

그러나 때문에 작동하지 않습니다 다음 $w첫 번째와 결합됩니다 edwed정의되지 않고, 빈 문자열로 확장됩니다.

m=monster
w=wretch
{abhorr,$w}ed\ {devil,$m}

arround w에 명시 괄호를 추가하여 수행 할 수 있지만 더 길어집니다.

m=monster
w=wretch
{abhorr,${w}}ed\ {devil,$m}

TIO


wretchmonster( 225 바이트 )에 대한 변수를 작성하여 4 바이트를 저장할 수 있습니다 .
Kevin Cruijssen

변수 확장 전에 발생하는 괄호 확장 때문에 그렇게 간단하지 않음
Nahuel Fouilleul

나는 (거의) Bash로 프로그래밍하지 않았으므로 그 의미를 명확히 할 수 있습니까? TIO 에서 작동하는 것 같지만 프로그래밍 언어의 작동 방식으로 인해 뭔가 빠졌습니다.
Kevin Cruijssen

1
@KevinCruijssen thnak 중괄호가 마지막 요소 확장 작업 일 때 뭔가를 배웠습니다
Nahuel Fouilleul

1
@DomHastings는, 그래, 고정
나우 Fouilleul에게

2

APL (Dyalog Unicode) , 189 바이트

m'monster'
a'abhorred ',⊢
f'fiend'
d'devil'
{⊃⍵=1818:{⊃⌽⍵<10:(?7)⊃'wretch'm'creature' 'demon'd f'it'⋄(?5)⊃'vile insect'(a m)f('wretched ',⊢d)(a d)}⍵⋄{⊃⍵>1818:'frankenstein''s ',⊢m''}⍵}

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

테스트하려면 테스트 케이스를 마지막 중괄호에 추가하십시오.

{⊃⍵=1818:{⊃⌽⍵<10:(?7)⊃'wretch'm'creature' 'demon'd f'it'⋄(?5)⊃'vile insect'(a m)f('wretched ',⊢d)(a d)}⍵⋄{⊃⍵>1818:'frankenstein''s ',⊢m''}⍵}1818 10

주요 공백 ​​문제를 해결해 주신 @ngn에게 감사드립니다.

작동 방식 :

APL은 문자열 을 문자의 배열 ( 벡터 ) 'wretch' 'creature'로 해석 하므로 다른 언어에서는 다음과 같이 해석됩니다.[[w,r,e,t,c,h],[c,r,e,a,t,u,r,e]]

다음은 도우미 기능입니다.

m'monster'      #These are pretty self explanatory, variables m, f and d are being set to 'monster', 'fiend' and 'devil respectively.
f'fiend'
d'devil'
a'abhorred ',⊢  # a is being set to 'abhorred ' concatenated with the argument to it's right.

이것은 주요 기능이며 더 나은 이해를 위해 3 부분으로 나뉩니다.

{⊃⍵=1818:{⊃⌽⍵<10:(?7)⊃'wretch'm'creature' 'demon'd f'it'⋄(?5)⊃'vile insect'(a m)f('wretched ',⊢d)(a d)}⍵⋄{⊃⍵>1818:'frankenstein''s ',⊢m''}⍵}

1 부:

{⊃⍵=1818:{Part2}⍵⋄{Part3}⍵} # First conditional
        :                   # If
                           # the first element
                           # of the argument ⍵
   =1818                    # Equals the literal 1818
         {Part2}⍵           # Executes part 2 with argument ⍵
                           # Else
                  {Part3}⍵  # Executes part 3 with argument ⍵

2 부:

{⊃⌽⍵<10:(?7)⊃'wretch'm'creature' 'demon'd f'it' # Second conditional
(?5)⊃'vile insect'(a m)f('wretched ',⊢d)(a d)}⍵                
       :                                         # If
                                                # the first element
                                                # of the inverse
                                                # of the argument ⍵
    <10                                          # is less than 10
                                                # pick the nth
       (?7)                                      # random element between [1,7]
            'wretch'm'creature' 'demon'd f'it'   # from this string array
                                                # Else
                                                # pick the nth
(?5)                                             # random element between [1,5]
     'vile insect'(a m)f('wretched ',⊢d)(a d)    # from this string array
                                             }⍵  # using argument ⍵

3 부 :

{⊃⍵>1818:'frankenstein''s ',⊢m''}⍵ # Third conditional
        :                           # If
                                   # the first element
                                   # of the argument ⍵
   >1818                            # is greater than 1818
         'frankenstein''s ',⊢m      # print the string "frankenstein's" concatenated with m (which prints monster)
                                   # else
                               ''   # print an empty string
                                 }⍵ # with argument ⍵

2

자바 (오픈 JDK 8) , 275 (269) 255 207 203 바이트

y->c->y<1818?0:y>1818?"Frankenstein's monster":"wretch;monster;creature;demon;devil;it;fiend;vile insect;abhorred monster;wretched devil;abhorred devil".split(";")[c+=Math.random()*(c>9?5:7)+(c>9?6:0)-c]

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




1
203 바이트 . 작동시키는 IntFunction대신에 s를 사용하십시오 Function<Integer>.
Olivier Grégoire

2

PHP, 184176 바이트

<?=strtr([0,1,2,Creature,Demon,It,Fiend,30,31,"2ed 1","Vile Insect","Frankenstein´s 0"][[rand(6*$x=$argv[2]>9,6+4*$x),11][$argv[1]<=>1818]],[Monster,Devil,Wretch,"Abhorred "]);

실행 -n및 명령 행 인수로 올해 장을 제공하거나 온라인으로 시도 .

index와 결과는 NULL1818 년 미만으로 평가 되어 빈 출력으로 이어집니다.


무엇을 $argv[1]<=>1818합니까? 나는 그것을 본 적이 없다.
YU NO WORK


1

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

a="abhorred ",d="devil",f="fiend",m="monster"
y=>c=>y<1818?0:y>1818?"frankenstein's "+m:(l=c<10?[f,"wretch",m,"creature","demon",d,f,"it"]:["vile insect",a+m,f,"wretched "+d,a+d])[0|Math.random()*l.length]

0연도가 1818보다 작은 경우 반환


1

자바 스크립트 199 바이트

M="monster"
A=(y,c)=>y<1818?"":y^1818?"Frankenstein's "+M:[W="wretch",M,"creature","demon",D="devil",F="fiend","it","vile insect",(H="abhorred ")+M,F,W+"ed "+F,H+D][Math.random()*(c>9?5:7)+7*(c>9)|0]

console.log(A(1700,1))
console.log(A(1700,12))
console.log(A(1817,10))
console.log(A(1818,1))
console.log(A(1818,9))
console.log(A(1818,10))
console.log(A(1818,11))
console.log(A(1819,1))
console.log(A(1819,18))
console.log(A(2017,24))


1

C, 380 바이트

void ok(int *year, int* chapter){char*below_10[] = {"wretch", "monster", "creature", "demon", "devil", "fiend", "it"}; char*at_10[] = {"vile insect", "abhorred monster", "fiend", "wretched devil", "abhorred devil"}; year < 1818?printf("0"):(year == 1818?(chapter<10 printf("%s",below_10[rand()%8]):printf("%s",at_10[rand()%7])):printf("Frankenstein's Monster"));}

4
안녕하세요, PPCG에 오신 것을 환영합니다! 코드 골프 도전에서 목표는 가능한 한 적은 바이트를 갖는 것입니다. 따라서 메소드 / 변수 이름은 단일 문자로 가장 좋습니다. 또한 불필요한 공백과 줄 바꾸기를 모두 제거 "Frankenstein's Monster"하고 변수를 만드는 대신 직접 줄을 사용할 수 있습니다. 또한, 어디에 yearchapter지금부터 오는? 메소드의 매개 변수로 보지 않습니다. <모든 언어> 에서의 골프 팁C에서의 골프 팁 이 유용 할 수 있습니다. 체류를 즐길 수! :)
Kevin Cruijssen

문제 없어요. 그리고 당신은 조금 더 골프를 할 수 있습니다 :void o(int y,int c){char*b[]={"wretch","monster","creature","demon","devil","fiend","it"},*a[]={"vile insect","abhorred monster","fiend","wretched devil","abhorred devil"};printf("%s",y<1818?0:y==1818?c>9?a[rand()%6]:b[rand()%7]:"Frankenstein's Monster");} 256 바이트 여기에서보십시오! (필요하지 않은 모든 공백을 제거하고 메서드 / 변수 / 매개 변수의 이름을 한 글자로 printf변경 <10했습니다 >9. 삼항 -if에서 단일 괄호에서 불필요한 괄호를 제거했습니다.;;;로 변경 등) rand()TIO에서 왜 작동 하지 않는지 잘 모르겠습니다 .. : S
Kevin Cruijssen


1

MBASIC , 288 바이트

1 DIM R$(12):FOR I=1 TO 12:READ R$(I):NEXT:INPUT Y,C:IF Y<1818 THEN 5
2 IF Y>1818 THEN O$="Frankenstein's Monster":GOTO 5
3 IF C>9 THEN O=7
4 O$=R$(O+INT(RND(1)*N+1))
5 PRINT O$:DATA wretch,monster,creature,demon,devil,fiend,it,vile insect,abhorred monster,fiend,wretched devil,abhorred devil

0

05AB1E , 114 110 바이트

0…뢼–±¹.•ʒ¦Ë"ìËM₂G¶тá≠•ì#.•1ÏiT¥Ƶʒ“T¡Äg… 5ÀΘO¼™Ãí?ιË%4₄‡‡λYιi¾н••Jtm•17в£‚…'s 'ì³R7£R’¡¬ÿÿ±¹’¸¸)sŽ7X.S>èsT@èΩ

0연도가 아래에있을 때 출력 합니다 1818.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

0                    # Push a 0
…뢼–±¹              # Push dictionary string "creature devil monster"
 .•ʒ¦Ë"ìËM₂G¶тá≠•   "# Push compressed string "demon fiend it wretch "
  ì                  # Prepend it: "demon fiend it wretch creature devil monster"
   #                 # Split by spaces: ["demon","fiend","it","wretch","creature","devil","monster"]
.•1ÏiT¥Ƶʒ“T¡Äg 5ÀΘO¼™Ãí?ιË%4₄‡‡λYιi¾н•
                     # Push compressed string "abhorred devilabhorred monsterfiendvile insectwretched devil"
 Jtm               # Push compressed integer 1249548
      17в            # Converted to Base-17 as list: [14,16,5,11,14]
         £           # Split the string into parts of that size: ["abhorred devil","abhorred monster","fiend","vile insect","wretched devil"]
                    # Pair both string-lists together
's                 '# Push string "'s "
   'ì³              '# Push dictionary string "liechtenstein"
      R7£R           # Leave the last 7 characters: "enstein"
          ’¡¬ÿÿ±¹’   # Push dictionary string "frankÿÿmonster", where the "ÿ" are automatically
                     # replaced with the strings at the top of the stack: "frankenstein's monster"
                  ¸¸ # Wrap it twice into a list: [["frankenstein's monster"]]
)                    # Wrap everything on the stack into a list
                     # (We now have: [0,[["demon","fiend","it","wretch","creature","devil","monster"],["abhorred devil","abhorred monster","fiend","vile insect","wretched devil"]],[["frankenstein's monster"]]])
 s                   # Swap to get the first (implicit) input
  Ž7X                # Push compressed integer 1818
     .S              # Compare it with the input (-1 if below; 0 if equal; 1 if above)
       >             # Increase it by 1 (0 if below; 1 if equal; 2 if above)
        è            # Use it to index into the list
         s           # Swap to get the second (implicit) input
          T@         # Check if it's larger than or equal to 10 (results in 0 for falsey; 1 for truthy)
            è        # Use it to index into the inner list
             Ω       # And finally get a random value from that list (which is output implicitly)

이 05AB1E 내 팁을보십시오 ( 사전 사용법은 무엇입니까? 방법 ; 일부가 아닌 문자열 을 압축하는 방법 ? ; 큰 정수 를 압축하는 방법 ? ; 및 정수 목록을 압축하는 방법? ) 을 참조하십시오.

  • …뢼–±¹이다 "creature devil monster";
  • .•ʒ¦Ë"ìËM₂G¶тá≠•이다 "demon fiend it wretch ";
  • .•1ÏiT¥Ƶʒ“T¡Äg… 5ÀΘO¼™Ãí?ιË%4₄‡‡λYιi¾н•이다 "abhorred devilabhorred monsterfiendvile insectwretched devil";
  • •Jtm•이다 1249548•Jtm•17в이다 [14,16,5,11,14];
  • 'ì³이다 "liechtenstein ";
  • ’¡¬ÿÿ±¹’이다 "frankÿÿmonster";
  • Ž7X입니다 1818.

-1

자바 스크립트, 194 B

e=Math.random,f=Math.floor;x=(a,b,c=`insect,monster,wretch,creature,demon,devil,fiend,it`.split`,`,d=[`vile `,`abhorred `])=>a<1818||a-1818?`Frankenstein's `+c[1]:(b<10||c[f(e()*2)])+c[f(e()*8)]

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