계산 및 철자


26

다음 특성을 가진 문자열을 출력하는 문자열을 입력으로 사용하는 프로그램을 작성하십시오.

  • 문자열의 문자가 대문자 인 경우 (ASCII 41-5A), 문자는 대문자의 원래 문자를 포함하여 모든 문자를 포함하는 문자열로 대체됩니다. 예를 들어, 입력 문자열이 I인 경우 출력은입니다 ABCDEFGHI.
  • 마찬가지로 문자가 소문자 (ASCII 61-7A) 인 경우 동일한 방식으로 문자가 바뀝니다. i로 대체됩니다 abcdefghi.
  • 문자가 숫자 인 경우 (ASCII 30-39), 문자는 숫자에서 시작하여 0숫자까지 카운트 되는 모든 숫자로 바뀝니다 .
  • 입력에 연결된 개별 문자가 포함 된 경우 교체 시퀀스가 ​​함께 연결됩니다.
  • 다른 모든 문자는 수정없이 인쇄됩니다.

샘플 입력 (공백으로 구분)

AbC123

pi=3.14159

Hello, World!

샘플 출력

AabABC010120123

abcdefghijklmnopabcdefghi=0123.0101234010123450123456789

ABCDEFGHabcdeabcdefghijklabcdefghijklabcdefghijklmno, ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnoabcdefghijklmnopqrabcdefghijklabcd!

이것은 코드 골프입니다. 표준 규칙이 적용됩니다. 바이트 단위의 최단 코드가 이깁니다.


리더 보드를 보려면 "코드 스 니펫 표시"를 클릭하고 맨 아래로 스크롤 한 다음 "► 코드 스 니펫 실행"을 클릭하십시오. 옵티마이 저가 작성한 스 니펫.


10
속편 아이디어 :이 변형을 취소하십시오.
ETHproductions

2
@ETHproductions 아마도 입력 방법이 필요하기 때문에 여기의 방법이 나에게 더 좋을 것 같습니다. 반대로 입력이 Hello, World!있다면 어떻게 될까요?
Arcturus

입력 문자열에서 NUL (ascii 0x00) 문자를 지원해야합니까?
nimi

이 경우 @Eridan에서 코드는 오류를 인쇄하거나 재미를 위해 위의 변환을 수행해야합니다. 즉, f (f (input)) == 입력입니다. 나는 영숫자 입력 이이 관계에 불순종 할 수 있다고 생각하지 않습니다.
Jake

1
그것은 전적으로 사실입니다- "문자열이 변환의 결과가 될 수 있다면, 그것을 뒤집고 그렇지 않으면 변환을 적용하십시오"라고 가정합니다. -당신의 도전입니다. (a) 일관성 있고 (b) 검증 가능하고 완전히 새로운 수학 분기를 필요로하지 않는 한 선택한 규칙을 지정할 수 있습니다. 참고 : 조사 (b)는 흥미로울 것이다. NP 문제에 대한 다항식 시간 알고리즘을 통해 실수로 컴퓨터 과학에 혁명을 일으킬시기를 절대 알 수 없습니다. 4 바이트를 절약하는 한 실제로 합리적입니다.
Jake

답변:


11

Pyth, 19 바이트

sXzsJ+rBG1jkUTs._MJ

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명

sXzsJ+rBG1jkUTs._MJ
      rBG1            the list ["abc...xyz", "ABC...XYZ"]
     +    jkUT        appends the string "0123456789"
    J                 save this list of 3 strings in J
   sJ                 join the strings in J
               ._MJ   create all prefixes of the strings in J
              s       and combine them to one list
 XzsJ         s._MJ   translate the input string, chars from sJ
                      get translated to the correct prefix,
                      chars that don't appear in sJ don't get translated
s                     join all resulting translation strings

8

파이썬 2.7, 100 98 96 바이트

a=[]
for c in raw_input():d=ord(c);a+=range(max(d&96|1,48),d)*c.isalnum()+[d]
print bytearray(a)

7

티 스크립트 , 24 바이트 26 28

TeaScript는 골프를위한 JavaScript입니다

xl(#(i=lN()1)h(ii(l)+1))

꽤 짧은

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

설명

x.l(#            // Loops through each character of the string

     (i=l.N()1)  // Determines whether a character is alphanumeric
                 // Will return A-Z, a-z or 0-9 depending on result
                 // Assigns to variable i

     .h(         // Get characters up to...
        i.i      // where the character is in "i"
     ) + 1       // Increased by one
)

6

루비, 137 87 82 76 67 55 바이트

풀리지 않지만 패턴을 볼 수 있습니다.

$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}

편집 : 하나의 정규식으로 골프를 쳤습니다.

편집 2 : 여분의 공간이 많았습니다.

편집 3 : 12 바이트 골프를위한 manatwork 덕분에!


1
$><<gets.gsub(/[a-z0-9]/i){[*" 0Aa"[$&.ord/32]..$&]*""}
manatwork

@manatwork 젠장, 영리하다!
피터 Lenkefi

4

파이썬 2 145 140 133 103 102 바이트

목록 이해를 사용하여 비 매끄럽지 않은 익명 함수. 나는 논리가 훨씬 짧아야한다고 생각하고, 무언가를 알아 내려고 노력할 것이다.

lambda k:''.join([c,`map(chr,range(48+17*(c>'@')+32*(c>'`'),ord(c)+1))`[2::5]][c.isalnum()]for c in k)

사용할 이름을 부여해야합니다. 즉 f=...


@ 메고 오, 하하! 걱정 마세요 :)
Kade

4

하스켈, 95 91 86 60 바이트

c#(a:o:r)|c<a||c>o=c#r|1<2=[a..c]
c#_=[c]
f=((#"AZaz09")=<<)

사용 예 : f "pi=3.14159"->"abcdefghijklmnopabcdefghi=0123.0101234010123450123456789"

작동 방식 : c가 A/ Z, a/ z또는 0/ 사이에 있지 않은 경우 입력 문자열에서 모든 문자 c를 복사 9하고 목록을 가져 오십시오 [<first char in pair> ... <c>].

편집 : @ Zgarb는 많은 바이트를 절약했습니다. 감사!


나는 당신이 완전히 정의 c#_=[c]하고 건너 뛸 수 있다고 생각합니다 t.
Zgarb

@ Zgarb : 그렇습니다. 그리고 s또한 불필요합니다. 고마워요!
nimi

4

자바 스크립트 (ES6) 143 138 바이트

문자열 비교를 사용하여 사용할 문자를 테스트하십시오.

s=>s.replace(/[A-Z0-9]/gi,c=>(a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`,(c>'Z'?a:a.toUpperCase()).split``.filter(x=>x<=c&(x>'9'|c<'A')).join``))

온라인 데모. Firefox 및 Chrome에서 테스트되었습니다.

편집 :로 교체 a='0123456789abcdefghijklmnopqrstuvwxyz'하여 5 바이트를 절약 했습니다.

a=btoa`Ó]·ã»óÖq×£Y§¢«²Û¯Ã³`

3

PHP, 146 바이트

골프

function f($n,&$l){for(;$c=$n[$r],$b=0,$d=ord($c);$r++,$b?:$l.=$c)foreach([58=>48,91=>65,123=>97] as $m=>$i)while($d<$m&&$d>=$i)$b=$l.=chr($i++);}

개정 1 : ord 범위를 foreach에 직접 넣습니다. 증가 된 ord 범위가 최대 값으로 변경 $d<=$m되었습니다 $d<$m. 및 for대신 문자를 반복 하는 데 사용 합니다 . 코드를 이동하여 모두 제거foreachstr_split{}for

언 골프

function f($input,&$output){
foreach (str_split($input) as $char){
  $ord = ord($char);
  $ords = [57=>48,90=>65,122=>97];
  $b = 0;
  foreach ($ords as $max=>$min){
     while ($ord<=$max&&$ord>=$min){
         $b = $max;
         $output .= chr($min);
         $min++;
     }
  }
  $b ?: $output.=$char;
}
};

$output = NULL;
$input = "pi=3.141592";
f($input,$output);
echo $output;

설명 : 문자열을 배열로 분할합니다. ASCII 값이 범위 (az, AZ, 0-9의 경우)에 해당하면 범위의 최소값에서 문자의 ASCII 값까지 카운터를 증가시켜 문자의 ASCII 값에 도달 할 때까지 각 값을 추가합니다.

나는 전달하기 &$var때문에 출력이 아닌 참조로 수행됩니다.return


범위 배열을 보유하기 위해 변수 $ z가 필요하지 않습니다 foreach. 배열 리터럴을에 직접 넣을 수 있습니다 .
manatwork

사용하려고 range()했습니까? pastebin.com/k2tqFEgD
manatwork

@manatwork, 나는 선언에서 $z변경하고 다른 변경을했습니다. range()아마 더 나을 것입니다. 나중에 범위가있는 것을 시도 할 수 있습니다.
Reed

을 사용하여 166을 range얻었습니다 function f($n,&$l){$o=['a'=>'z','A'=>'Z','0'=>'9'];foreach(str_split($n) as $c){$b=0;foreach($o as $m=>$x)!($c>$m&&$c<=$x)?:$b=$l.=implode(range($m,$c));$b?:$l.=$c;}}.
Reed

1
예, 146자를 다시 쓰면 range()유용하지 않습니다. 그러나 166은 너무 길다. 배열 리터럴의 $ o가 돌아 왔고 as키워드 주위에 여분의 공간이 있으며에 join()대한 별칭입니다 implode(). (이전에 연결 한 pastebin 코드를 확인 했습니까? 범위 끝점을 저장할 수있는 또 다른 가능성을 보여줍니다.) 146 자 솔루션과 관련하여 ord()호출 내에서 할당을 $ c로 이동할 수 있습니다 $d=ord($c=$n[$r]).
manatwork

2

파이썬, 143 바이트

lambda s:''.join(map(chr,sum(map(lambda a,r=range:r(65,a+1)if 64<a<97else r(97,a+1)if 96<a<123else r(48,a+1)if 47<a<58else[a],map(ord,s)),[])))

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


2
z = range를 사용하여 4 바이트를 절약 할 수 있습니다.
Arcturus

1
이중 공간 들여 쓰기를 단일 탭으로 대체하여 몇 바이트를 절약 할 수 있습니다
Fund Monica 's Lawsuit

2

펄 6, 101 바이트

여기에 첫 번째 패스가 있습니다.

sub MAIN($_ is copy){
  s:g/<[0..9]>/{(0..$/).join}/;
  s:g/<[a..z]>/{('a'..~$/).join}/;
  s:g/<[A..Z]>/{('A'..~$/).join}/;
  .say
}
sub MAIN($_ is copy){s:g/<[0..9]>/{(0..$/).join}/;s:g/<[a..z]>/{('a'..~$/).join}/;s:g/<[A..Z]>/{('A'..~$/).join}/;.say}

119


사용 .trans에 대한 것은 $_제거합니다 is copy.

sub MAIN($_){
  .trans(
    /\d/       => {(0..$/).join},
    /<[a..z]>/ => {('a'..~$/).join},
    /<[A..Z]>/ => {('A'..~$/).join}
  ).say
}
sub MAIN($_){.trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say}

106


하위 @*ARGS를 정의하는 대신 직접 행동하십시오 MAIN.
(그렇지 않으면 이전 예와 동일)

@*ARGS[0].trans(/\d/=>{(0..$/).join},/<[a..z]>/=>{('a'..~$/).join},/<[A..Z]>/=>{('A'..~$/).join}).say

101


2

스칼라, 111 91 바이트

val f=(_:String).flatMap(x=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else('a'to x))

에 실패합니다 pi=3.14159. val f=(_:String).flatMap(x:String=>if(x.isDigit)('0'to x)else if(x.isUpper)('A'to x)else if(x.isLower)('a'to x)else x.toString)무려 128자를위한 해결책이 될 수 있을까요 ?
Leonardo

2

줄리아, 102 98 90 84 바이트

s->join([(i=Int(c);join(map(Char,(64<c<91?65:96<c<123?97:47<c<58?48:i):i)))for c=s])

문자열을 받아들이고 문자열을 반환하는 명명되지 않은 함수를 만듭니다.

언 골프 드 :

function f(s::AbstractString)
    # For each character in the input, get the codepoint and construct
    # a range of codepoints from the appropriate starting character to
    # the current character, convert these to characters, and join them
    # into a string
    x = [(i = Int(c);
          join(map(Char, (isupper(c) ? 65 :
                          islower(c) ? 97 :
                          isdigit(c) ? 48 : i):i))
         ) for c in s]

    # Join the array of strings into a single string
    return join(x)
end

2

PowerShell, 155 바이트

($args-split''|%{$b=$_;switch([int][char]$_){{$_-in(65..90)}{[char[]](65..$_)}{$_-in(97..122)}{[char[]](97..$_)}{$_-in(48..57)}{0..$b}default{$b}}})-join''

기술적 으로 하나의 라이너와 PowerShell은 그 모든 것에 관한 것입니다. ;-)

입력을 분할하여 ForEach-Object루프 로 파이프 하고 캐스트 문자의 정수 값을 켠 다음 char[]적절한 범위를 새로 생성 합니다. switch 문에서 $b입력을 캐스팅하는 행위는 $_계속 사용할 수 $_없거나 펑키 한 출력을 얻을 수 있기 때문에 임시 변수를 설정하기 위해 바이트를 소비해야합니다 .

편집-공급되는 첫 번째 개체가 %{...}null 개체 이므로 오류가 발생 합니다. STDERR은 기본적으로 무시 되므로 문제가되지 않습니다. 문제가 있으면 첫 번째 비트를 변경 ($args-split''-ne''|...하여 null 개체를 제거하십시오.


2

자바 스크립트 (ES6), (340) 258 273 271 바이트

a=s=>{s=s.split``;Q=x=>x.toUpperCase();A="ABCDEFGHIJKLMNOPQRSTUVWXYZ";D="0123456789";f="";for(i=0;i<s.length;i++){j=s[i];c="to"+(Q(j)==j?"Upper":"Lower")+"Case";j=Q(j);if(q=A.search(j)+1)f+=g=A.slice(0,q)[c]();else if(q=D.search(j)+1)f+=g=D.slice(0,q);else f+=j}return f}

템플릿 문자열``을 for 루프 대신 ("")f=i=""for 루프에서 사용할 수 있습니다 . 몇 바이트를 더 절약 할 수 있습니다.
intrepidcoder

@intrepidcoder 첫 번째 작동합니다. 두 번째 확인 중입니다.
Conor O'Brien

2

C (269 바이트)

(명확성을 위해 줄 바꿈이 추가됨)

#include<stdio.h>
#define F(x,y,z)if(c>=T[0][x]&&c<=T[1][y]){z}
#define L(x,y)for(i=0;i<x;++i){y}
main(){int c,i,n;char o,*T[]={"0Aa","9Zz"};while((c=getchar())!=EOF)
{F(0,2,L(3,F(i,i,o=T[0][i],n=++c-o;L(n,putchar(o++));break;))else putchar(c);)}}

언 골프

#include<stdio.h>
int main(void)
{
  int c, i, n;
  char output;
  char *char_table[] = {"0Aa", "9Zz"};

  while ((c = getchar()) != EOF) {
    if (c < '0' || c > 'z') {
      putchar(c);
    } else {
      for (i = 0; i < 3; ++i) {
        if (c >= char_table[0][i] && c <= char_table[1][i]) {
          output = char_table[0][1];
          n = c - output;
          break;
        }
      }
      for (i = 0; i <= n; ++i) {
        putchar(output);
        ++output;
      }
    }
  }
  return(0);
}

2

펄 5 , 66 61 (51 바이트 + 1) 52

이 경우 정규 표현식과 조건 연산자를 결합하면 좋았습니다.
결합 사용 맵을 사용하여 범위를 배열로 결합합니다.

say map{(/\d/?0:/[A-Z]/?A:/[a-z]/?a:$_)..$_}split//

테스트

$ echo "A0C1.a3c_2!" |perl -M5.010 -n count_and_spell_up.pl
A0ABC01.a0123abc_012!

설명

say                # print output
  map{             # loop through the array that's at the end of the other mustache. 
                   # outputs an array. 
     (
        /\d/?0            # if $_ is a digit then 0
          :/[A-Z]/?A      # else, if it's an uppercase character then A
             :/[a-z]/?a   # else, if it's a lowercase character then a
               :$_        # else the current character
     )..$_         # generate a sequenced string of characters 
                   # that ends with the magic variable $_ 
                   # ($_ is currently a character from the array)
  }split//     # split the magic variable $_ (currently the input string)
               # to an array of characters

1

자바 스크립트 (ES7), 125 바이트

문자열 인코딩에 중점을 둔 두 가지 JS 답변이 이미 있었으므로 다음을 사용하여보다 알고리즘적인 접근 방식을 결정했습니다 String.fromCharCode().

x=>x.replace(/[^\W_]/g,z=>(c=z.charCodeAt(),f=c<65?48:c<97?65:97,String.fromCharCode(...[for(i of Array(c-f).keys())i+f])+z))

이 방법을 사용하면 추가로 많은 양의 문자 코드 join가 필요 하므로 목록을 작성할 필요가 없습니다. 이것은 다른 기술보다 짧았으므로 결과에 만족합니다.


1

MUMPS, 131 바이트

u(l,h) i l'>a,a'>h f j=l:1:a s o=o_$C(j),f=0
    q
t(s) f i=1:1:$L(s) s a=$A(s,i),f=1 d u(48,57),u(65,90),u(97,122) s:f o=o_$C(a)
    q o

MUMPS의 동적 범위 지정 덕분에 여기에서 몇 바이트를 절약 할 수 있었습니다 . MUMPS Prettify 모듈에 대한 지원 만 가능하다면 구문 강조를 원할 것 입니다.

convert(str) ;
    new asciiCode,flag,i,output
    for i=1:1:$LENGTH(str) do
    . set asciiCode=$ASCII(str,i)
    . set flag=1
    . do helper(48,57)
    . do helper(65,90)
    . do helper(97,122)
    . if 'flag do
    . . set output=output_$CHAR(asciiCode)
    quit
helper(low,high) ;
    if low'>asciiCode,asciiCode'>high do
    . for code=low:1:asciiCode do
    . . set output=output_$CHAR(code)
    . . set flag=0
    quit

1

펄 6, 78 77 바이트

@*ARGS[0].trans(/\d/=>{[~] 0..$/},/<:L>/=>{[~] samecase("a",~$/)..~$/}).say

나는 과 케이스 를 결합하여 단축 될 수 있음을 알고 열심히 노력해야했습니다. 'a'..'z''A'..'Z'
브래드 길버트 b2gills

올바르게 강조 표시되도록 <!-- language-all: lang-perl6 -->직후에 추가하는 것이 좋습니다 ## Perl 6. (변경은 이미 답변을 보류)
브래드 길버트는 b2gills

1 바이트를 절약 할 수있는 스위치 {[~](0..$/)}로 전환 할 수 있습니다 {[~] 0..$/}.
브래드 길버트 b2gills

0

수학, 102 바이트

FromCharacterCode@Flatten[Which[64<#<91,65,96<#<123,97,47<#<58,48,1>0,#]~Range~#&/@ToCharacterCode@#]&

오 잘 ...


0

CJam, 32 31 바이트

q_'[,_el^A,s+26/ff{_@#)<}:s\.e|

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

q_    e# Push two copies of the user input.
'[,   e# Push the string of all ASCII characters up to Z.
_el   e# Push a copy and convert it to lowercase.
^     e# Perform symmetric difference this keeps only letters.
A,s+  e# Append the string "0123456789".
26/   e# Split the result into chunks of length 26.
ff{   e# For each character from input: For each chunk:
  _@  e#   Copy the chunk and rotate the character on top of it.
  #   e#   Push the index of the character in the string (-1 for not found).
  )<  e#   Increment and keep that many characters from the left of the chunk.
      e#   This pushes "" for index -1.
}
:s    e# Flatten the resulting arrays of strings.
      e# The results will be empty strings iff the character wan't alphanumeric.
\     e# Swap the result with the input string.
.e|   e# Perform vectorized logical OR.

0

파이썬 2, 135 117 바이트

s=''
for c in raw_input():
 b=ord(c);e=b+1
 if c.isalnum():
  b=max(b&96,47)+1
 for i in range(b,e):s+=chr(i)
print s

0

PHP-291 바이트

문자열을에 전달하십시오 GET["s"].

<?php $s=$_GET["s"];$m="array_map";echo implode($m(function($v){$i="in_array";$l="implode";$r="range";global$m;$a=ord($v);if($i($a,$r(48,57)))$v=$l($m("chr",$r(48,$a)));if($i($a,$r(65,90)))$v=$l($m("chr",$r(65,$a)));if($i($a,$r(97,122)))$v=$l($m("chr",$r(97,$a)));return$v;},str_split($s)));

0

C #을 251 201 184 157 154 바이트

using System;class c{static void Main(string[] i){foreach(var c in i[0])for(var x=c>64&c<91?'A':c>96&c<123?'a':c>47&c<58?'0':c;x<=c;)Console.Write(x++);}}

편집 : 스트라이크! PowerShell보다 짧음;)


1
당신은 할 수 string[]i있습니까?
아웃 골퍼 에릭
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.