線形探索(linearSearch)を10種類の言語で書いてみた

前回hello worldを12の言語で書いた。その続編として、少し難易度を上げてlinearSearch(線形探索)を書いてみた。

何故書くか?は前回書いたので、以下、即本題。

以下は簡単な仕様。

各言語間のListオブジェクトや、ビルトインの配列操作ヘルパーの違いも気になるけれども、今は基本的な構文の違い等の方が興味があるので、そっちを優先した。

実行環境は前回と同じく、coding groundを使用。

JavaScript

function linearSerch(arr, target) {
    for(var i = 0, len = arr.length; i < len; i++) {
        if(arr[i] === target){
            return i;
        }
    }
    return -1;
}

console.log(linearSerch([104, 865, 413, 541, 304, 354, 165, 150], 304));

PHP

function linearSearch($arr, $target) {
    for ($i = 0, $len = count($arr); $i <= $len; $i++) {
        if ($arr[$i] == $target) {
            return $i;
        }
    }
    return -1;
}

echo linearSearch([104, 865, 413, 541, 304, 354, 165, 150], 304);

Perl

use strict;
use warnings;

my @arr = (104, 865, 413, 541, 304, 354, 165, 150);
my $result = &linearSearch(\@arr, 304);
if ($result) {
    print($result);
} else {
    print('見つかりませんでした');
}
sub linearSearch {
    my ($arr, $target) = @_;
    for (my $i = 0; $i < @arr; $i++) {
        if ($arr[$i] == $target) {
            return $i;
        }
    }
    return -1;
}

Python

def linearSearch(arr, target):
    for (i, j) in enumerate(arr):
        if j == target:
            return i
    return -1

print(linearSearch([104, 865, 413, 541, 304, 354, 165, 150], 304))

Ruby

def linearSearch(arr, target)
    for i,j in arr
        if j == target
            return j
        end
    end
    return -1
end

print linearSearch([104, 865, 413, 541, 304, 354, 165, 150], 304)

Go

package main

import "fmt"

func main() {
    fmt.Println(linearSearch([]int{104, 865, 413, 541, 304, 354, 165, 150}, 304));
}

func linearSearch(arr []int, target int) int {
    for i, _ := range arr {
        if arr[i]  == target {
            return i;
        }
    }
    return -1;
}

Kotlin

fun main(args: Array<String>) {
    println(linearSearch(arrayOf(104, 865, 413, 541, 304, 354, 165, 150), 304));
}

fun linearSearch(arr: Array<Int>, target: Int): Int {
    for(i in arr.indices){
        if(arr[i] == target) {
            return i;
        }
    }
    return -1;
}

Swift

func linearSearch(arr: [Int], target: Int) -> Int {
    for i in 0 ..< arr.count {
        if arr[i] == target {
            return i;
        }
    }
    return -1;
}

print(linearSearch(arr: [104, 865, 413, 541, 304, 354, 165, 150], target: 304));

C#

using System.IO;
using System;

class Program
{
    static void Main()
    {
        int[] arr = { 104, 865, 413, 541, 304, 354, 165, 150 };
        Console.WriteLine(linearSearch(arr, 304));
    }

    static int linearSearch (int[] arr, int target) {
        for (int i = 0; i < arr.Length; i++) {
            if (arr[i] == target) {
                return i;
            }
        }
        return -1;
    }
}

C

#include <stdio.h>

int linearSearch(int *arr, int target)
{
    for(int i = 0; i < 8; ++i){
        if(arr[i] == target)
        {
            return i;
        }
    }
    return -1;
}

int main()
{
    int arr[] = {104, 865, 413, 541, 304, 354, 165, 150};
    printf("%d", linearSearch(arr, 304));

    return 0;
}

あとで動作を確認しようと思った時にコピペで済ませるため、実行箇所や、前処理も含めて記載しておいた。

C++はCと互換性があるので省き、Lispはトライしてみたけれど、網羅的に学習しないと書けそうにないことが判明したので書いていない(笑)

hello worldと比べて、少し世界観の差異が見えてきなあと感じる。もうちょっといろいろやってみたい気がするなあ。 bubbleSort、margeSort、quickSort、binarySearchくらいやってみよう!今無職だしね!(笑)

しかし、Lispは書けなかったけど一番興味が出た。