Menghasilkan kemiringan kumulatif string


12

Tantangan

Mengingat string seperti Hello World!, memecahnya menjadi nilai-nilai karakter: 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33.

Kemudian menghitung perbedaan antara masing-masing pasangan berturut-turut karakter: 29, 7, 0, 3, -79, 55, 24, 3, -6, -8, -67.

Akhirnya, jumlah mereka dan mencetak hasil akhir: -39.

Aturan

  • Celah standar berlaku
  • Tidak menggunakan fungsi yang dibuat sebelumnya yang melakukan tugas yang tepat ini
  • Solusi kreatif didorong
  • Selamat bersenang-senang
  • Ini ditandai sebagai , jawaban terpendek dalam byte menang tetapi tidak akan dipilih.

16
Pengamatan Dennis menunjukkan bahwa tugas ini diungkapkan dengan cara yang lebih rumit daripada yang diperlukan.
Greg Martin

Bisakah bahasa menerima input sebagai array karakter bahkan jika itu mendukung tipe string?
Poke

@ Poke maaf, harus berupa string
dkudriavtsev

@GregMartin Saya sebenarnya tidak menyadarinya sampai nanti. Tantangannya harus tetap seperti ini.
dkudriavtsev

@DJMcMayhem Baik untuk mengetahui, semua bentuk output lainnya dengan ini diizinkan.
dkudriavtsev

Jawaban:


38

Python, 29 byte

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

Jumlah perbedaan membentuk deret teleskopik, sehingga sebagian besar puncak membatalkan dan
(s 1 - s 0 ) + (s 2 - s 1 ) + ... + (s n-1 - s n-2 ) + (s n - s n-1 ) = s n - s 0 .

Jika mengambil string byte sebagai input diperbolehkan

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

akan bekerja dengan baik selama 19 byte .

Uji keduanya pada Ideone .


Apakah ini mencetak hasilnya?
dkudriavtsev

4
Dalam REPL, saya kira begitu. Bentuk keluaran yang dimaksudkan adalah nilai balik, yang merupakan salah satu metode keluaran standar kami. Jika itu tidak diizinkan, sebagian besar jawaban dalam bahasa produksi tidak valid.
Dennis

22

MATL , 2 byte

ds

Cobalah online!

Penjelasan:

ddapatkan perbedaan antara karakter berturut-turut dan sjumlah array yang dihasilkan. Kemudian, nilai di atas tumpukan dicetak secara implisit. Tidak banyak lagi yang bisa dikatakan tentang itu.

Cukup menarik, meskipun Dennis menemukan jalan pintas yang mengagumkan, menggunakannya akan jauh lebih lama di MATL.


9

Jelly , 3 byte

OIS

Cobalah online!

Ambil Ordinals karakter input string, maka Increments dari daftar itu, maka Sum dari yang daftar.


Ya, mencetak hasilnya (dan mengambil input di tempat pertama) terjadi secara implisit di Jelly.
Lynn

6

MATLAB, 16 byte

@(x)sum(diff(x))

Hal ini menciptakan fungsi anonim bernama ansyang dapat disebut seperti: ans('Hello world!').

Berikut ini adalah demo online dalam Oktaf yang membutuhkan byte tambahan +untuk secara eksplisit mengkonversi string input ke array numerik sebelum menghitung perbedaan elemen-ke-elemen.



3

Cubix , 13 byte

Cubix adalah bahasa 2 dimensi yang melilit kubus.

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

Uji secara online! Ini memetakan ke jaring kubus berikut:

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

Di mana IP (penunjuk instruksi) dimulai di kiri atas wajah paling kiri.

Bagaimana itu bekerja

Pertama, IP menyentuh cermin /yang mengarahkannya ke ibagian atas. Wajah atas adalah loop yang terus-menerus memasukkan kode-kode hingga EOF tercapai. Ketika input kosong, hasilnya i-1; IP berbelok ke kiri dari ?, memukul /sisi paling kanan dan melalui perintah berikut:

  • ; - Pop item teratas (-1).
  • # - Dorong panjang tumpukan.
  • t- Pop item teratas dan dapatkan item di indeks itu di stack. Ini menarik item bawah.
  • - - Kurangi.
  • O - Output sebagai integer.
  • /- Mengalihkan IP ke @, yang mengakhiri program.

3

C #, 22 byte

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

Kode sumber lengkap dengan test case:

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 # dengan LINQ, 17 byte

Versi yang lebih pendek, menggunakan LINQ, terima kasih kepada hstde :

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

Namun, impor tambahan diperlukan:

using System.Linq;

2
s=>s.Last()-s[0];akan hanya 17 byte
hstde

3

Ruby, 23 byte

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

Tetapkan ke variabel like f=->s{s[-1].ord-s[0].ord}dan call likef["Hello World!"]

Menggunakan pengamatan Dennis tentang seri teleskopik.


Anda tidak perlu mencetak output, hanya mengembalikannya, sehingga Anda dapat menyingkirkannya $><<.
Jordan

1
Ya, saya juga baca pertanyaannya. Untungnya, ada konsensus luas tentang definisi "output" (lihat juga: banyak jawaban di halaman ini yang mengembalikan daripada mencetak nilai). Tapi hei, ini kodemu.
Jordan

2

reticular, 12 byte

idVc~@qVc-o;

Cobalah online!

Menggunakan pengamatan Dennis , kita dapat mempersingkat proses berulang menjadi lebih sederhana.

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 byte

48 byte kode ditambah tiga byte untuk -aflag, yang memungkinkan input ASCII (tetapi output desimal. Seberapa nyaman.: D)

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

Cobalah online!

Yang ini sedikit menggigit lebih keras dari jawaban saya yang lain, haha. Mari kita berjalan melewatinya.

{           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 byte

@c$)@[-

Cobalah online!

Penjelasan

@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

Karena kurangi hanya berfungsi untuk input dua bilangan bulat, itu akan berhasil setelah awalan yang dipilih [33, 72].



2

R, 69 43 32 byte

Jawaban yang sangat tidak bersaing meskipun saya pikir akan menyenangkan untuk menampilkan solusi yang mungkin di R.

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

Satu-satunya aspek yang menarik dari jawaban ini adalah penggunaan sapplydan charToRaw. Pertama-tama saya membagi string menjadi vektor karakter yang ingin saya konversi menjadi representasi integer ASCII-nya. The charToRawfungsi tidak Vectorized di R dan bukan perulangan lebih setiap nilai dalam tersebut saya gunakan vektor sapplyyang efektif vectorizes fungsi. Selanjutnya ambil perbedaan pertama dan jumlahkan.


Sunting: Ternyata charToRawmengubah string menjadi vektor di mana setiap elemen adalah representasi mentah dari setiap karakter, karenanya tidak perlu menggunakan strsplitdansapply

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

Sunting2: Ternyata ada cara yang lebih baik lagi, fungsinya utf8ToInt(x)melakukan persis apa strtoi(charToRaw(x),16)artinya kita dapat menyimpan beberapa byte lagi (Ide diambil dari jawaban @ rturnbull untuk pertanyaan lain):

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

2

Perl, 19 byte

Termasuk +1 untuk -p

Berikan masukan pada STDIN tanpa garis akhir final

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

slope.pl:

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

Jika Anda yakin string input memiliki setidaknya 2 karakter, versi 17 byte ini juga berfungsi:

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

2

NodeJS, 82 byte

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

Penjelasan:

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 byte

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}

Ide yang sama seperti di atas dengan input fungsi, bukan argumen.


Maaf, tetapi Anda tidak dapat berasumsi xsebagai input. Anda harus benar-benar mendapatkan input.
Rɪᴋᴇʀ

Apakah itu bekerja seperti ini?
Alexis_A

Ya, itu sangat bagus!
Rɪᴋᴇʀ

1
Cara lain yang dapat diterima untuk mendapatkan input adalah membuat fungsi. Misalnya f=x=>{...;return t}untuk menyimpan 2 byte;)
joeytwiddle

2

JavaScript ES6, 42 39 Bytes

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

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

Menggunakan observasi @ Dennis tentang jumlah teleskop.

Saya pikir dalam hal ini solusi sepele adalah yang terpendek.

Disimpan 3 byte dengan menghilangkan charCodeAtpengulangan seperti yang disarankan oleh @Neil.


Yang terbaik yang bisa saya lakukan adalah s=>s.slice(-1).charCodeAt()-s.charCodeAt()yang ternyata memiliki panjang yang sama.
Neil

Sebenarnya charCodeAtcukup panjang, mungkin ada cara untuk menghemat byte dengan menghindari pengulangan.
Neil

@ Neil Terima kasih atas sarannya, yang menyelamatkan saya 3 byte.
Lmis

Pendekatan yang sedikit rekursif adalah beberapa byte lebih lama:f=s=>(s[1]?-f(s.slice(-1)):0)-s.charCodeAt()
ETHproduksi

2

Keempat, 28 byte

: f depth 1- roll swap - . ;

Mengambil daftar karakter pada stack (Metode standar Forth untuk mengambil parameter.) Karakter diambil sedemikian rupa sehingga bagian atas stack adalah karakter pertama dari string. Saya memindahkan bagian bawah tumpukan ke atas, bertukar, lalu kurangi dan cetak. Sampah ditinggalkan di tumpukan, dan hasilnya dicetak ke stdout.

Jika setiap karakter didorong ke tumpukan agar bukan urutan terbalik, program akan lebih pendek 2 byte. Namun, tidak yakin apakah itu diizinkan, karena biasanya Anda mendorong argumen dengan urutan terbalik.

Cobalah online

Disebut seperti ini:

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

2

Jawa, 42

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

Tidak Disatukan:

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

Penjelasan:

Ini menggunakan prinsip yang sama dengan telescoping:

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

Generalisasi untuk setiap urutan karakter dengan panjang n, jawabannya adalah c[n-1] - c[0]karena semua hal di tengah dibatalkan.


2

PHP 7.1, 33 31 byte

Menggunakan offset string negatif yang diterapkan dalam PHP 7.1.

echo ord($argn[-1])-ord($argn);

Jalankan seperti ini:

echo 'Hello World!' | php -nR 'echo ord($argn[-1])-ord($argn);';echo

Tweaks

  • Disimpan 2 byte dengan menggunakan $argn

1

RProgN , 142 Bytes, Tidak bersaing

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

Non-bersaing, karena perintah 'tostack' ditambahkan setelah penemuan tantangan ini (meskipun memiliki jumlah byte yang mengerikan)

Uji Kasus

Hello, World!
-39

Cool, huh?
-4

Penjelasan

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 adalah bahasa esoterik yang telah saya kerjakan dengan Notasi Polandia Terbalik dalam pikiran. Saat ini cukup verbose, dengan penugasan variabel menjadi 4 karakter, dan semacamnya, namun saya berencana di masa depan menambahkan sedikit gula sintaksis.

Juga, RProgN secara implisit mengakses argumen dari stack, dan mengembalikannya dengan cara yang sama. Setiap data string yang tersisa di tumpukan setelah program selesai, dicetak secara implisit.


"Sedikit Gula" benar-benar berubah bentuk dalam beberapa bulan ini. Semua ini sekarang ~{bid☼[+dan itu sedikit menggemaskan.
ATaco

1

PHP, 36 byte

<?=ord(strrev($s=$argv[1]))-ord($s);
  • Setiap karakter kecuali yang pertama dan yang terakhir ditambahkan dan dikurangi masing-masing satu kali.
    → jumlah perbedaan == perbedaan antara karakter pertama dan terakhir
  • ord()di PHP beroperasi pada karakter pertama dari string
    → tidak perlu menguranginya secara eksplisit menjadi satu karakter

1

Brain-Flak , 34 32 + 3 = 35 byte

+3 karena -aflag diperlukan untuk mode ascii.

Cobalah online

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

Anehnya lebih efisien menggunakan definisi yang digunakan dalam spesifikasi daripada "trik" pengurangan pertama dari yang terakhir.

Ini berfungsi dengan melakukan hal itu.

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

1

CJam , 8 5 byte

Terima kasih banyak untuk Dennis untuk dua saran yang menghapus 3 byte

l)\c-

Cobalah online!

Penjelasan

Menghitung nilai terakhir dikurangi nilai pertama.

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

Jika Anda menggunakan )alih-alih W=, Anda tidak perlu _. Juga, csebagai jalan pintas untuk 0=.
Dennis

@Dennis Terima kasih banyak!
Luis Mendo

1

Haskell, 36 byte

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

pemakaian:

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


Haskell (Lambdabot), 31 byte

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

Saya khawatir ini bukan fungsi yang tepat. Itu hanya cuplikan. sum.(tail>>=zipWith(-)).map fromEnummisalnya adalah fungsi.
nimi

@nimi Pertanyaannya tidak menanyakan fungsi yang tepat
BlackCap

Pertanyaan itu tidak meminta apa pun, jadi defaultnya masuk, yang merupakan program atau fungsi lengkap, tetapi bukan cuplikan .
nimi

1

Zsh , 22 byte

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

Cobalah online!

Dalam mode aritmatika, #namedapatkan kode karakter dari karakter pertama di name. Kami menetapkan cke karakter terakhir, dan mengambil perbedaan antara kode pertama dan terakhir.



0

Haskell, 61 byte

import Data.Char
f s=sum$g$ord<$>s
g(a:b:r)=b-a:g(b:r)
g _=[]

0

Java 7, 100 96 byte

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;}

Tidak digabungkan & kode uji:

Coba di sini.

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!"));
  }
}

Keluaran: -39


0

Clojure, 31 byte

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

Seseorang telah mengurangi tugas menjadi satu operasi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.