ひねりを加えたハローワールド


17

あなたの目標:「Hello、world!」の古典的な結果をもたらすコードを書くこと STDOUTまたは同等のものに出力されます。

ルール:コードは完全に印刷ASCIIでなければなりません。すべてのコードは機能する必要があります-単一のカウント文字を削除すると、結果が変更されるか、コードが機能しなくなる必要があります。すべての変数は、割り当て後に使用する必要があります。出力には文字および文字列リテラルが必要です-つまり、文字リテラルまたは文字列リテラル内の文字を別の文字に置き換えると、結果を変更できる必要があります(エスケープシーケンスの効果ではなく、文字をバックスラッシュに置き換える必要があります)または同等)

(注:最終ルールは編集されました)

得点:ここが面白いところです。典型的なコードボウリング規則に従って、文字数によって決定される最高スコアが勝ちます。ただし、文字を繰り返し使用すると、ポイントが減点されます。具体的には...

  1. 英数字(az、AZ、0-9)を繰り返し使用すると、繰り返しごとに3ポイント減点されます(最初の使用では減点されません)。
  2. 基本的な句読点([!?.-、 ": ';])を繰り返し使用すると、括弧を含めて、繰り返しごとに2ポイントが差し引かれます。
  3. 他のASCII文字{`〜@#$%^&* _ + = | \ /> <}を繰り返し使用すると、中括弧を含めて、繰り返しごとに4ポイントが差し引かれます。
  4. スペース、タブ、改行を繰り返し使用すると、繰り返しごとに1ポイント減点されます。つまり、スペース、タブ、または改行の最初の使用のみが合計にカウントされます。

注:コメントは、コメントの開始/終了を示す文字はカウントしますが、合計にはカウントされません。たとえば、C / C ++では、がある場合/* This is a comment */、2つのスラッシュと2つのアスタリスクがカウントされますが、それらの間は何もカウントされません。

いくつかの(注:サンプル言語としてJuliaを使用)...

print("Hello, world!");

表示可能な文字の合計:22
スペースが含まれています:+1
英数字の繰り返し:llorの場合-12
句読点の繰り返し:-2の場合 "
最終スコア:22 + 1-12-2 = 9

print("Hel",char(108),"o, wor",0x108,"d!"); # 0x108 makes a Uint8 that prints as ASCII

合計文字数:43(コメント文字である#の後の文字は数えません)
スペースを含む:+1
繰り返し英数字:-18 rr1008の
繰り返し句読点:-24の() "" "" ",,,,,
Finalスコア:43 + 1-24-18 = 2

xy=STDOUT
m="Hello, world!"
print(xy,m);

表示可能な文字の合計:37
改行を含む:+1
スペースを含む:+1
繰り返し英数字:-18キシラーの
繰り返し繰り返し句読点:-4の「」、
その他のASCIIの繰り返し:-4の=
最終スコア:37 + 1 + 1-18-4 -4 = 13

いくつかの無効なコード...

x=2;print("Hello,world!")  

問題:xは割り当てられていますが、使用されていません。

print("Hello,"*" world!")  

問題:*不要です。結果はそれなしでも同じです。

k=1
if k>0
  print("Hello, world!")
else
  print("abcghjmquvxyzABCDEFGIJKLMNOPQRSTUVWXYZ_+*-&|")
end  

問題:2番目のprintコマンドは実行されません。また、2番目のprintコマンドで引用符内の文字を削除しても、出力は変更されません。

x="Hello, world!";
print(x)  

問題:改行を削除しても結果が変更されたりエラーが発生したりすることはありません(Juliaでは、複数のコマンドが同じ行にある場合にのみセミコロンが必要です。

print("Hellos\b, world!")  

問題:s文字は結果に影響しません\b。これは、コード("Hello",char(100),"\b, world!")を介して行われる場合は許容されますが、文字列リテラルまたは文字リテラルを介して行うことはできません。

便利なスコア計算 - http://jsfiddle.net/4t7qG/2/ -ドアノブに感謝



1
これはあなたの議論に関連しているようですmeta.codegolf.stackexchange.com/questions/777/…-
マーティンエンダー

3
コードを配置できるJSFiddleを作成すると、スコアが自動的に計算されます。投稿へのリンクを編集しても大丈夫ですか?
ドアノブ

1
@Dennis-コマンドが原因でプログラムが改行を生成する場合、問題はありません(たとえば、Juliaのprintlnが印刷し、最後に改行を追加します)。しかし、文字列の一部であってはなりません。
グレンO 14年

1
@ACarter-基本的にははい。しかし、制限と控除により、それは重要です。
グレンO 14年

回答:


17

Perl-96

(理論上の最大97スコアを考えると、かなり良い)

s{}[Hel0o, w3$=d!];y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(
    6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)+print

(2行目は実際の\tタブ文字で始まることに注意してください)

コードの長さは98文字で、すべてのASCII文字が1回だけ追加され-ます。
98-2 = 96

ここには文字列リテラルはありませんが単一の文字を削除するとプログラムが中断します。

難読化解除

このプログラムには3つのステートメントがあります(実際には2つですが+、ある種のステートメントセパレーターとして悪用しました)

  1. s{}[Hel0o, w3$=d!]
    これは、sed演算子の非常に拡張されたケースです。より一般的にはs/a/b/、またはとして書かれてs:a:b:いますが、perlはここでさらにファンタジーを可能にします:s(a)(b) s(a)^b^ s(a)[b]、さらにはs qaqbq
    空の文字列(inside {})をHel0o w360d!(inside [])に置き換えます(デフォルトで$=補間し60ます)。~=演算子がないため、で動作し$_ます。

  2. y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)
    これも非常に引き延ばされたケースですが、tr演算子yy< >( ))とも呼ばれます。
    置換テーブルを見てみましょう
    " # %&'*.124578:?@BCDEFGIJKLMNOQ /-9
    \n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cA k-u
    。既存の文字列が壊れないように、いくつかの文字を移動しました。ここで実際に機能する部分は/-9->のみk-uです。、with 、およびwith に置き換え0られます。 再び、演算子がないために動作します。変数に 完全なフレーズがあります。l3o6r
    ~=$_
    $_

  3. print
    引数がないと、$_変数のみが出力されます。


私はこれについてコメントするのに十分なPerlを知らない-<と+の間の文字セットは何をしているのか?
グレンO 14年

@GlenOのみ/-9k-u、実際に文字列の変換に使用されます。残りは同じサイズのゴミです。文字を1つだけ削除すると、セットが不整列になり、プログラムは「Hello、world!」を出力しません。もう。
mniip 14年

その場合、「ゴミ」はどのように実行されますか?つまり、どのように機能しますか?コードによってジャンプされるのが単なるフィラーである場合、条件内の非実行コードと同等です。
グレンO 14年

3
@GlenOそうではありません。仕様に合わせて<...> removal of any single counting character must change the result or cause the code to not function.、1文字を削除するとどこでも破損します。2文字を削除することで機能させることができますが、これはルールには含まれていません。
mniip 14年

2
All code must be functional。少なくともルールを明確に曲げています。「規則に違反している」と言っているわけではありませんが、間違いなく疑問です。
グレンO 14年

7

この回答は、文字列リテラルに関するルールを追加する前に作成されたものであり、コンテストには参加しません。

#include <iostream>
int main(){std::cout<<56+"  !$%^&*?12347890-_QWERTYUIOPASDFGJKLZXVBNM,.qypfghjk:zvbHel\x6Co, world!";}

それは完全に合法です。:Pその文字列から文字を削除すると、印刷されますello, world!


回答にコードのスコアを含めてください。
ProgramFOX 14年

また、スコアは変更されませんが、周囲のスペースを<<削除する必要があります。
マーティンエンダー14年

1
うーん...私はあなたの答えを称賛しますが、主に私の制限に小さな穴があることを明らかにしました。私はあなたに賛成票を投じるつもりです、そして、彼らがそれを好きなら他の人が同じことをするのはうれしいです、しかし、私は追加の制限で編集します。
グレンO 14年

1
OK、以前のコメントに加えて、文字列リテラルと文字リテラルが関連する必要があるという制限を追加しました-それらの中の文字の置換は結果を変更できなければなりません。これによりif 'x'>'w'テクニックが可能になりますが、たとえば「k \ bH」をブロックして「H」を生成します。追加された制限に続いて、2番目の回答を自由に投稿してください。
グレンO 14年

4

CJam、94

{'H"EJO, WoRLD!"el96A+c/~_-3=0$@}"# 
`&^<>|;:?.()[]\1aBCdfFgGhiIjkKmMnNpPqQrsStTuUvVwxXyYzZ"254b87%*

オンラインでお試しください!改行の直前にタブレータがあるはずです。SEはタブレータを好まないため、手動で挿入する必要があります。

  • 100文字の長さ
  • 繰り返されるalnum:-0()
  • 句読点の繰り返し:-6( "" ")
  • 他の繰り返し:-0()
  • 繰り返される空白:-0()

合計スコア:94

次のコードを使用して、文字列内の文字が削除できないことを確認しました。

"#  
`&^<>|;:?.()[]\1aBCdfFgGhiIjkKmMnNpPqQrsStTuUvVwxXyYzZ"
:A,,{_A\<A@)>+254b87%}%`

Hello、world!の回数を示す配列を出力します。インデックスに対応する文字が削除された場合、印刷されます。


リンクで実行すると、「Hello、world!」が生成されます。連続して6回。また、文字列は何をしていますか?
グレンO 14年

改行は間違いであると推測しています。改行を削除すると機能します。
グレンO 14年

コピーアンドペーストの問題。LFの直前にタブレータが必要です。SEは私にそれをさせないように見えます...文字列はbase-254番号(254b)と見なされます。最終結果のモジュラス7は1である必要があるため、前のコードブロックが1回実行されます。各キャラクターを必要とするモジュラスが必要です。
デニス14年

まあ、削除、(「修正」コードしている)欠落しているタブに追加した後ZT結果を変更しない、またはおそらく他のいくつかの文字が。
グレンO 14年

私はあなたの質問の一部を恐ろしく誤解していました。現在修正されています。
デニス14年

3

ルビー、28 41

質問の精神に基づいた解決策から答えを始めましょう:

print"He#{?l*2}o, "+'world!'if[$`&(9<=>6)^7|~8-5/3.1%0x4]

得点(私はこれが正しいと思う):

  • 57文字の長さ
  • 繰り返し数:-12(orli
  • 句読点の繰り返し:-4("'
  • 他の繰り返し:-0
  • 繰り返される空白:-0

得点的には、私には問題ありません。適用されない罰則を含める必要はありませんが、それらを含めても害はありません。
グレンO 14年

.中には、3.1問題なく除去することができます。xin 0x4またはin ができるよう-8-5

3

PHP、1(はい、1ポイント!)

バイナリ形式で「Hell」、「o、w」、「orld」、および「!」と一致するチェックサムを生成するためのマジックキャラクターの使用。

通常、抜け穴を見つけるのが好きですが、今回はコンテストの精神と意図によってプレイすることにしました。すべてのキャラクターとその位置は、出力に不可欠です。あなたは置き換えることができます唯一の場所はリテラル値ではありません変数名、間に空白あるphpとの同等として扱い、そして使用VS いる同様の扱いなど。foreachPHP'"PHP

<?php foreach(array('_MC:`~+V4@SbHR/l[J','dN#UB`5!Rv^NG@D}','9gm6L&-kuD','8OM97g.q]XQ0')as$j)print(hash("crc32",$j,1))?>

参考までに、これらは興味のある他の魔法の文字列とハッシュです:

E.D}S:  Hell
9UDIRQ: Hell
N\7&*`%:    orld
UWX[E^O:    orld
mAHzDEb:    !   
uLJ7Ck&:    Hell
B+bG5mYJ:   Hell
:OvMzuOR:   !   
TgYR9g!6k:  o, w
NkFN`!8mI:  o, w
N#VA\j~}J[: Hell
vEl*]@0XQ5: o, w
9gm6L&-kuD: orld
*}{Xg@HN`\: !   
Pj@Y44uA6YJ:    Hell
|7OX0VF8gv}:    !   
DLRJAjgMj}\:    !   
!0bT*D}O4Lw:    orld
YGN97^v7ZY`:    Hell
++~bL/kP:|]W:   o, w
8OM97g.q]XQ0:   !   
l^m-DqZ^g[&+:   !   
Ewu]Rv~*DHQ7:   Hell
JIqjgF|S!\`8l:  Hell
b4l!MEG7vTu6/:  Hell
+B:zEq*J\k-Cm:  !   
_}E7wZD76^`Y9AU:    orld
q:Nq-~+_S7~N9Hz:    !   

、、、またはスペースを削除しても\t、コードは機能\nします。PHPの専門家ではありませんが、;同様にオプションのようです。
mniip

@mniip-編集済み。セミコロンが場合によってはオプションであることを知りませんでした。

3

Befunge-98、97ポイント!

"v!dlrow ,h
B[CDEFGIJkLMNOPH
$<QRSTUV@|5cg1fe':-%\64*ab+7_/89}{0  j2
WXYZK`.=#>]
s()impq	n 3~
Atuxz&;y^ ?

オンラインでお試しください!

タブはとの間にqありますn

前のBefungeの回答と同様のトリックを使用して、残りの文字で行を埋めますが、実行セクションで重複文字を使用することは避けます。非実行文字を削除すると、実行部分が不適切になり、通常は無限ループに陥ったり、間違った出力が出力されたりします。

使い方

実際には、実行部分は次のようになります。

"v!dlrow ,h
         k     H
$<      @|5cg1fe':-%\64*ab+7
         >]
        ^ ?

まず、ラップ文字列リテラルを使用, world!してスタックに追加します。これにより、2が回避され"ます。

$<      @|5cg1fe':-%\64*ab+7

これによりHello、さまざまな方法を使用してスタックが追加され、文字の重複が回避されます。$折り返し文字列リテラルによって生じた余分なスペースをポップします。

7+h、文字列リテラルの末尾から7を追加してを作成しo ます。 ba*46\%:111のASCII値を計算し、lそれを複製します。

'e eをスタックに追加します。

f1g 1,15でキャラクターを取得します H

次に,、文字列内のを再利用して、全体を出力しHello, world!ます。残りは、エンディングにナビゲートするための方向変更@です。


1

ルビー、78

より多くのルールが悪用されると、パッチが何であるか正確にはわからないように感じます。長い文字列を取得し、結果の合計をチェックするため、削除または変更を行うとプログラムが失敗します。おそらく、いくつかの文字の重複を削除し、そこに空白を入れるために少し最適化できます。

puts('Hello, world!')if%["\#$&*+-/:;<>?@ABCDEFGIJKLMNOPQRSTUVWXYZ^_`abcghjknqvxyz{|}~123].sum==4980

3
問題は、以降のすべてをif削除できることです。
seequ 14年

@TheRare- if実際に機能し、その後もルールに従うものである限り、何も問題はありません。
グレンO 14年

@GlenOしかし、それは「リムーバブルコード」としてカウントされませんか?ただ、puts('Hello, world!')働くだろう。これが合法である場合、ルールを明確にする必要があると思います。
seequ 14年

@TheRare-後知恵では、おそらく「コードのサブセットは同じ出力を生成することはできません」という抜本的な方法を使用すべきでしたが、規則を変更し続けるべきではないと思います。コードが機能的であり、任意ではなく、他の規則に従っている限り、それは正当なものです。少なくとも、この解決方法はほとんどの言語では達成できません(私が行った編集は、ほとんどの言語で機能する抜け穴を閉じました)。
グレンO 14年

@GlenOあなたは裁判官です。不要だと思われる場合は、これらのコメントを削除してください。
seequ 14年

1

PHP、2257

抜け穴:バックスラッシュは仕様とスコア計算から省略されました!

このコードは、各文字列のバックスラッシュの出現回数をカウントし、ASCIIに相当するものを出力します。バックスラッシュを別の文字に置き換えるか、バックスラッシュを削除すると、解析エラーが発生するか、結果が変更されます。

バックスラッシュに関するきちんとした機能は、エスケープPHPする必要があるということです。そのため、スコアは自動的に2倍になります。バックスラッシュの数を乗算することでスコアをダブル、トリプルなどにすることができますが、貪欲になりたくなかったので、入力できる範囲を超える可能性があると思います。

<?php foreach(array('\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\')as$x)print(chr(substr_count($x,"\\")))?>

それは明らかに説明のタイプミスにすぎず、抜け穴ではありません。さらに、あなたはすでにそれを知っていました。説明には「他のASCII文字」と明示的に記載されています。これを読むまでに、それを含めるように編集されています。
グレンO 14

特に、バックスラッシュは質問のソースにありましたが、エスケープシーケンスとして扱われていたことに気付いていませんでした。
グレンO 14

これはルールの変更ではなく、小さなタイプミスを修正しています。バックスラッシュはルールにあり、表示されていませんでした(これを確認するには、[編集済み]ボタンをクリックしてから、[横並びマークダウン]をクリックします)。そして、他は抜け穴を利用しておらず、彼らの言語の機能を利用しています。
グレンO 14

1

Befunge-87

"dlrow ,olleH"bk,                                                                   v
!#$%&'()*+-./0123456789:;  <=>?ABCDEFGIJKLMNOPQRSTUVWXYZ[\]^_`acfghijmnpqstuvxyz{|}~@

最初の行はすべての繰り返しのために4ポイントの価値がありますが、2行目に重複した文字はありません。このコードの唯一の文字列リテラルはでdlrow ,olleH、これは反転されて出力として出力されます。1つの文字を削除するvと、最初の行@の終わりと2番目の行の終わりが切断され、プログラムが終了しなくなります。場合はv、それ自体が削除され、その後、コードが正しい出力を印刷する無限ループに入ります。



0

Acc !! 、-138(そして、それはマイナス138です)

これは私がPPCGで得た最高のスコアではないかもしれませんが、Accでこれよりも高いスコアを得ることができるとは思いません!!

108
Write 72
Write 101
Count i while i-2 {
	Write _
}
Write _+3
Write 44
Write 32
Write 119
Write 111
Write 114
Write _
Write 100
Write 33

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.