찾아 회전


30

작업

이것은 간단한 도전입니다. 입력은 숫자 0123456789와 해시 만 포함 된 비어 있지 않은 단일 문자열 #입니다. 음수가 아닌 정수를 인코딩하고 문자열의 끝을 감싸는 적어도 하나의 자릿수를 정확하게 포함합니다 #. 정수는 선행 0을 가질 수 있습니다. 예를 들어 ##44##, 013####23###1유효한 입력입니다, 동안 ###, 0099그리고 #4#4수 없습니다.

당신의 작업은 n문자열 에서 정수를 추출 하고 문자열 회전 n단계를 오른쪽 으로 출력하는 것 입니다.

  • 입력 #1##은 오른쪽으로 1 단계 회전해야 올바른 출력은 ##1#입니다.
  • #026###선행 0이 무시되므로 입력 을 오른쪽으로 26 단계 회전해야합니다. 올바른 출력은 26####0입니다.
  • 입력 1####2은 끝에 랩핑 된 정수 21을 포함하므로 오른쪽으로 21 단계 회전해야합니다. 올바른 출력은 ##21##입니다.

규칙과 득점

전체 프로그램이나 함수를 작성할 수 있습니다. 바이트 수가 가장 적고 표준 허점이 허용되지 않습니다.

숫자 n가 표준 int언어 유형에 맞는 것으로 가정 할 수 있습니다. 반대로, 표준 int유형이 임의의 정밀도 정수를 구현 하는 경우 이론적으로 임의로 큰을 지원해야합니다 n.

테스트 사례

#1## -> ##1#
##4## -> #4###
1####1 -> ####11
1####2 -> ##21##
#026### -> 26####0
#000### -> #000###
###82399 -> ##82399#
51379#97 -> #9751379
#98##### -> ###98###
#######4## -> #4########
60752#1183 -> 8360752#11
####99366800## -> 366800######99
########9##### -> ###9##########
91#####515694837 -> 1#####5156948379
###6114558###### -> #6114558########
######219088736090042#### -> 9088736090042##########21
#46055080150577874656291186550000138168########### -> 0138168############4605508015057787465629118655000
568375993099127531613012513406622393034741346840434468680494753262730615610086255892915828812820699971764142551702608639695081452206500085233149468399533981039485419872101852######################3680 -> 99533981039485419872101852######################36805683759930991275316130125134066223930347413468404344686804947532627306156100862558929158288128206999717641425517026086396950814522065000852331494683

7
모든 테스트 사례를 지원해야합니까? 그 숫자 중 일부는 꽤 큽니다 ... 8 비트 정수가있는 언어를 사용할 수 있습니까?
Dennis

@Dennis 실제로 메모리에 정수를로드하지 않고 모듈 식 산술로 문제를 해결할 수는 있지만 많은 언어에서 번거 롭습니다. 언어 n의 기본 int유형 (임의의 정밀도 일 수 있음)에 맞는 테스트 사례 만 처리해야한다고 가정 해 보겠습니다 . 나중에 챌린지 텍스트를 업데이트하겠습니다.
Zgarb 2019

input = 1234? 인 경우 어떻게해야 합니까?
CalculatorFeline

2
@CatsAreFluffy "및 적어도 하나의 #"
FryAmTheEggman

답변:


10

CJam, 11 바이트

q_'#%W%sim>

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

관련된 숫자가 64 비트에 맞지 않기 때문에 마지막 두 테스트 사례에서는이 기능이 작동하지 않습니다.

작동 원리

q_          e# Read all input and push it twice.
  '#%       e# Split at runs of '#'.
     W%     e# Reverse the resulting array.
       si   e# Cast to string, then to int.
         m> e# Rotate the original input that many places to the right.

우우 ... 너무 간단합니다!
Luis Mendo

7

줄리아, 71 65 바이트

s->join(circshift([s...],maximum(parse,split(s*s,"#",keep=1<0))))

이것은 문자열을 받아들이고 문자열을 반환하는 익명 함수입니다. 호출하려면 변수에 지정하십시오.

입력을 그 자체에 추가하고 #, 구분자 로 사용하여 배열로 나누고 , 각 정수를 구문 분석하고 최대 값을 취합니다. 이것은 문자열을 오른쪽으로 이동하는 횟수를 정의합니다. 우리는 문자열을 Char배열 로 옮겼다 join.


7

파이썬, 66 바이트

lambda l:(2*l)[-int(''.join(l.split('#')[::-1]))%len(l):][:len(l)]

5

망막, 65 57 49

(\ d *) # * (\ d +)
$ 2 $ 1 $ 0
^ \ d +
$ *
+`1 (. *) (.)
 $ 2 $ 1
<공간>

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

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

온라인으로, 대부분의 제정신 기계에서, 일부 큰 기계에서는 메모리가 시간 초과 / 소진됩니다.

문자열의 마지막 숫자와 문자열의 첫 번째 숫자 또는없는 숫자를 사용하여 문자열 앞에 놓습니다. 그런 다음 결합 된 숫자를 단항으로 변환하고 단항 자릿수를 삭제하는 동안 반복적으로 회전합니다.


3

젤리, 12 10 바이트

ẋ2~ṣ0‘ḌṂṙ@

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

배경

입력이라고 가정하십시오 51379#97.

문자열을 두 번 반복하면 ( 51379#9751379#97) 연속 된 숫자 표현을 포함 할 수 있습니다.

다음으로 모든 문자에 비트가 아닌 비트를 적용합니다. 이것은 int로 캐스트하려고 시도하므로 '1'1로 평가 된 다음 ~ 1 = -2에 매핑됩니다 . 실패하면 ( #) 0 을 반환합니다 .

이 예에서는

[-6, -2, -4, -8, -10, 0, -10, -8, -6, -2, -4, -8, -10, 0, -10, -8]

다음으로 숫자를 인코딩하는 부분을 나머지 부분과 분리하기 위해 0으로 분할합니다.

[[-6, -2, -4, -8, -10], [-10, -8, -6, -2, -4, -8, -10], [-10, -8]]

비트 단위 NOT은 n-n-1에 매핑 하므로 각각을 증가시켜 -n 을 얻습니다 .

[[-5, -1, -3, -7, -9], [-9, -7, -5, -1, -3, -7, -9], [-9, -7]]

다음으로 각 목록을 10 진수에서 정수로 변환합니다.

[-51379, -9751379, -97]

가장 낮은 숫자는 검색중인 숫자의 음수입니다. 젤리리스트 회전 아톰 왼쪽 으로 회전하기 때문에 -1 을 곱하여 오른쪽으로 회전 하지 마십시오 .

작동 원리

ẋ2~ṣ0‘ḌṂṙ@  Main link. Input: S (string)

ẋ2          Repeat the string twice.
  ~         Apply bitwise NOT to all characters.
            This maps 'n' to ~n = -(n+1) and '# to 0.
   ṣ0       Split at occurrences of zeroes.
     ‘      Increment all single-digit numbers.
      Ḍ     Convert each list from base 10 to integer.
       Ṃ    Take the minimum.
        ṙ@  Rotate S that many places to the left.

3

MATL , 28 25 17 16 바이트

!G1Y4XXPZcXvUYS!

배열을 분할하고 조각의 순서를 반대로 바꾸 겠다는 Dennis의 아이디어를 빌리는 8 바이트 감소

숫자가 너무 커서 두 개의 마지막 테스트 사례가 작동하지 않습니다.

편집 (2016 년 5 월 20 일) 링크의 코드는 최근 언어 변경으로 인해 Xz대신 Xv에을 (를) 사용 합니다.

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

!         % take implicit input: string. Transpose into column char array
G         % push input string again
1Y4       % predefined literal '\d' (for regexp)
XX        % match regexp. Gives cell array with 1 or 2 strings
P         % flip that array
ZcXv      % join the strings in that array, without spaces
U         % convert to number
YS        % rotate the transposed input that many times
!         % put back into row form (string). Implicitly display

2

PowerShell, 153 바이트

(하지만 아래의 추가 크레딧 섹션 참조)

param($a)$d=[System.collections.arraylist][char[]]$a;for($b=+("$a$a"-split"#"-ne'')[1];$b;$b--){$r=$d[-1];$d.removeAt($d.Count-1);$d.insert(0,$r)}-join$d

PowerShell에는 배열 "이동"이라는 개념이 없으므로 자체 솔루션을 굴려야했습니다. 더 큰 숫자는 시간 이 오래 걸리지 만 결국 32 비트 정수에 맞는 것을 완성해야합니다.

input을 가져 와서 $a새 변수 $d[System.Collections.ArrayList] 객체 로 설정 합니다. 기술적으로 PowerShell의 배열은 변경할 수 없으므로 (아래 추가 설명에서 자세히 설명) 변경 에 필요한 임의의 삽입 또는 제거를 지원하지 않기 때문에 수행됩니다. 그런 다음 for루프를 시작합니다.

초기 조건은 내가 찾은 속임수입니다. 입력을 연결하고 쪼개고 #빈을 무시하면 결과 배열의 두 번째 요소는 줄 바꿈에 관계없이 숫자와 같습니다. 이를로 설정하고 0이 될 때까지 매번 $b감소시킵니다 $b.

각 반복마다 helper $r를 arraylist의 마지막 요소로 설정 하고 마지막 요소를 제거한 다음 요소를 맨 앞에 삽입합니다. 효과적으로 한 요소 씩 배열을 오른쪽으로 "이동"합니다.

마지막으로 우리는 단순히 -join$d하나의 문자열로 연결되도록 출력 합니다.


추가 크레딧

문제가 배열 이동 한 경우 왼쪽 대신 오른쪽 , 우리는 사용이 크게 단축 할 수있는 여러 과제를 . 기본적으로 "할당 값에 변수보다 많은 요소가 포함되어 있으면 나머지 모든 값이 마지막 변수에 할당됩니다."

본질적으로,이 같은 것을 의미 $c=@(1,2,3)하고 $a,$b=$c
있을 것이다 $a=1int 형과 $b=@(2,3)배열을.

PowerShell, 90 바이트, 오른쪽 이동 대신 왼쪽 이동

param($a)$b=+("$a$a"-split"#"-ne'')[1];$a=[char[]]$a;for(;$b;$b--){$r,$a=$a;$a+=$r}-join$a

여기서 다시 한 번 입력을 $b받고 위와 같이 설정 합니다. 우리 $a는 문자 배열로 다시 캐스팅 한 다음 for위와 동일한 루프에 들어갑니다 . 그러나 이번에는 임의의 제거 / 삽입을 지원할 필요가 없었으므로 값 비싼 [System.Collections.ArrayList]객체 나 값 비싼 메소드 호출 을 사용할 필요가 없습니다 . 대신 우리는 단순히 $r의 첫 번째 요소로 설정 $a하고 나머지 요소는에 다시 저장됩니다 $a. 그런 다음 +=끝까지 다시 붙입니다.

(앞서 말했듯이 PowerShell 배열은 기술적으로 불변이지만 +=여기 에 연산자가 과부하되어 있습니다. 배열과 다른 객체를 가져 와서 (기술 용어)를 새로운 배열로 모으고 반환하여 변수 이름으로 저장하고 파괴합니다. 기능적으로 배열의 끝에 요소를 추가했지만 기술적으로 (메모리 / 쓰레기 정리 등) 완전히 새로운 배열이므로 비용이 많이 드는 작업이 될 수 있습니다. 배열이 크거나 복잡한 경우 배열은 변경할 수 없으므로 색인화하거나 반복하는 것이 매우 저렴하다는 단점이 있습니다.)

출력은 -join단일 문자열로 바꾸는 명령문 과 함께 동일한 조치로 유지 됩니다.


1

진심으로, 21 바이트

,;;+'#@s`≈`MM@#@`/`nΣ

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

경고 :이 솔루션은 매우 비효율적이므로 더 큰 테스트 사례는 TIO에서 시간 초과됩니다. 현지 통역사를 이용하십시오.

설명:

,;;+'#@s`≈`MM@#@`/`nΣ
,;;+                   make 3 copies of input, and concatenate two of them
    '#@s               split on #s
        `≈`MM          convert strings to ints, take maximum
             @#@       explode final copy of input
                `/`n   rotate to the right n times
                    Σ  join

연결하고 최대한 활용 : 좋은 생각!
Luis Mendo

@LuisMendo 나는 여기에 설명을 쓰는 동안 Alex의 대답이 같은 전략으로 나타나는 것을 보았습니다.
Mego

처음에 순진한 접근 방식을 사용한 유일한 방법은 나였습니다 :-) (모든 숫자가 연속 될 때까지 초기 문자열을 회전)
Luis Mendo

1

매스 매 티카, 69 바이트

#~StringRotateRight~ToExpression[""<>Reverse@TextCases[#,"Number"]]&

에서 숫자의 순서를 찾으십시오 .2가 있으면 순서를 바꿔야합니다. 문자열을 연결하십시오 (단 하나 일 경우 숫자 문자열 만 반환합니다). 문자열을 숫자로 변환하고 문자열을 그 횟수만큼 회전시킵니다.


FromDigits대신 작동합니다 ToExpression.
CalculatorFeline

1

Pyth, 22 14 바이트

.>zs-.<zxz\#\#

여기 사용해보십시오!

설명

.> zs-. <zxz \ # \ # # z = 입력

     . <z # 왼쪽으로 z 회전
        xz \ # # 해시의 첫 번째 색인
                  # 이것은 정수가 끝에 감싸지지 않도록합니다.
    -\ # # 모든 해시를 필터링
   # 정수로 캐스트하고 선행 0을 제거합니다.
.> z # 입력 문자열의 최종 회전을 수행하고 인쇄

이것은 모든 테스트 케이스에서 작동하며 매우 큰 숫자의 경우 거의 즉시 완료됩니다.


-...\#대신에 할 수 있습니다 h:..."\d+"1. 또한 z문자 목록 으로 변환 할 필요가 없으며 .>문자열에서도 작동합니다.
Jakube

@Jakube 힌트를 주셔서 감사합니다, 내가 이것을했을 때 꽤 피곤했다. ^^
Denker

1

자바 스크립트 (ES6) 66

한 번, 음수에 %대한 자바 스크립트 의 어리석은 음수 가 유용합니다.

z=>(z+z).substr(-(l=z.length,[a,b]=z.match(/\d+/g),b?b+a:a)%l-l,l)

1
@WashingtonGuedes 아니오, 합계 b+a는 문자열 연결입니다. a='32',b='1', (b?b+a:a)=='132', (b|0+a)==33
edc65


1

자바 스크립트 (ES6), 67 64 바이트

s=>(l=s.length,s+s).substr(l-s.split(/#+/).reverse().join``%l,l)

Dennis의 CJam 답변의 또 다른 항구.

편집 : 관심을 끌지 않은 edc65의 답변 부분을 적절하게 적용하여 3 바이트를 절약했습니다.


reverse (). join () 대신 삼항과 합계를 사용하면 내 점수를 이길 수 있습니다
edc65

@ Downgoat 죄송합니다. 대부분 최근에 늦게 보냈지 만 밤 늦게이 일을했기 때문에 똑바로 생각하지 않았습니다.
Neil

@ edc65 아니요, 점수가 높아졌습니다. 그래서 s+s대신 트릭을 복사했습니다 . (실제로 그 밤에 대해 생각했지만 시간에 그것을 시도하기에는 너무 피곤했습니다.)
Neil

1

펄 5, 41 바이트

-lF플래그에 39 바이트 + 2 개 ( -M5.01무료) :perl -lF -M5.01 script.pl

/#+/;map{unshift@F,pop@F}1..$'.$`;say@F

설명:

  • -lF입력을 읽고, 후행 줄 바꿈을 제거하고, 나머지를 문자열 $_에 넣고, 문자로 나누고, 그 배열을 배열에 넣습니다 @F.
  • /#+/의 첫 번째 문자열 발견 #에들 $_및 세트는 $`그 전에 물건 같고 $'그 후 물건과 동일. $`비어 있으면 $'더 많은을 포함 할 수 있습니다 #. 그러나 $'.$`초기 하위 문자열이 배열 회전 횟수 인 문자열입니다.
  • 이제 우리는 list를 빌드합니다 1..$'.$`. 이것은 $'.$`정수로 취급 하고 그것을 숫자 화 #하여 final을 제거 하므로 목록이 1배열을 회전하는 횟수부터 시작됩니다.
  • 해당 목록의 각 요소에 대해 배열 ( pop마지막 요소와 unshift시작 부분)을 회전시킵니다 .
  • 그런 다음 say회전 배열의 모든 요소.

1

루비 -68 72 70 바이트

s=ARGV[0]
p s.split(//).rotate(-(s+s).scan(/\d+/).map(&:to_i).max)*""
  • split 문자열을 배열로 변환
  • (s+s).scan(/\d+/) 문자열을 자체에 연결하고 숫자 배열 (문자열)을 얻습니다.
  • map(&:to_i) 문자열을 정수로 변환
  • max 가장 큰 정수를 고르세요
  • rotate max 타임스
  • *""문자열로 배열 다시 변환 (속기 join)

사용법 : ruby scriptname.rb "[string]"


나는 신입이다. 다른 언어로 여러 답변을 게시 할 때의 예절은 무엇입니까? 하나가 잘못 된 경우 별도의 답변을 추가했습니다. 그것은 복수 응답을 추가 확인이 아니라면, 알려주세요 그리고 난 그것을 아래로 할게요
FuzzyTree

1
다른 언어로 된 복수의 답변은 훌륭하고 장려됩니다 (모두 올바른 경우).
Zgarb February

0

05AB1E , 14 13 바이트

글쎄, 코드는 100000보다 큰 숫자에 대해서는 종료되지 않을 가능성이 있지만 인내심이 충분하면 출력이 있습니다 :). 암호:

'#¡rJ¹sF¤rS\J

설명:

'#¡             # Split the input on '#'
   r            # Reverse the stack
    J           # Join the stack
     ¹          # Take the first input
      s         # Swap with the number
       F        # For N in range(0, number), do...
        ¤       #   Obtain the last character
         r      #   Reverse the stack
          S     #   Split everything to individual characters
           \    #   Delete the last character
            J   #   Join the stack

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

사용 CP-1252 인코딩


0

VBSCRIPT, 82 99 바이트

이전 코드는 끝 부분에 숫자가 줄 바꿈 된 사례를 처리하지 못했습니다.

b=len(a):f=replace(a,"#","/",1,1):c=replace(split(f&f,"/")(1),"#",d) mod b:d=right(a,c)&left(a,b-c)

언 골프

b=len(a)                                 -a->implicit input, get its length 
f=replace(a,"#","/",1,1)  -replace first instance of # so we can split later
c=replace(split(f&f,"/")(1),"#",d) mod b    -get the number and calc the mod
d=right(a,c)&left(a,b-c)                    -d->implicit output

이 좀 짜증나 ... VBscript에서도 더 좋은 방법이 있습니다.


프로그래밍 퍼즐 및 코드 골프 스택 교환에 오신 것을 환영합니다. 이 답변은 골프 코드 아래에 코드 분석 및 설명을 추가하여 향상시킬 수 있습니다. 또한 프로그램 대신 함수를 작성하여 바이트를 절약 할 수 a있습니까? 함수 입력은 어디에 있고 출력을 반환합니까? 그렇게하면 inputboxmsgbox호출이 필요하지 않습니다 .
wizzwizz4

왜 필요한 b가요?
CalculatorFeline

0

매스 매 티카, 73 58 바이트

#~StringRotateRight~Max[FromDigits/@StringSplit[#<>#,"#"]]&

많은 바이트. IPoiler 덕분 15 바이트 절약


StringRotateRight여기에 약간의 바이트를 저장합니다.
IPoiler

0

MATLAB (73)

  @(a)regexprep(a,'(\d*)#*(\d*)#*','${circshift($0,[0 str2num([$2 $1])])}')
  • 이것은 @luis가 그것을 사용했는지 궁금해하는 또 다른 접근법을 사용하고 있습니다.

0

MATLAB (86) 72

 @(n)circshift(n,[0 str2num(circshift(n(n~='#'),[0,-find(n=='#',1)+1]))])
  • 이 함수는 정수 추출에 대해 한 번, 원하는 작업에 대해 두 번째로 문자열을 두 번 회전 시키는데, matlab (Dim)modulus(Length)이 더 큰 범위에 대해 분할 실패에 빠지는 예외 로 회전하기 때문에 너무 많은 시간이 걸리지 않습니다 .

  • 골프를 더 잘하는 방법에 어려움을 겪을 것입니다 ....


(86)

  @(n)circshift(n,[0 str2num([strtok(n(find(n=='#',1,'last'):end),'#') strtok(n,'#')])])
  • 이 함수와 이전 함수의 차이점은 정수의 두 가지 먼 발생을 거꾸로 연결하는 반면 첫 번째 함수는 회전합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.