그 변수를 화살표!


29

도전

Robin은 변수를 화살표 모양으로 선언하는 것을 좋아합니다. 그가하는 방법은 다음과 같습니다.

  • 임의 개수의 문자열 입력
  • 오름차순으로 주문
  • 다음과 같이 음의 화살촉을 형성하기 위해 중간 순서로 출력하십시오 (골프가 가장 좋은 순서).

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

테스트 사례

입력:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

산출:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

입력:

a
bb
cc

출력 (둘 다 유효) :

bb
a
cc

cc
a
bb

입력:

one
four
seven
fifteen

가능한 출력 (유일한 다른 유효한 출력은 수직 미러입니다) :

seven
one
four
fifteen

노트

  • 문자열은 camelCase에 있으며 숫자 나 특수 문자가 없으며 소문자와 대문자 만 있습니다.

  • 입력은 원하는 것이 될 수 있습니다. 하나의 문자열, 배열로 쉼표로 구분되며 모든 I / O 형식이 허용됩니다.

  • 길이가 같은 문자열 사이에서는 모든 순서가 허용됩니다.

전에도 비슷한 도전이 있었지만 PPCG에 오신 것을 환영합니다!
주세페

@Giuseppe 그래, 그게 내가 게시 한 후에 생각한 것입니다. 응답 했으므로 삭제해도 괜찮습니까?
순간 이동 염소

1
글쎄, 나는 속임수를 찾고 있었지만 검색에 능숙하지 않다 ... 우리는 종종 그런 것들을 잡을 수있는 도전을 게시하기위한 샌드 박스 를 가지고 있다. 속임수가 걱정된다면 삭제하는 것이 좋습니다.
주세페

1
괜찮습니다. 우리 모두는 처음부터 시작합니다 :-)
Giuseppe

1
짝수 개의 문자열로 테스트 케이스를 추가 할 수 있습니까?
Sherlock9

답변:


15

파이썬 2 , 47 바이트

lambda l:l.sort(key=len)or l[1::2][::-1]+l[::2]

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


몇 가지 내용을 다시 정렬해야하지만 [::-2]5 바이트를 절약하기 위해 직접 사용할 수 있습니다 .
Sherlock9

@ Sherlock9 나는 그것을 시도했지만 길이가 고르지 않은 길이의 목록은 다르게 처리해야하기 때문에 길이를 확인해야했습니다.
ovs

또한 Python 3에서도 작동합니다. "lambda l :"및 "or"를 제거하고 11 바이트를 절약하기 위해 2 줄로 작성해도 "모든 I / O 형식이 허용됨"으로 여전히 허용됩니까?
감자

9

R , 63 48 바이트

function(L)c(rev(o<-L[order(nchar(L))]),o)[!0:1]

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

문자열 길이별로 정렬 한 다음 반전 된 목록을 정렬 된 목록과 결합하고 마지막으로 1 기반 인덱스 1에서 시작하여 두 번째 요소마다 가져옵니다.


1
o<-L[...다른 방법으로 '화살표 변수'. 덜 중요한 것은 pryr::f(...)여기 46 에서 작동 합니다. 온라인으로 사용해보십시오!
CriminallyVulgar

추가 라이브러리를 사용하는 @CriminallyVulgar는이를 별도의 언어로 바꾸므로 R + pryr숫자 이론 질문과 같이 정당한 이유가없는 한 일반적으로 언어를 사용 하지 않는 것이 좋습니다 numbers.
주세페

7

자바 스크립트 77 바이트

입력을 문자열 배열로 가져 와서 화살표로 정렬 된 문자열 배열을 출력합니다.

s=>s.sort((a,b)=>a.length-b.length).reduce((m,x,i)=>i%2?[...m,x]:[x,...m],[])

설명

s =>                                 // take input as an array of strings s
  s.sort((a,b)=>a.length-b.length)   // sort input by string length
  .reduce(                           // reduce
    (m,x,i)=>i%2?[...m,x]:[x,...m],  // if index is even, stick string x at the end of the memo
                                     // array, else at the beginning
    []                               // memo initialized to empty array
  )

1
나는 당신이 계산해야한다고 생각하지 않습니다 f=. 77
dana

그것은 내가 본 것의 js 코드 골프 제출에서 일치하지 않습니다. 계산에 포함되지 않으면 제외하겠습니다.
asgallant

2
함수가 재귀를 사용하는지 여부에 달려 있다고 생각합니다. 즉 f=x=>x?f(x-1). 그렇다면 f함수에서 호출하기 때문에 포함 해야합니다. 그러나 재귀를 사용하지 않으므로을 포함하지 않아도됩니다 f. 메타에는 몇 가지 게시물이 있습니다.이 게시물은 조금 더 잘 설명하는 것 같습니다. codegolf.meta.stackexchange.com/a/9032/8340
dana

그것은 내가 본 불일치를 설명합니다.
asgallant


5

K (oK) , 24 바이트

해결책:

x(<#:'x)(|&~w),&w:2!!#x:

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

설명:

6 4 2 0 1 3 5시퀀스를 생성하고이를 사용하여 오름차순 입력 길이로 색인화하고이를 사용하여 원래 배열로 색인화하십시오.

x(<#:'x)(|&~w),&w:2!!#x: / the solution
                      x: / save input as x
                     #   / count (#) of x
                    !    / range 0 to ...
                  2!     / modulo 2
                w:       / save as w
               &         / indices where true
              ,          / join with
        (    )           / do this together
           ~w            / not (~) w
          &              / indices where true
         |               / reverse
 (     )                 / do this together
   #:'x                  / count (#:) of each (') x
  <                      / indices to sort ascending
x                        / index into x



5

05AB1E , 6 5 바이트

Kevin Cruijssen 덕분에 1 바이트 절약

I / O는 문자열 목록입니다.
쉬운 테스트를 위해 개행으로 구분 된 I / O에 대한 링크가 수정되었습니다.

éι`Rì

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

설명

é       # sort by length ascending
 ι      # uninterleave into 2 parts, both sorted ascending
   `    # push the 2 parts separately to the stack
    R   # reverse the second part
     ì  # and append it to the first

당신은 첫째을 제거 할 수 있습니다 R및 교체 «와 함께 i세 번째 글 머리 점 규칙이 uninterleaving의 두 버전을 수 있기 때문에, 바이트를 저장합니다.
Kevin Cruijssen

@ KevinCruijssen : 오 예, 감사합니다!
Emigna

5

J , 11 바이트

,~`,/@\:#&>

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

우리는 먼저 그것을 분류합니다.

그런 다음 목록 양식을 오른쪽에서 왼쪽으로 줄이지 만 새 요소를 놓을 쪽을 번갈아 가며 바꿉니다. 끝난.


아주 좋아요! 당신은 결국 공간이있다, 11 바이트를 위해 그것을 제거 :)
Galen Ivanov

1
고마워요. 결정된!
요나

4

PowerShell , 66 바이트

1..($a=$args|sort l*).count|?{$_%2}|%{$a[-$_];$x=,$a[-++$_]+$x};$x

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

스 플리 팅을 통해 입력을 가져옵니다. 이는 TIO에서 별도의 명령 줄 인수로 나타납니다. ength sort에 s를 l저장 하고 에 입력 문자열 $a의 범위를 1구성합니다 count. 그런 다음 홀수 항목 만 꺼내 ?{$_%2}루프에 넣습니다 |%{...}. 반복 할 때마다 "마지막", "마지막에서 세 번째"등을 파이프 라인에 배치합니다 $a[-$_]. 별도로, 우리는 또한 $x"마지막부터 두 번째", "마지막에서 네 번째"등 으로 누적됩니다 . 루프에서 빠져 나와 파이프 라인이 플러시되고 (그러한 요소가 출력 됨) 출력 $x됩니다. 두 경우 모두 기본 출력은 항목 사이에 줄 바꿈을 자동으로 제공합니다.


4

PHP ,144 141 바이트

function($a){usort($a,function($b,$c){return strlen($b)-strlen($c);});$e=[];foreach($a as$d)(array_.[unshift,push][++$i%2])($e,$d);return$e;}

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

덕분에 -3 바이트 @Ismael Miguel !


좋은 것. 어디서 더 읽을 수 있습니까 [array_unshift,array_push][++$i%2]($e,$d)?
abhig10

2
@ abhig10 확실합니다. 그것은 두 함수의 이름을 배열이다 ['array_push','array_unshift']함께 [++$i%2]간의 교호 배열의 인덱스로서 0또는 1매우 다른 기능마다 평가할 것이다. PHP의 "가변 함수"를 사용하면 변수에 변수를 할당하고 괄호 (예 : $f='array_push'; $f($e,$d);== array_push($e,$d)) ($e,$d)로 호출하여 배열의 평가 된 요소를 호출 할 수 있습니다. 더 짧은 방법 if (++$i%2) array_push($e,$d); else array_unshift($e,$e);입니다. 결국 PHP 구문 설탕이 있다고 생각합니다!
640KB

좋아, 이것을 이해하는 데 언젠가 걸렸다. 대단해
abhig10

1
당신은 대체하여 3 바이트를 저장할 수 있습니다 [array_unshift,array_push][++$i%2]($e,$d)(array_.[unshift,push][++$i%2])($e,$d). 내가 한 일은 반복을 제거하고 array_연결 한 다음 결과가 호출에 전달되는 것입니다.
Ismael Miguel

1
@IsmaelMiguel 훌륭합니다. 고맙습니다!
640KB

4

MATLAB, 87 바이트

function f(y);[B,I]=sort(cellfun(@(x)length(x),y));{y{flip(I(1:2:end))},y{I(2:2:end)}}'

입력을 문자열의 셀형 배열로 사용하고 문자열 열을 출력합니다 (적합한 지 확실하지 않음)

> s = {'qweq qwe qw','qweqw','12132132131231231','asdasdasda','qwe','w'};
> f(s)
> >> 
> ans =
> 
>   6×1 cell array
> 
>     {'qweq qwe qw'      }
>     {'qweqw'            }
>     {'qwe'              }
>     {'1234'             }
>     {'asdasdasda'       }
>     {'12132132131231231'}

추신 : 홀수 길이의 입력으로 버그를 지적 해 주셔서 감사합니다.


홀수 개의 입력 문자열에서 실패합니다. 예 :f({'loooooooong','medium','short'})
Sanchises

또한 일반적인 골프 팁 :은 ( end는) 옵션입니다 function. function x=f(y);x={...}'보다 사용 시간 이 짧습니다 function f(y);disp({...}').
Sanchises

당신이 붙어 있다면, 내가 어떻게 할 것입니다.
Sanchises

@Sanchises는 버그를 지적 해 주셔서 감사합니다. 나는 당신처럼 정확하게 고쳤습니다. 내 문제 disp는 출력 규칙이 무엇인지 잘 모르겠습니다. 순수한 텍스트 여야합니까? 또는 disp({...})괜찮습니다 또는 x={...}당신이 제안한대로
aaaaa는 모니카

1
옥타브에서 58 바이트 일 수 있습니다 .
주세페

3

APL (Dyalog Unicode) , 18 바이트 SBCS

{⍵[⍋-@(2∘|)⍋⍋≢¨⍵]}

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

@ngn 덕분에 버그가 수정되었습니다.

설명:

{⍵[⍋-@(2∘|)⍋⍋≢¨⍵]}
{                }  Function. Takes a single argument: ⍵, list of strings
             ≢¨⍵    The length of each element in the list
           ⍋⍋       Sort the lengths
    -@(2∘|)         At (@) elements divisible by 2 (|), negate (-)
                        gives -1 2 -3 4 -5
                   Sort this list again, gives the indices of that list ^ sorted
 ⍵[             ]   Use these indices to index into the argument

¹


1
≢¨×¯1*⍳∘⍴-> (⊢∘-\≢¨)dfn으로 바꾸면 더 짧아집니다
ngn

1
그러나이 알고리즘이 올바른지 확실하지 않습니다. 입력에서 오는 순서가 아닌 정렬 된 순서로 다른 모든 문자열의 길이를 무시해야합니다.
무시

2

APL + WIN, 31 38 바이트

Adams 의견보기

⊃n[(⍳⍴n)~a],⌽n[a←2×⍳⌊.5×⍴n←n[⍒∊⍴¨n←⎕]]

온라인 Dyalog Classic에서 제공합니다!

중첩 된 문자열 벡터를 요구하는 프롬프트


APL +에 모나 딕에 "탈리"가 포함되어 ∊⍴있지 않습니까?
Adám

1
에 실패합니다 '12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'. 분명히 결과는'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
Adám

@ Adám 내 고대 버전의 APL +에는 ≢이 없습니다. 두 번째 의견에 동의하면 내일 살펴 보겠습니다.
Graham

2

망막 , 26 바이트

N$`
$.&
*\,2,^A`.+
,2,G`.+

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

N$`
$.&

줄을 길이의 오름차순으로 정렬합니다 (줄 길이를 $.&반환).

*\,2,^A`.+

대체 행을 임시로 삭제하고 나머지 행을 역순으로 출력하십시오.

,2,G`.+

일시적으로 삭제 된 행만 유지하고 출력하십시오.



2

apt, 8 바이트

ñÊó g0_w

Shaggy 덕분에 -3 바이트!

시도 해봐


출력이 2D 배열로 10 바이트 이며 허용되는 것 같습니다.
Shaggy

아니면 8 바이트 일까요? 휴대 전화에서 제대로 테스트하지 않았습니다.
Shaggy

@Shaggy 나는 모든 n 번째 요소를 찾는 함수를 찾고 있었지만 찾을 수 없었습니다. 감사!
무지의 실시

또한 A.ë()있지만 더 짧은 솔루션으로 이어질지 모르겠습니다.
Shaggy




1

자바 스크립트 95 바이트

s=>s.sort((x,y)=>x.length-y.length).reduce((a,e,i)=>{i%2?a.push(e):a.unshift(e);return a;},[]);

-1 s.sort()은 문자열 길이가 아니라 사전 식으로 문자열을 정렬합니다.
asgallant

맞아, (x, y) => x.length-y.length는 그것을 고쳐야한다.
somsom



1

C (gcc) , 136128 바이트

S(a,b)int**a,**b;{a=strlen(*b)-strlen(*a);}f(l,s,o,i,b,e)int**s,**o;{qsort(s,l,8,S);e=l-1;for(i=b=0;i-l;)o[i++%2?b++:e--]=s[i];}

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

ceilingcat 덕분에 -8 바이트

기능 f은 솔루션입니다. 문자열 수, 문자열 자체 및 출력 버퍼를 인수로 사용합니다 (내부적으로 4 개 더 사용됨).


./.bin.tio출력 ?
순간 이동 염소

@TeleportingGoat 바닥 글이 모두 argv파일 이름을 포함 하여 모두 사용하기 때문에 아마
King King

정확히, 그것은 단지 빠른 테스트였습니다. 적절한 형식의 데이터를 구성 할 수 있습니다. 나중에 TIO 링크를 업데이트하겠습니다.
LambdaBeta

하하,이 짧은 변수 이름의 문제점 : t처음부터 싫어하는 것을 잊어 버려도 필요하지 않은 경우에도 그대로 유지하십시오!
LambdaBeta


0

Japt , 8 바이트

행의 배열로 입력하고 목록의 각 절반에 대해 하나씩 두 행의 배열로 출력합니다.

ñÊó
hUÎÔ

시도 해봐 (개행으로 구분 된 문자열로 I / O를 허용하는 추가 코드)

ñÊó      :Implicit input of array U
ñ        :Sort by
 Ê       :  Length
  ó      :Uninterleave

hUÎÔ     :Newline reassigns to U
h        :Set the first element in U to
 UÎ      :  The first element in U
   Ô     :  Reversed

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