단어의 문자열을 정수로 변환


19

숫자를 단어로 포함하는 문자열을 선행 0을 무시하고 정수로 변환하십시오.

  • "four two"-> 42.
  • "zero zero zero one"-> 1.

가정

제출물은 다음을 가정 할 수 있습니다.

  1. 입력 문자열은 공백으로 구분 된 숫자 단어로 구성됩니다.
  2. 모든 단어는 유효하며 ( "zero".. "nine"범위) 소문자입니다. 빈 입력의 동작은 정의되어 있지 않습니다.
  3. 입력 문자열은 항상 범위 내의 부호없는 숫자를 나타내며 int절대로 빈 문자열이 아닙니다.

채점

더 적은 바이트를 사용하면 답이 바이트 단위로 점수가 매겨집니다.


3
사이트에 오신 것을 환영합니다. 여기서 누락 된 질문에서 일반적으로 기대하는 몇 가지 사항이 있습니다. 가장 중요한 것은 모든 과제에 반드시 필요한 객관적인 점수 기준 입니다.
밀 마법사

3
그 외에도이 질문은 사양이 매우 희박합니다. 모호함없이 제출에 필요한 내용을 정확하게 지정해야합니다. 한 문장과 예제는 우리의 도전에 대한 우리의 명확성 표준에 달려 있지 않습니다.
밀 마법사

3
이미 언급 한 내용 외에도 사용자가 도전 과제를 게시하기 전에 도전 과제를 게시 할 수 있는 샌드 박스 가 있습니다. 그렇게하면 게시물을 작성할 때 정보가 더 적게 나타납니다. 합리적으로 긍정적 인 반응을 보이는 사이트의 다른 최근 게시물을 보면 귀하의 질문과 솔루션이 우리가하는 일과 일치하지 않는다는 것을 알 수 있습니다.
FryAmTheEggman

3
pedantic의 위험에, 나는 range "zero".."nine"완전히 지정되지 않은 것을 지적하고 싶습니다 .
관련이없는 문자열

4
짜증나게 내장 Interpreter@"SemanticNumber"은 Mathematica에서 정확하게이 작업을 수행 zero zero 합니다.
그렉 마틴

답변:


22

PHP , 74 바이트

foreach(explode(' ',$argn)as$w)$n.='793251_8640'[crc32($w)%20%11];echo+$n;

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

기존 답변을 복사하지 않는 솔루션을 얻으려고했습니다. 각 단어에 대해 32 비트 길이 ( crc32 ) 의 순환 중복 검사 합 다항식을 얻은 다음 mod 20 및 mod 11을 수행하여 각 숫자에 대해 0에서 10까지 고유 값을 섞습니다 (6 누락). 그런 다음 고유 한 값을 사용하여 실제 숫자를 찾습니다.

| Word  | CRC32      | %20 | %11 | Equivalent digit |
|-------|------------|-----|-----|------------------|
| zero  | 2883514770 | 10  | 10  | 0                |
| one   | 2053932785 | 5   | 5   | 1                |
| two   | 298486374  | 14  | 3   | 2                |
| three | 1187371253 | 13  | 2   | 3                |
| four  | 2428593789 | 9   | 9   | 4                |
| five  | 1018350795 | 15  | 4   | 5                |
| six   | 1125590779 | 19  | 8   | 6                |
| seven | 2522131820 | 0   | 0   | 7                |
| eight | 1711947398 | 18  | 7   | 8                |
| nine  | 2065529981 | 1   | 1   | 9                |

다른 74 바이트 CRC32 대안 사용 %493%10: 온라인 사용해보십시오!

다른 74 바이트 CRC32 대안 사용 %2326%11: 온라인 사용해보십시오!


PHP , 74 바이트

foreach(explode(' ',$argn)as$w)$n.=strpos(d07bfe386c,md5($w)[21]);echo+$n;

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

길이가 같은 다른 대안 md5은 단어 에서 22 번째 문자 (각 단어에 고유 한 값을 제공하는 문자 만)를 사용한 다음 해당 문자를 사용하여 숫자에 매핑합니다.


이것은 멋진 답변입니다
Juan Sebastian Lozano



6

젤리 ,  19  17 바이트

Ḳµ7ị“*;nÄƲ]³Ṙ»i)Ḍ

정수를 생성하는 문자 목록을 허용하는 모나 딕 링크.

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

내 Python 2 답변의 포트입니다.


이전

ḲŒ¿€i@€“©¥q£½¤MÆÑ‘Ḍ

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

아마도 짧은 방법은, 그러나이 먼저 마음에 온 방법이다.


발견되지 않기 때문에 enklact 문자열에서 0을 제거하면 찾을 수 없으므로 영리합니다!
관련이없는 문자열

1
아, 당신도 같은 방법으로 했어요.
Jonathan Allan

5

파이썬 3 , 107 , 91 , 77 , 90 바이트

Sriotchilism O'Zaic의 -16 바이트

선행 0을 제거하는 +13 바이트

lambda s:int(''.join(map(lambda w:str('zeontwthfofisiseeini'.index(w[:2])//2),s.split())))

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



좋은 것! 이렇게하면 구분 기호를 완전히 삭제할 수도 있습니다.
movatica

1
챌린지 업데이트로 선행 0이 포함되어 더 이상 유효하지 않습니다. :(
밀 마법사


1
@movatica 수정 내용이 잘못되었습니다. 이 lstrip메소드는 인수로 주어진 문자열의 모든 문자를 제거하므로 "e"가 제거 될 때 "eight two"는 "ight two"가됩니다. 또한 "제로 제로 제로"는 "0"을 인쇄해야하며 오류는 발생하지 않습니다.
NemPlayer



3

05AB1E , 18 16 바이트

#ε6è}.•ƒ/ÿßÇf•Åβ

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

설명:

#                 # Split the (implicit) input-string on spaces
 ε  }             # Map each string to:
  6è              #  Get the character at 0-based index 6 (with automatic wraparound)
     .•ƒ/ÿßÇf    # Push compressed string "rothuvsein"
              Åβ  # Convert the characters from custom base-"rothuvsein" to an integer
                  # (after which the top of the stack is output implicitly as result)

이 05AB1E 광산의 팁을 참조하십시오 (섹션 압축 문자열 사전의 일부에 어떻게? ) 이유를 이해하는 .•ƒ/ÿßÇf•것입니다 "rothuvsein".



3

05AB1E , 17 16 바이트

•D±¾©xWÄ0•I#HèTβ

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

다른 05AB1E answer 와 완벽하게 연계 되지만 완전히 다른 접근법을 사용합니다.

•D±¾©xWÄ0•               # compressed integer 960027003010580400
          I#             # split the input on spaces
            H            # convert each word from hex (eg "one" => 6526)
             è           # index (with wrap-around) into the digits of the large integer
              Tβ         # convert from base 10 to integer

3

레티 나 0.8.2 , 46 45 바이트

\w+
¶$&$&$&
%7=T`r\ot\huvs\ein`d`.
\D

^0+\B

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

\w+
¶$&$&$&

각 단어를 자신의 줄에 넣고 세 번 씁니다.

%7=T`r\ot\huvs\ein`d`.

@UnrelatedString의 문자열을 사용하여 각 줄의 7 번째 문자를 음역하십시오.

\D

숫자가 아닌 나머지 문자를 모두 삭제하십시오.

^0+\B

선행 0을 삭제합니다 (그러나 최소한 한 자리는 그대로 두십시오).

이전 46 바이트보다 전통적인 솔루션 :

T`z\wuxg`E
on
1
th
3
fi
5
se
7
ni
9
\D

^0+\B

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

T`z\wuxg`E

단어는 zero, two, four, sixeight고유 문자를 포함 zwuxg. 그것들을 짝수로 음역하십시오.

on
1
th
3
fi
5
se
7
ni
9

홀수 자릿수는 각 단어의 처음 두 글자를 개별적으로 일치시킵니다.

\D

숫자가 아닌 나머지 문자를 모두 삭제하십시오.

^0+\B

선행 0을 삭제합니다 (그러나 최소한 한 자리는 그대로 두십시오).


2

젤리 , 20 18 17 바이트

Ḳ7ị“*;nÄƲ]³Ṙ»iƲ€Ḍ

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

-2 실행 바이트 "rothuvsein" 을 통해 user202729의 문자열 압축기 .

Jonathan Allan의 0이없는 enklact 문자열을 훔쳐서 조금 다르게 구조화 된 프로그램에 넣은 -1 바이트.

Ḳ                    Split the input on spaces,
              Ʋ€     for each word
             i       find the 1-based index (defaulting to 0)
   “*;nÄƲ]³Ṙ»        in "othuvsein"
 7ị                  of the element at modular index 7,
                Ḍ    and convert from decimal digits to integer.


2

Japt , 13 바이트

¸mg6 ì`Ψuv 

시도 해봐

다른 사람들이 같은 생각으로 날 이길 것 같은데이 - 자신을 짐승 힘에 압축을위한 최적의 문자열을 스크립트를 작성의 번거 로움을 저장 한 수 만 인덱스까지 그를 찾기 위해 1,000,000내가 가진 않았다, 조기이었다 (내 caffeine yet!), "rothuvsein" 만이 가능한 문자열입니다!

¸mg6 ì`...     :Implicit input of string
¸              :Split on spaces
 m             :Map
  g6           :  Character at index 6 (0-based, with wrapping)
     ì         :Convert from digit array in base
      `...     :  Compressed string "rothuvsein"

압축 된 문자열 코드 포인트의 문자를 포함 206, 168, 117, 118, 160136.


1
... 정말로 1000000까지 시도 했습니까? 숫자 이름 길이의 lcm은 60이므로 그 이상으로 시도하지 않아도됩니다 (60은 0, 61에서 1 등입니다).
그리미

1
@ 그림, 일찍, 아직 카페인이 없었습니다! 모든 가능성을 생성하기 위해 작성한 스크립트에 백만을 꽂는 것은 다른 숫자만큼 쉬웠으며 LCM에서 수학을하는 것을 저에게 저장했습니다.
얽히고 설킨

2

루비 , 63 바이트 , 52 바이트 , 50 바이트

p $*.map{|d|'rothuvsein'.index (d*3)[6]}.join.to_i

가치 잉크 팁 덕분에 -2


Code Golf에 오신 것을 환영합니다! Ruby에서는 $*의 별칭 ARGV이므로 추가 바이트를 절약 할 수 있습니다.
가치 잉크

2

T-SQL, 110 바이트

SELECT 0+STRING_AGG(CHARINDEX(LEFT(value,2),'_ontwthfofisiseeini')/2,'')
FROM STRING_SPLIT((SELECT*FROM i),' ')

줄 바꿈은 가독성을위한 것입니다.

나는

설명:

  1. STRING_SPLIT 입력 문자열을 가져 와서 공백으로 구분합니다.
  2. CHARINDEX처음 2자를 가져 와서 문자열에서 (1 기반) 위치를 반환합니다 '_ontwthfofisiseeini'. 'ze'for 0은 문자열에없고 "찾을 수 없음"에 대해 0을 반환합니다. 밑줄은 우리가 2의 배수만을 얻도록 보장합니다.
  3. 마지막 숫자를 얻기 위해 2로 나눕니다.
  4. STRING_AGG 구분 기호없이 숫자를 다시 스매시
  5. 0+암시 적 변환을 INT로 강제하고 선행 0을 삭제합니다. 1*작동합니다.

2

x86 기계 코드, 46 바이트

16 진 덤프 :

57 53 33 c0 33 ff f6 01 0f 75 15 6a 0a 5b 99 f7
f3 6b ff 0a 03 fa 33 c0 38 01 75 0f 97 5b 5f c3
69 c0 26 2b aa 6e 32 01 c1 e8 02 41 eb d8

그것은의 fastcall기능 -의 문자열에 대한 포인터를 수신 ecx하고있는 결과를 반환합니다 eax.

매직 번호로 해싱 함수의 승산 1856645926하는 않는 XOR오른쪽으로 2 비트 입력 바이트와, 및 이동한다.

noclobber 레지스터 ( ediebx)를 저장하고 복원하는 데 4 바이트가 걸렸지 만이 를 구현하는보다 효율적인 방법을 찾지 못했습니다. 상수 10을 저장ebx 것은 특히 성가신 이었습니다!

해당 코드 바이트로 분해 :

57                   push        edi  ; edi = result
53                   push        ebx  ; we use ebx to store the constant 10
33 C0                xor         eax,eax  
33 FF                xor         edi,edi  
    myloop:
F6 01 0F             test        byte ptr [ecx],0Fh  ; check for end of word
75 15                jne         myhash
6A 0A                push        0Ah  
5B                   pop         ebx  
99                   cdq              ; prepare 64-bit dividend in edx:eax
F7 F3                div         eax,ebx  ; find the remainder of division by 10
6B FF 0A             imul        edi,edi,0Ah
03 FA                add         edi,edx  ; update the result
33 C0                xor         eax,eax  ; reset the hash temporary variable
38 01                cmp         byte ptr [ecx],al  ; check for end of input (here al=0)
75 0F                jne         mycontinue
97                   xchg        eax,edi  ; set the return register
5B                   pop         ebx  ; restore registers
5F                   pop         edi  ; restore registers
C3                   ret  
    myhash:
69 C0 26 2B AA 6E    imul        eax,eax,6EAA2B26h  ; hashing...
32 01                xor         al,byte ptr [ecx]  ; hashing...
C1 E8 02             shr         eax,2  ; hashing...
    mycontinue:
41                   inc         ecx  ; next input byte
EB D8                jmp         myloop

동등한 C 코드 :

int doit(const char* s)
{
    int result = 0;
    unsigned temp = 0;
    while (true)
    {
        int c = *s++;
        if ((c & 15) == 0)
        {
            temp %= 10;
            result = result * 10 + temp;
            temp = 0;
            if (c == 0)
                break;
            else
                continue;
        }
        temp *= 1856645926;
        temp ^= c;
        temp >>= 2;
    }
    return result;
}

마법의 숫자를 어떻게 찾았습니까?
Sparkler

C 코드를 사용하여 검색을 수행했습니다. 모든 32 비트 숫자와 모든 시프트를 시도했습니다. 이 몇 가지 가능성이 있습니다 - 코드는 2000000000.의 범위까지에서 하나의 발견
anatolyg

edi 대신 edx를 사용하여 (idiv 앞에 edx를 푸시하고, 그 뒤에 pop eax를, ebx로 imul을, edx에 eax를 추가) 1 바이트를 저장할 수 있습니다.
피터 페리



1

, 19 바이트

I⍘⭆⪪S §ι⁶rothuvsein

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. @KevinCruijssen의 05AB1E 답변 포트. 설명:

    S               Input string
   ⪪                Split on spaces
  ⭆                 Map over words and join
       ι            Current word
      §             Cyclically indexed
        ⁶           Literal `6`
 ⍘       rothuvsein Custom base conversion
I                   Cast to string for implicit print

1

PowerShell , 48 바이트

+-join($args|%{'rothuvsein'.indexof(($_*3)[6])})

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

rothuvseinJonathan Allan 덕분에 다른 사람들 과 같은 트릭을 사용합니다 . TIO에서 별도의 명령 줄 인수로 나타나는 스플래 팅을 통해 입력 인수를 예상합니다.


1

코 틀린, 83 바이트

fun String.d()=split(' ').fold(""){a,b->a+"rothuvsein".indexOf((b+b+b)[6])}.toInt()

long을 지원하려면 +1 바이트 toLong()

코 틀린의 좋은 몇 가지 귀중한 바이트 덕분에 절약 다른 사람과 동일 rothuvsein 트릭, toInt()fold(). 나는 더 많은 바이트가 면도 될 수 있다는 느낌을 떨칠 수 없다.



1

Windows 배치, 169 바이트

@setlocal enabledelayedexpansion
@set z=zeontwthfofisiseeini
:a
@set b=%1
@for /l %%c in (0,2,18)do @if "!b:~0,2!"=="!z:~%%c,2!" set/aa=a*10+%%c/2&shift&goto a
@echo %a%


0

VBA, 160 바이트

Function e(s)
s = Split(s, " ")
For i = LBound(s) To UBound(s)
s(i) = Int((InStr("ontwthfofisiseeini", Left(s(i), 2)) + 1) / 2)
Next
e = Val(Join(s, ""))
End Function

문자열에서 처음 두 문자를 찾습니다 (제로 제외).


0

베이컨 , 83 72 바이트

문자열이 w $로 제공된다고 가정하면이 코드는 각 단어의 고유 한 처음 2자를 기준으로 정규식을 사용하여 "zeontwthfofisiseeini"에서 색인을 찾습니다. 그런 다음 정확한 결과를 제공하기 위해 인덱스를 2로 나눕니다.

FOR x$ IN w$:r=r*10+REGEX("zeontwthfofisiseeini",LEFT$(x$,2))/2:NEXT:?r
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.