แสดงผลความชันสะสมของสตริง


12

ท้าทาย

กำหนดสตริงเช่นทำลายมันลงไปในค่าตัวอักษร:Hello World!72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33

29, 7, 0, 3, -79, 55, 24, 3, -6, -8, -67แล้วคำนวณความแตกต่างระหว่างแต่ละคู่ติดต่อกันของตัวอักษร:

-39สุดท้ายรวมพวกเขาและพิมพ์ผลสุดท้าย:

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • ไม่ใช้ฟังก์ชั่นที่ทำไว้ล่วงหน้าซึ่งทำงานที่แน่นอนนี้
  • สนับสนุนโซลูชั่นที่สร้างสรรค์
  • มีความสุข
  • นี่คือการทำเครื่องหมายว่าเป็นคำตอบที่สั้นที่สุดเป็นไบต์ชนะ แต่จะไม่ถูกเลือก

16
การสังเกตของเดนนิสแสดงให้เห็นว่างานนี้เป็นประโยคที่ซับซ้อนกว่าที่จำเป็น
Greg Martin

ภาษาสามารถรับอินพุตเป็นอาร์เรย์อักขระได้หรือไม่แม้ว่าจะรองรับชนิดสตริงหรือไม่
โผล่

@Poke ขออภัยจะต้องมีสตริง
dkudriavtsev

@ GregMartin ฉันไม่ได้ตระหนักถึงความจริงที่จนกระทั่งในภายหลัง ความท้าทายควรเป็นเช่นนี้ต่อไป
dkudriavtsev

@DJMcMayhem ทราบดีว่าสามารถส่งออกรูปแบบอื่น ๆ ได้ทั้งหมด
dkudriavtsev

คำตอบ:


38

Python ขนาด 29 ไบต์

lambda s:ord(s[-1])-ord(s[0])

ผลรวมของความแตกต่างเป็นชุดกล้องส่องทางไกลดังนั้นส่วนใหญ่จึงสรุปยกเลิกและ
(s 1 - s 0 ) + (s 2 - s 1 ) + … + (s n-1 - s n-2 ) + (s n - s n-1 ) = s n s - 0

หากใช้สตริงไบต์เป็นอินพุตจะได้รับอนุญาต

lambda s:s[-1]-s[0]

จะทำงานได้เป็นอย่างดีสำหรับ19 ไบต์

ทดสอบทั้งในIdeone


พิมพ์ผลลัพธ์นี้หรือไม่?
dkudriavtsev

4
ใน REPL ฉันเดาว่าเป็นเช่นนั้น รูปแบบของผลลัพธ์ที่ต้องการคือค่าส่งคืนซึ่งเป็นหนึ่งในวิธีการเริ่มต้นของการส่งออก หากไม่ได้รับอนุญาตคำตอบส่วนใหญ่ในภาษาที่ใช้งานจริงจะไม่ถูกต้อง
เดนนิส

22

MATL , 2 ไบต์

ds

ลองออนไลน์!

คำอธิบาย:

dได้รับความแตกต่างระหว่างตัวอักษรต่อเนื่องและsผลรวมอาร์เรย์ จากนั้นค่าที่ด้านบนของสแต็กจะถูกพิมพ์โดยปริยาย ไม่มากที่จะพูดเกี่ยวกับเรื่องนี้

น่าสนใจพอถึงแม้ว่า Dennis จะค้นพบทางลัดที่ยอดเยี่ยม แต่การใช้งานมันจะมีความยาวมากขึ้นใน MATL


9

เยลลี่ 3 ไบต์

OIS

ลองออนไลน์!

ใช้Ordinals ของตัวละครสายป้อนที่แล้วIncrements ของรายการที่แล้วSหนอของที่รายการ


ใช่การพิมพ์ผลลัพธ์ (และการป้อนข้อมูลในตอนแรก) เกิดขึ้นโดยปริยายในเยลลี่
ลินน์

6

MATLAB, 16 ไบต์

@(x)sum(diff(x))

นี้จะสร้างฟังก์ชั่นที่ไม่ระบุชื่อชื่อที่สามารถเรียกเช่น:ansans('Hello world!')

นี่คือตัวอย่างออนไลน์ใน Octave ซึ่งต้องการไบต์เพิ่มเติม+เพื่อแปลงสตริงอินพุตให้เป็นอาร์เรย์ตัวเลขอย่างชัดเจนก่อนคำนวณความแตกต่างระหว่างองค์ประกอบกับองค์ประกอบ



3

Cubix , 13 ไบต์

Cubix เป็นภาษา 2 มิติล้อมรอบลูกบาศก์

i?u//O-t#;/.@

ทดสอบออนไลน์! แม็พนี้กับคิวบ์เน็ตต่อไปนี้:

    i ?
    u /
/ O - t # ; / .
@ . . . . . . .
    . .
    . .

ตำแหน่งที่ IP (ตัวชี้คำสั่ง) เริ่มต้นที่มุมซ้ายบนของใบหน้าซ้ายสุด

มันทำงานอย่างไร

ขั้นแรกให้ IP ชนกระจก/ซึ่งเปลี่ยนเส้นทางไปยังiด้านบนสุด ใบหน้าด้านบนเป็นลูปที่ป้อน charcodes อย่างต่อเนื่องจนกว่า EOF จะถึง เมื่ออินพุตว่างผลลัพธ์ของiคือ -1 เปลี่ยน IP ที่เหลือจาก?กดปุ่ม/บนใบหน้าขวาสุดและจะผ่านคำสั่งต่อไปนี้:

  • ; - เปิดไอเท็มยอดนิยม (-1)
  • # - ดันความยาวของสแต็ก
  • t- เปิดไอเท็มยอดนิยมและรับไอเท็มที่ดัชนีนั้นในสแต็ก สิ่งนี้ดึงรายการด้านล่างขึ้นมา
  • - - ลบ
  • O - เอาท์พุทเป็นจำนวนเต็ม
  • /- เบี่ยงเบน IP ไปที่@ซึ่งสิ้นสุดโปรแกรม

3

C #, 22 ไบต์

s=>s[s.Length-1]-s[0];

รหัสที่มาแบบเต็มกับกรณีทดสอบ:

using System;

namespace StringCumulativeSlope
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string,int>f= s=>s[s.Length-1]-s[0];
            Console.WriteLine(f("Hello World!"));
        }
    }
}

C # กับ LINQ, 17 ไบต์

รุ่นที่สั้นกว่าโดยใช้ LINQ ต้องขอบคุณhstde :

s=>s.Last()-s[0];

อย่างไรก็ตามจำเป็นต้องมีการนำเข้าเพิ่มเติม:

using System.Linq;

2
s=>s.Last()-s[0];จะเป็นเพียง 17 ไบต์
hstde

3

Ruby, 23 ไบต์

->s{s[-1].ord-s[0].ord}

กำหนดให้กับตัวแปร like f=->s{s[-1].ord-s[0].ord}และ call likef["Hello World!"]

ใช้การสังเกตของ Dennis เกี่ยวกับซีรี่ส์ telescopic


คุณไม่จำเป็นต้องพิมพ์ผลลัพธ์เพียงส่งคืนเพื่อให้คุณสามารถกำจัด$><<ได้
Jordan

1
ใช่ฉันอ่านคำถามด้วย โชคดีที่มีฉันทามติอย่างกว้าง ๆ เกี่ยวกับคำจำกัดความของ "เอาท์พุท" (ดูเพิ่มเติมที่: คำตอบมากมายในหน้านี้ซึ่งส่งคืนแทนที่จะพิมพ์ค่า) แต่เดี๋ยวก่อนมันเป็นรหัสของคุณ
Jordan

2

ไขว้กันเหมือนแห 12 ไบต์

idVc~@qVc-o;

ลองออนไลน์!

ด้วยการสังเกตของเดนนิสเราสามารถทำให้กระบวนการวนซ้ำกลายเป็นกระบวนการที่ง่ายขึ้นได้

idVc~@qVc-o;
i             take input
 d            duplicate
  V           pop input copy, push last character
   c          get its char code
    ~         put it under the input in the stack
     @q       reverse the item at the top of the stack
       V      get the last item of that (first item of input)
        c     convert to char
         -    subtract
          o   output
           ;  and terminate

2

Brain-Flakขนาด 51 ไบต์

48 ไบต์ของรหัสบวกสามไบต์สำหรับการ-aตั้งค่าสถานะซึ่งเปิดใช้งานการป้อนข้อมูล ASCII (แต่การแสดงผลทศนิยมความสะดวกสบาย: D)

{([{}]({})<>)<>}<>{}([]<>){({}[()])<>({}{})<>}<>

ลองออนไลน์!

นี่มันยากกว่าคำตอบอื่น ๆ ของฉันเล็กน้อยฮ่าฮ่า ให้เดินผ่านมัน

{           While the top of the stack is nonzero:
 (            Push:
  [{}]          The top of the stack times negative one. Pop this off.
  ({})          Plus the value on top of the stack, which is duplicated to save for later.
  <>          On to the other stack
 )
 <>         Move back to the first stack
}
<>          After the loop, move back again.
{}          We have one extra element on the stack, so pop it
([]<>)      Push the height of the alternate stack back onto the first stack
{           While the top of the stack is nonzero:
 ({}[()])     Decrement this stack
 <>           Move back to the alternate stack
 ({}{})       Sum the top two elements
 <>           Move back tothe first stack
}
<>          Switch back to the stack holding the sum


2

Brachylogขนาด 7 ไบต์

@c$)@[-

ลองออนไลน์!

คำอธิบาย

@c        Convert "Hello World!" to [72,101,108,108,111,32,87,111,114,108,100,33]
  $)      Circular permute right: [33,72,101,108,108,111,32,87,111,114,108,100]
    @[    Take a prefix of the list
      -   Subtract

[33, 72]ตั้งแต่ลบทำงานเฉพาะสำหรับการป้อนข้อมูลของทั้งสองจำนวนเต็มก็จะประสบความสำเร็จในครั้งเดียวคำนำหน้าเลือกคือ



2

R, 69 43 32 ไบต์

คำตอบที่ไม่ใช่การแข่งขันแม้ว่าฉันคิดว่ามันสนุกที่จะแสดงวิธีแก้ปัญหาที่เป็นไปได้ในอาร์

sum(diff(strtoi(sapply(strsplit(readline(),"")[[1]],charToRaw),16L)))

ด้านที่น่าสนใจเพียงหนึ่งเดียวของคำตอบนี้คือการใช้และsapply charToRawก่อนอื่นฉันจะแบ่งสตริงให้เป็นเวกเตอร์ของอักขระที่ฉันต้องการแปลงให้เป็นตัวแทนจำนวนเต็ม ASCII ของมัน charToRawฟังก์ชั่นไม่ได้ vectorized ในการวิจัยและแทนที่จะวนลูปกับแต่ละค่าในการใช้งานดังกล่าวข้างต้นผมเวกเตอร์sapplyที่มีประสิทธิภาพเวกเตอร์ฟังก์ชั่น จากนั้นนำความแตกต่างที่ 1 แล้วรวม


แก้ไข: charToRawเปลี่ยนแปลงสตริงเป็นเวกเตอร์ที่แต่ละองค์ประกอบเป็นการแทนค่าดิบของตัวละครแต่ละตัวจึงไม่จำเป็นต้องใช้strsplitและsapply

sum(diff(strtoi(charToRaw(readline()),16)))

แก้ไข 2: ปรากฎว่าเป็นวิธีที่ดียิ่งขึ้นฟังก์ชั่นutf8ToInt(x)ทำในสิ่งstrtoi(charToRaw(x),16)ที่หมายความว่าเราสามารถบันทึกอีกสองสามไบต์ (ความคิดที่นำมาจาก @ rturnbull คำตอบของคำถามอื่น):

sum(diff(utf8ToInt(readline())))

2

Perl, 19 ไบต์

รวม +1 สำหรับ -p

ให้อินพุตบน STDIN โดยไม่ขึ้นบรรทัดใหม่

echo -n "Hello World!" | slope.pl; echo

slope.pl:

#!/usr/bin/perl -p
$_=-ord()+ord chop

หากคุณแน่ใจว่าสตริงอินพุตมีอย่างน้อย 2 ตัวอักษรเวอร์ชัน 17 ไบต์นี้ก็ใช้งานได้เช่นกัน:

#!/usr/bin/perl -p
$_=ord(chop)-ord

2

NodeJS, 82 ไบต์

x=process.argv[2],a=[],t=0;for(y in x)a[y]=x.charCodeAt(y),t+=y!=0?a[y]-a[y-1]:0

คำอธิบาย:

x = process.argv[2] // Get the input
a=[], // Initializes an array to store the differences' values.
t=0;  // Initializes a variable to store the total of the differences
for(y in x) // Iterates over the string as an array of characters
    a[y]=x.charCodeAt(y) // Transforms the input into an array of integers
    t+=y!=0?a[y]-a[y-1]:0 // Add the difference of the last two characters, except at the first iteration

JavaScript, 79 ไบต์

f=x=>{a=[],t=0;for(y in x)a[y]=x.charCodeAt(y),t+=y!=0?a[y]-a[y-1]:0;return t}

แนวคิดเดียวกันข้างต้นพร้อมฟังก์ชันป้อนข้อมูลแทนการโต้แย้ง


ขออภัยคุณไม่สามารถสันนิษฐานได้ว่าxเป็นอินพุต คุณต้องป้อนข้อมูลจริง
Rɪᴋᴇʀ

วิธีนี้ใช้งานได้หรือไม่
Alexis_A

ใช่มันใช้งานได้ดี!
Rɪᴋᴇʀ

1
อีกวิธีที่ได้รับการยอมรับในการป้อนข้อมูลคือการสร้างฟังก์ชั่น ตัวอย่างเช่นf=x=>{...;return t}การบันทึก 2 ไบต์;)
joeytwiddle

2

JavaScript ES6, 42 39 ไบต์

f=
     s=>s[x='charCodeAt'](s.length-1)-s[x]();
;

console.log(f.toString().length);      // 39
console.log(f('Hello World!'))         // -39

ใช้การสังเกต @Dennis เกี่ยวกับผลรวมของกล้องโทรทรรศน์

ฉันคิดว่าในกรณีนี้การแก้ปัญหาเล็ก ๆ น้อย ๆ นั้นสั้นที่สุด

บันทึก 3 ไบต์โดยกำจัดการcharCodeAtซ้ำซ้อนตามที่แนะนำโดย @Neil


ดีที่สุดที่ฉันสามารถทำได้คือs=>s.slice(-1).charCodeAt()-s.charCodeAt()สิ่งที่กลายเป็นความยาวเท่ากัน
Neil

จริง ๆ แล้วcharCodeAtค่อนข้างยาวอาจมีวิธีการบันทึกไบต์โดยหลีกเลี่ยงการซ้ำซ้อน
Neil

@ Neil ขอบคุณสำหรับคำแนะนำที่ช่วยฉัน 3 ไบต์
Lmis

วิธีเรียกซ้ำเล็กน้อยอีกสองสามไบต์ยาวกว่า:f=s=>(s[1]?-f(s.slice(-1)):0)-s.charCodeAt()
ETHproductions

2

มา, 28 ไบต์

: f depth 1- roll swap - . ;

รับรายการอักขระบนสแต็ก (วิธีมาตรฐานของการรับพารามิเตอร์) ตัวอักขระถูกใช้จนด้านบนสุดของสแต็กเป็นอักขระตัวแรกของสตริง ฉันย้ายด้านล่างของสแต็คไปด้านบนสลับจากนั้นลบและพิมพ์ ขยะเหลืออยู่บนสแต็กและเอาต์พุตถูกพิมพ์ไปที่ stdout

หากอักขระแต่ละตัวถูกส่งไปยังสแต็กตามลำดับแทนที่จะเรียงกลับกันโปรแกรมจะสั้นลง 2 ไบต์ ไม่แน่ใจว่าได้รับอนุญาตหรือไม่เพราะปกติแล้วคุณจะส่งอาร์กิวเมนต์ในลำดับที่กลับกัน

ลองออนไลน์

เรียกว่าเป็นแบบนี้:

33 100 108 114 111 87 32 111 108 108 101 72 f

2

Java, 42

int f(char[]c){return c[c.length-1]-c[0];}

Ungolfed:

  int f(char[] c) {
    return c[c.length - 1] - c[0];
  }

คำอธิบาย:

สิ่งนี้ใช้หลักการเดียวกับการเหลื่อม:

sum =
  c[4] - c[3]
+        c[3] - c[2]
+               c[2] - c[1]
+                      c[1] - c[0]
= c[4]                      - c[0]

โดยทั่วไปสำหรับลำดับของอักขระที่มีความยาวnคำตอบนั้นเป็นc[n-1] - c[0]เพราะเนื้อหาทั้งหมดที่อยู่ตรงกลางถูกยกเลิก



1

RProgN , 142 ไบต์, ไม่ใช่การแข่งขัน

function tostack 'b' asoc stack 'a' asoc 0 'v' asoc b pop byte 'o' asoc b len while [ v o b pop byte ] 'o' asoc - + 'v' asoc b len end [ v end

ไม่ใช่การแข่งขันเนื่องจากคำสั่ง 'tostack' ถูกเพิ่มเข้ามาหลังจากการค้นพบความท้าทายนี้ (แม้ว่าจะมีจำนวนไบต์ที่แย่มาก)

กรณีทดสอบ

Hello, World!
-39

Cool, huh?
-4

คำอธิบาย

function                        # Push the function between this and end to the stack
    tostack 'b' asoc            # Convert the implicit input to a stack, associate it with 'b'
    0 'v' asoc                  # Push 0 to the stack, associate it with 'v'
    b pop byte 'o' asoc         # Pop the top value of b (The end of the input), get the byte value, associate it with 'o'.
    b len                       # Push the size of b to the stack
    while [                     # While the top of the stack is truthy, pop the top of the stack
        v                       # Push v to the stack
            o                   # Push o to the stack
            b pop byte          # Pop the top value of b, push the byte value of that to the stack
            ] 'o' asoc          # Push a copy of the top of the stack, associate it with 'o'
            -                   # Subtract the top of the stack from one underneith that, In this case, the old value of o and the byte.
        +                       # Sum the top of the stack and underneith that, that is, the difference of the old value and new, and the total value
        'v' asoc                # Associate it with 'v'
        b len                   # Push the size of b to the stack (which acts as the conditional for the next itteration)
    end [                       # Pop the top of the stack, which will likely be the left over size of b
    v                           # Push the value of v to the top of the stack
end                             # Implicitely returned / printed

RProgN เป็นภาษาที่ลึกลับที่ฉันเคยทำเกี่ยวกับ Reverse Polish Notation ตอนนี้มันค่อนข้างละเอียดด้วยการกำหนดตัวแปรเป็น 4 ตัวอักษรและอย่างไรก็ตามฉันวางแผนที่จะเพิ่มน้ำตาล syntatic ในอนาคต

นอกจากนี้ RProgN เข้าถึงอาร์กิวเมนต์จากสแต็กโดยปริยายและส่งคืนในลักษณะเดียวกัน ข้อมูลสตริงใด ๆ ที่เหลืออยู่ในสแต็กหลังจากโปรแกรมเสร็จสิ้นจะถูกพิมพ์โดยปริยาย


"น้ำตาลนิดหน่อย" เปลี่ยนรูปแบบจริงๆในไม่กี่เดือนนี้ ตอนนี้สิ่งทั้งหมดนี้เป็นสิ่ง~{bid☼[+ที่น่ารัก
ATaco

1

PHP, 36 ไบต์

<?=ord(strrev($s=$argv[1]))-ord($s);
  • อักขระทุกตัวยกเว้นตัวแรกและตัวสุดท้ายจะถูกเพิ่มและย่อท้ายแต่ละตัว
    →ผลรวมของความแตกต่าง == ความแตกต่างระหว่างตัวอักษรตัวแรกและตัวสุดท้าย
  • ord()ใน PHP ทำงานกับตัวอักษรตัวแรกของสตริง
    →ไม่จำเป็นต้องลดลงอย่างชัดเจนเป็นตัวเดียว

1

Brain-Flak , 34 32 + 3 = 35 ไบต์

+3 เนื่องจาก-aธงจำเป็นสำหรับโหมด ascii

ลองออนไลน์

(([][()]){[{}{}]({})([][()])}<>)

น่าแปลกที่มีประสิทธิภาพมากกว่าในการใช้คำจำกัดความที่ใช้จริงในสเป็คมากกว่า "เคล็ดลับ" ของการลบครั้งแรกจากครั้งสุดท้าย

งานนี้ทำโดยการทำเช่นนั้น

(                           )  Push
 ([][()]){[{}]...([][()])}     While the stack has more than one item
  [{}]({})                     Subtract the top from a copy of the second
                          <>   Switch

1

CJam , 8 5 ไบต์

ขอขอบคุณเดนนิสสำหรับคำแนะนำสองข้อที่ลบ 3 ไบต์

l)\c-

ลองออนไลน์!

คำอธิบาย

คำนวณค่าสุดท้ายลบด้วยค่าแรก

l        e# Read line as a string
 )       e# Push original string except last char, then last char
  \      e# Swap
   c     e# Convert to char: gives the first element of the string
    -    e# Subtract. Implicitly display

ถ้าคุณใช้)แทนคุณไม่จำเป็นต้องW= _นอกจากนี้ยังเป็นทางลัดสำหรับc 0=
เดนนิส

@ เดนนิสขอบคุณมาก!
Luis Mendo

1

Haskell, 36 ไบต์

sum.(tail>>=zipWith(-)).map fromEnum

การใช้งาน:

Prelude> (sum.(tail>>=zipWith(-)).map fromEnum)"Hello World!"
-39


Haskell (แลมบ์บ็อต), 31 ไบต์

sum.(tail>>=zipWith(-)).map ord

ฉันกลัวว่านี่ไม่ใช่ฟังก์ชั่นที่เหมาะสม มันเป็นเพียงตัวอย่าง sum.(tail>>=zipWith(-)).map fromEnumตัวอย่างเช่นฟังก์ชั่น
nimi

@nimi คำถามไม่ได้ขอฟังก์ชั่นที่เหมาะสม
BlackCap

คำถามที่ถามเพื่ออะไรเพื่อเริ่มต้นกระโดดในซึ่งเป็นโปรแกรมเต็มหรือฟังก์ชั่น แต่ไม่ได้เกร็ดเล็กเกร็ดน้อย
nimi

1

Zsh , 22 ไบต์

c=${1[-1]}
<<<$[#1-#c]

ลองออนไลน์!

ในโหมดการคำนวณได้รับรหัสอักขระของตัวละครครั้งแรกใน#name nameเราตั้งค่าcเป็นอักขระตัวสุดท้ายและรับผลต่างระหว่างรหัสตัวแรกและตัวสุดท้าย




0

Java 7, 100 96 ไบต์

int c(String s){char[]a=s.toCharArray();int r=0,i=a.length-1;for(;i>0;r+=a[i]-a[--i]);return r;}

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

class M{
  static int c(String s){
    char[] a = s.toCharArray();
    int r = 0,
        i = a.length-1;
    for(; i > 0; r += a[i] - a[--i]);
    return r;
  }

  public static void main(String[] a){
    System.out.println(c("Hello World!"));
  }
}

เอาท์พุท: -39


0

Clojure 31 ไบต์

#(-(int(last %))(int(first %)))

มีคนลดงานให้เป็นการดำเนินการเดียวแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.